]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Merge remote-tracking branch 'remotes/jackhumbert/master'
authorIBNobody <ibnobody@gmail.com>
Tue, 24 May 2016 22:55:46 +0000 (17:55 -0500)
committerIBNobody <ibnobody@gmail.com>
Tue, 24 May 2016 22:55:46 +0000 (17:55 -0500)
145 files changed:
BUILD_GUIDE.md
README.md
keyboard/atomic/atomic.c
keyboard/atomic/atomic.h
keyboard/atomic/keymaps/pvc/config.h
keyboard/atomic/keymaps/pvc/keymap.c
keyboard/atomic/keymaps/pvc/makefile.mk
keyboard/atreus/config.h
keyboard/ergodox_ez/Makefile
keyboard/ergodox_ez/keymaps/adnw/k_o_y/k_o_y.hex [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/adnw/k_o_y/keymap.c [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/adnw/k_o_y/readme.md [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/default_osx/keymap.c
keyboard/ergodox_ez/keymaps/erez_experimental/config_user.h [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/erez_experimental/erez_experimental.hex
keyboard/ergodox_ez/keymaps/erez_experimental/keymap.c
keyboard/ergodox_ez/keymaps/erez_experimental/makefile.mk [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/erez_experimental/readme.md
keyboard/ergodox_ez/keymaps/ordinary/keymap.c
keyboard/ergodox_ez/keymaps/ordinary/ordinary-base.png
keyboard/ergodox_ez/keymaps/ordinary/ordinary-base.txt
keyboard/ergodox_ez/keymaps/ordinary/ordinary-media.png
keyboard/ergodox_ez/keymaps/ordinary/ordinary-media.txt
keyboard/ergodox_ez/keymaps/ordinary/ordinary-special.png [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/ordinary/ordinary-special.txt [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/ordinary/ordinary-symbol.png
keyboard/ergodox_ez/keymaps/ordinary/ordinary-symbol.txt
keyboard/ergodox_ez/keymaps/ordinary/ordinary.hex
keyboard/ergodox_ez/keymaps/ordinary/readme.md
keyboard/ergodox_ez/keymaps/osx_de_experimental/keymap.c
keyboard/ergodox_ez/keymaps/osx_de_experimental/osx_de_experimental.hex [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/osx_de_experimental/osx_de_experimental_highres.png
keyboard/ergodox_ez/keymaps/osx_de_experimental/readme.md [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/townk_osx/config.h [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/townk_osx/keymap.c [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/townk_osx/makefile.mk [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/townk_osx/readme.md [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/townk_osx/townk_osx.hex [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/townk_osx/townk_osx_base.png [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/townk_osx/townk_osx_fn.png [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/townk_osx/townk_osx_keypad.png [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/twey/keymap.c
keyboard/ergodox_ez/keymaps/twey/readme.md
keyboard/ergodox_ez/keymaps/zweihander-osx/keymap.c
keyboard/gh60_rev_c/gh60.c
keyboard/gh60_rev_c/gh60.h
keyboard/planck/keymaps/alexey.c [deleted file]
keyboard/planck/keymaps/alexey/alexey.c [new file with mode: 0644]
keyboard/planck/keymaps/angerthosenear.c [deleted file]
keyboard/planck/keymaps/angerthosenear/angerthosenear.c [new file with mode: 0644]
keyboard/planck/keymaps/austin.c [deleted file]
keyboard/planck/keymaps/austin/austin.c [new file with mode: 0644]
keyboard/planck/keymaps/bone2planck.c [deleted file]
keyboard/planck/keymaps/bone2planck/bone2planck.c [new file with mode: 0644]
keyboard/planck/keymaps/brandon.c [deleted file]
keyboard/planck/keymaps/brandon/brandon.c [new file with mode: 0644]
keyboard/planck/keymaps/charlie.c [deleted file]
keyboard/planck/keymaps/charlie/charlie.c [new file with mode: 0644]
keyboard/planck/keymaps/daniel.c [deleted file]
keyboard/planck/keymaps/daniel/daniel.c [new file with mode: 0644]
keyboard/planck/keymaps/david.c [deleted file]
keyboard/planck/keymaps/david/david.c [new file with mode: 0644]
keyboard/planck/keymaps/default/keymap.c
keyboard/planck/keymaps/dzobert.c [deleted file]
keyboard/planck/keymaps/dzobert/dzobert.c [new file with mode: 0644]
keyboard/planck/keymaps/experimental/README.md [new file with mode: 0644]
keyboard/planck/keymaps/experimental/keymap.c [new file with mode: 0644]
keyboard/planck/keymaps/experimental/makefile.mk [new file with mode: 0644]
keyboard/planck/keymaps/gabriel.c [deleted file]
keyboard/planck/keymaps/gabriel/gabriel.c [new file with mode: 0644]
keyboard/planck/keymaps/jacob/Keyboard Layout.PNG [new file with mode: 0644]
keyboard/planck/keymaps/jacob/keymap.c [new file with mode: 0644]
keyboard/planck/keymaps/jacob/readme.md [new file with mode: 0644]
keyboard/planck/keymaps/joe.c [deleted file]
keyboard/planck/keymaps/joe/joe.c [new file with mode: 0644]
keyboard/planck/keymaps/kyle.c [deleted file]
keyboard/planck/keymaps/kyle/kyle.c [new file with mode: 0644]
keyboard/planck/keymaps/leo.c [deleted file]
keyboard/planck/keymaps/leo/leo.c [new file with mode: 0644]
keyboard/planck/keymaps/lucas.c [deleted file]
keyboard/planck/keymaps/lucas/lucas.c [new file with mode: 0644]
keyboard/planck/keymaps/lukas.c [deleted file]
keyboard/planck/keymaps/lukas/lukas.c [new file with mode: 0644]
keyboard/planck/keymaps/max.c [deleted file]
keyboard/planck/keymaps/max/max.c [new file with mode: 0644]
keyboard/planck/keymaps/mollat.c [deleted file]
keyboard/planck/keymaps/mollat/mollat.c [new file with mode: 0644]
keyboard/planck/keymaps/monkey.c [deleted file]
keyboard/planck/keymaps/monkey/monkey.c [new file with mode: 0644]
keyboard/planck/keymaps/nico.c [deleted file]
keyboard/planck/keymaps/nico/nico.c [new file with mode: 0644]
keyboard/planck/keymaps/numpad.c [deleted file]
keyboard/planck/keymaps/numpad/numpad.c [new file with mode: 0644]
keyboard/planck/keymaps/pete/README.md [new file with mode: 0644]
keyboard/planck/keymaps/pete/keymap.c [new file with mode: 0644]
keyboard/planck/keymaps/pete/makefile.mk [new file with mode: 0644]
keyboard/planck/keymaps/pvc/config.h
keyboard/planck/keymaps/pvc/keymap.c
keyboard/planck/keymaps/pvc/makefile.mk
keyboard/planck/keymaps/tak3over.c [deleted file]
keyboard/planck/keymaps/tak3over/tak3over.c [new file with mode: 0644]
keyboard/planck/keymaps/unicode/keymap.c [new file with mode: 0644]
keyboard/planck/keymaps/unicode/makefile.mk [new file with mode: 0644]
keyboard/planck/planck.c
keyboard/planck/planck.h
keyboard/preonic/keymaps/default/keymap.c
keyboard/preonic/preonic.c
keyboard/preonic/preonic.h
quantum/audio/audio.c
quantum/audio/audio.h
quantum/audio/audio_pwm.c [new file with mode: 0644]
quantum/audio/frequency_lut.h [deleted file]
quantum/audio/luts.c [new file with mode: 0644]
quantum/audio/luts.h [new file with mode: 0644]
quantum/audio/vibrato_lut.h [deleted file]
quantum/audio/voices.c
quantum/audio/voices.h
quantum/keymap_common.c
quantum/keymap_common.h
quantum/keymap_extras/keymap_german_ch.h [new file with mode: 0644]
quantum/keymap_midi.h
quantum/keymap_unicode.c [deleted file]
quantum/matrix.c
quantum/quantum.c [new file with mode: 0644]
quantum/quantum.h [new file with mode: 0644]
quantum/quantum.mk
quantum/template/template.c
quantum/template/template.h
quantum/tools/README.md
quantum/unicode.h [new file with mode: 0644]
tmk_core/common.mk
tmk_core/common/action.c
tmk_core/common/action.h
tmk_core/common/action_code.h
tmk_core/common/action_tapping.c
tmk_core/common/action_util.c
tmk_core/common/action_util.h
tmk_core/common/backlight.c
tmk_core/common/backlight.h
tmk_core/common/command.c
tmk_core/common/matrix.h
tmk_core/common/nodebug.h
tmk_core/doc/keymap.md
tmk_core/protocol/lufa/lufa.c
tmk_core/rules.mk

index f7a57d2fc9b028e2de43d19b0f8858d6ea0182d9..fd8b6202ff4acb45e24e33bf1278df40aa5ceb00 100644 (file)
@@ -47,8 +47,8 @@ If you have any problems building the firmware, you can try using a tool called
 
 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=<name>` after `make`. So if I've named my keymap jack.c, the full command would be `make KEYMAP=jack`.
+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, duplicate the folder `keymaps/default`, and rename it with your name, for example `jack`. 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=<name>` after `make`. So if I've named my keymap `jack`, 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=<name> dfu` to both build and deploy the firmware. If you're using a Teensy, you'll probably need to take the <keyboardname>.hex file that make produces in the keyboard's folder, and deploy it using the [Teensy Loader.](https://www.pjrc.com/teensy/loader.html)
 
 ## Helpful Tips
index bb1cca1edf409aae540c2e506395f4dae77d0ddd..4e53569a8e88c2af010464d6d9cdfd39ad0ce41a 100644 (file)
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 This is a keyboard firmware based on the [tmk_keyboard firmware](http://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR controllers, and more specifically, the [OLKB product line](http://olkb.co), the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard, and the [Clueboard product line](http://clueboard.co/).
 
-QMK is developed and maintained by Jack Humbert of OLKB with contributions from the community, and of course, TMK.
+QMK is developed and maintained by Jack Humbert of OLKB with contributions from the community, and of course, TMK. In fact, this repo used to be a fork of TMK, and we are incredibly grateful for his founding contributions to the firmware. We've had to break the fork due to purely technical reasons -- it simply became too different over time, and we've had to start refactoring some of the basic bits and pieces. We are huge fans of TMK, both the firmware and the person. :)
 
 This documentation is edited and maintained by Erez Zukerman of ErgoDox EZ. If you spot any typos or inaccuracies, please [open an issue](https://github.com/jackhumbert/qmk_firmware/issues/new).
 
@@ -33,6 +33,10 @@ If your keymap directory has a file called `makefile.mk` (note the lowercase fil
 
 So let's say your keyboard's makefile has `CONSOLE_ENABLE = yes` (or maybe doesn't even list the `CONSOLE_ENABLE` option, which would cause it to revert to the global Quantum default). You want your particular keymap to not have the debug console, so you make a file called `makefile.mk` and specify `CONSOLE_ENABLE = no`.
 
+### Customizing config.h on a per-keymap basis
+
+If you use the ErgoDox EZ, you can make a `config_user.h` file in your keymap directory and use it to override any `config.h` settings you don't like. Anything you set there will take precedence over the global `config.h` for the ErgoDox EZ. To see an example of this, check out `keymaps/erez_experimental`.
+
 ## Quick aliases to common actions
 
 Your keymap can include shortcuts to common operations (called "function actions" in tmk).
@@ -41,10 +45,13 @@ Your keymap can include shortcuts to common operations (called "function actions
 
 `MO(layer)` - momentary switch to *layer*. As soon as you let go of the key, the layer is deactivated and you pop back out to the previous layer. When you apply this to a key, that same key must be set as `KC_TRNS` on the destination layer. Otherwise, you won't make it back to the original layer when you release the key (and you'll get a keycode sent). You can only switch to layers *above* your current layer. If you're on layer 0 and you use `MO(1)`, that will switch to layer 1 just fine. But if you include `MO(3)` on layer 5, that won't do anything for you -- because layer 3 is lower than layer 5 on the stack.
 
+`OSL(layer)` - momentary switch to *layer*, as a one-shot operation. So if you have a key that's defined as `OSL(1)`, and you tap that key, then only the very next keystroke would come from layer 1. You would drop back to layer zero immediately after that one keystroke. That's handy if you have a layer full of custom shortcuts -- for example, a dedicated key for closing a window. So you tap your one-shot layer mod, then tap that magic 'close window' key, and keep typing like a boss. Layer 1 would remain active as long as you hold that key down, too (so you can use it like a momentary toggle-layer key with extra powers).
+
 `LT(layer, kc)` - momentary switch to *layer* when held, and *kc* when tapped. Like `MO()`, this only works upwards in the layer stack (`layer` must be higher than the current layer).
 
 `TG(layer)` - toggles a layer on or off. As with `MO()`, you should set this key as `KC_TRNS` in the destination layer so that tapping it again actually toggles back to the original layer. Only works upwards in the layer stack.
 
+
 ### Fun with modifier keys
 
 * `LSFT(kc)` - applies left Shift to *kc* (keycode) - `S(kc)` is an alias
@@ -80,17 +87,24 @@ The following shortcuts automatically add `LSFT()` to keycodes to get commonly u
     KC_PLUS  +
     KC_LCBR  {
     KC_RCBR  }
+    KC_LABK  <
+    KC_RABK  >
     KC_PIPE  |
     KC_COLN  :
 
+`OSM(mod)` - this is a "one shot" modifier. So let's say you have your left Shift key defined as `OSM(MOD_LSFT)`. Tap it, let go, and Shift is "on" -- but only for the next character you'll type. So to write "The", you don't need to hold down Shift -- you tap it, tap t, and move on with life. And if you hold down the left Shift key, it just works as a left Shift key, as you would expect (so you could type THE). There's also a magical, secret way to "lock" a modifier by tapping it multiple times. If you want to learn more about that, open an issue. :)
+
 `MT(mod, kc)` - is *mod* (modifier key - MOD_LCTL, MOD_LSFT) when held, and *kc* when tapped. In other words, you can have a key that sends Esc (or the letter O or whatever) when you tap it, but works as a Control key or a Shift key when you hold it down.
 
-These are the values you can use for the `mod` in `MT()` (right-hand modifiers are not available):
+These are the values you can use for the `mod` in `MT()` and `OSM()` (right-hand modifiers are not available for `MT()`):
 
   * MOD_LCTL
   * MOD_LSFT
   * MOD_LALT
   * MOD_LGUI
+  * MOD_HYPR
+  * MOD_MEH
+
 
 These can also be combined like `MOD_LCTL | MOD_LSFT` e.g. `MT(MOD_LCTL | MOD_LSFT, KC_ESC)` which would activate Control and Shift when held, and send Escape when tapped.
 
@@ -363,6 +377,55 @@ You can currently send 4 hex digits with your OS-specific modifier key (RALT for
 
 Enable the backlight from the Makefile.
 
+## Driving a speaker - audio support
+
+Your keyboard can make sounds! If you've got a Planck, Preonic, or basically any keyboard that allows access to the C6 port, you can hook up a simple speaker and have it beep. You can use those beeps to indicate layer transitions, modifiers, special keys, or just to play some funky 8bit tunes.
+
+The audio code lives in [quantum/audio/audio.h](/quantum/audio/audio.h) and in the other files in the audio directory. It's enabled by default on the Planck [stock keymap](/keyboard/planck/keymaps/default/keymap.c). Here are the important bits:
+
+```
+#include "audio.h"
+```
+
+Then, lower down the file:
+
+```
+float tone_startup[][2] = {
+    ED_NOTE(_E7 ),
+    E__NOTE(_CS7),
+    E__NOTE(_E6 ),
+    E__NOTE(_A6 ),
+    M__NOTE(_CS7, 20)
+};
+```
+
+This is how you write a song. Each of these lines is a note, so we have a little ditty composed of five notes here.
+
+Then, we have this chunk:
+
+```
+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);
+```
+
+Wherein we bind predefined songs (from [audio/song_list.h](/audio/song_list.h)) into named variables. This is one optimization that helps save on memory: These songs only take up memory when you reference them in your keymap, because they're essentially all preprocessor directives.
+
+So now you have something called `tone_plover` for example. How do you make it play the Plover tune, then? If you look further down the keymap, you'll see this:
+
+```
+PLAY_NOTE_ARRAY(tone_plover, false, 0); // Signature is: Song name, repeat, rest style
+```
+
+This is inside one of the macros. So when that macro executes, your keyboard plays that particular chime.
+
+"Rest style" in the method signature above (the last parameter) specifies if there's a rest (a moment of silence) between the notes.
+
 ## MIDI functionalty
 
 This is still a WIP, but check out `quantum/keymap_midi.c` to see what's happening. Enable from the Makefile.
index 3996497161cc2400c5ed5f5cce938a45cf47fb64..fa218a48f3125d9d5f081ca6313aed053b56cd1d 100644 (file)
@@ -2,27 +2,28 @@
 
 __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 process_action_user(keyrecord_t *record) {
-       // leave this function blank - it can be defined in a keymap file
+bool process_action_user(keyrecord_t *record) {
+    // leave this function blank - it can be defined in a keymap file
+    return true;
 }
 
 __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
+    // put your keyboard start-up code here
+    // runs once when the firmware starts up
 
     MCUCR |= (1<<JTD);
     MCUCR |= (1<<JTD);
@@ -35,31 +36,39 @@ void matrix_init_kb(void) {
     DDRE |= (1<<6);
     PORTE |= (1<<6);
 
-       matrix_init_user();
+    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();
+    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
+bool 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);
+    return process_action_user(record);
 }
 
 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
 
-       led_set_user(usb_led);
+    led_set_user(usb_led);
 }
 
 #ifdef BACKLIGHT_ENABLE
 #define CHANNEL OCR1C
+#define BREATHING_NO_HALT  0
+#define BREATHING_HALT_OFF 1
+#define BREATHING_HALT_ON  2
+
+static uint8_t breath_intensity;
+static uint8_t breath_speed;
+static uint16_t breathing_index;
+static uint8_t breathing_halt;
 
 void backlight_init_ports()
 {
@@ -67,54 +76,250 @@ void backlight_init_ports()
     // Setup PB7 as output and output low.
     DDRB |= (1<<7);
     PORTB &= ~(1<<7);
-    
-    // Use full 16-bit resolution. 
+
+    // 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();
+    breathing_defaults();
 }
 
 void backlight_set(uint8_t level)
 {
+    // Prevent backlight blink on lowest level
+    PORTB &= ~(_BV(PORTB7));
+
     if ( level == 0 )
     {
         // Turn off PWM control on PB7, revert to output low.
         TCCR1A &= ~(_BV(COM1C1));
+
+        // Set the brightness to 0
         CHANNEL = 0x0;
-        // Prevent backlight blink on lowest level
-        PORTB &= ~(_BV(PORTB7));
     }
-    else if ( level == BACKLIGHT_LEVELS )
+    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
+
+        // Set the brightness to max
         CHANNEL = 0xFFFF;
     }
-    else        
+    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));
     }
+    breathing_intensity_default();
+}
+
+
+void breathing_enable(void)
+{
+    if (get_backlight_level() == 0)
+    {
+        breathing_index = 0;
+    }
+    else
+    {
+        // Set breathing_index to be at the midpoint (brightest point)
+        breathing_index = 0x20 << breath_speed;
+    }
+
+    breathing_halt = BREATHING_NO_HALT;
+
+    // Enable breathing interrupt
+    TIMSK1 |= _BV(OCIE1A);
+}
+
+void breathing_pulse(void)
+{
+    if (get_backlight_level() == 0)
+    {
+        breathing_index = 0;
+    }
+    else
+    {
+        // Set breathing_index to be at the midpoint + 1 (brightest point)
+        breathing_index = 0x21 << breath_speed;
+    }
+
+    breathing_halt = BREATHING_HALT_ON;
+
+    // Enable breathing interrupt
+    TIMSK1 |= _BV(OCIE1A);
+}
+
+void breathing_disable(void)
+{
+    // Disable breathing interrupt
+    TIMSK1 &= ~_BV(OCIE1A);
+    backlight_set(get_backlight_level());
+}
+
+void breathing_self_disable(void)
+{
+    if (get_backlight_level() == 0)
+    {
+        breathing_halt = BREATHING_HALT_OFF;
+    }
+    else
+    {
+        breathing_halt = BREATHING_HALT_ON;
+    }
+
+    //backlight_set(get_backlight_level());
+}
+
+void breathing_toggle(void)
+{
+    if (!is_breathing())
+    {
+        if (get_backlight_level() == 0)
+        {
+            breathing_index = 0;
+        }
+        else
+        {
+            // Set breathing_index to be at the midpoint + 1 (brightest point)
+            breathing_index = 0x21 << breath_speed;
+        }
+
+        breathing_halt = BREATHING_NO_HALT;
+    }
+
+    // Toggle breathing interrupt
+    TIMSK1 ^= _BV(OCIE1A);
+
+    // Restore backlight level
+    if (!is_breathing())
+    {
+        backlight_set(get_backlight_level());
+    }
+}
+
+bool is_breathing(void)
+{
+    return (TIMSK1 && _BV(OCIE1A));
+}
+
+void breathing_intensity_default(void)
+{
+    //breath_intensity = (uint8_t)((uint16_t)100 * (uint16_t)get_backlight_level() / (uint16_t)BACKLIGHT_LEVELS);
+    breath_intensity = ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2));
+}
+
+void breathing_intensity_set(uint8_t value)
+{
+    breath_intensity = value;
+}
+
+void breathing_speed_default(void)
+{
+    breath_speed = 4;
+}
+
+void breathing_speed_set(uint8_t value)
+{
+    bool is_breathing_now = is_breathing();
+    uint8_t old_breath_speed = breath_speed;
+
+    if (is_breathing_now)
+    {
+        // Disable breathing interrupt
+        TIMSK1 &= ~_BV(OCIE1A);
+    }
+
+    breath_speed = value;
+
+    if (is_breathing_now)
+    {
+        // Adjust index to account for new speed
+        breathing_index = (( (uint8_t)( (breathing_index) >> old_breath_speed ) ) & 0x3F) << breath_speed;
+
+        // Enable breathing interrupt
+        TIMSK1 |= _BV(OCIE1A);
+    }
+
+}
+
+void breathing_speed_inc(uint8_t value)
+{
+    if ((uint16_t)(breath_speed - value) > 10 )
+    {
+        breathing_speed_set(0);
+    }
+    else
+    {
+        breathing_speed_set(breath_speed - value);
+    }
+}
+
+void breathing_speed_dec(uint8_t value)
+{
+    if ((uint16_t)(breath_speed + value) > 10 )
+    {
+        breathing_speed_set(10);
+    }
+    else
+    {
+        breathing_speed_set(breath_speed + value);
+    }
+}
+
+void breathing_defaults(void)
+{
+    breathing_intensity_default();
+    breathing_speed_default();
+    breathing_halt = BREATHING_NO_HALT;
+}
+
+/* Breathing Sleep LED brighness(PWM On period) table
+ * (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle
+ *
+ * http://www.wolframalpha.com/input/?i=%28sin%28+x%2F64*pi%29**8+*+255%2C+x%3D0+to+63
+ * (0..63).each {|x| p ((sin(x/64.0*PI)**8)*255).to_i }
+ */
+static const uint8_t breathing_table[64] PROGMEM = {
+  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   4,   6,  10,
+ 15,  23,  32,  44,  58,  74,  93, 113, 135, 157, 179, 199, 218, 233, 245, 252,
+255, 252, 245, 233, 218, 199, 179, 157, 135, 113,  93,  74,  58,  44,  32,  23,
+ 15,  10,   6,   4,   2,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+};
+
+ISR(TIMER1_COMPA_vect)
+{
+    // CHANNEL = (pgm_read_byte(&breathing_table[ ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F ] )) * breath_intensity;
+
+
+    uint8_t local_index = ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F;
+
+    if (((breathing_halt == BREATHING_HALT_ON) && (local_index == 0x20)) || ((breathing_halt == BREATHING_HALT_OFF) && (local_index == 0x3F)))
+    {
+        // Disable breathing interrupt
+        TIMSK1 &= ~_BV(OCIE1A);
+    }
+
+    CHANNEL = (uint16_t)(((uint16_t)pgm_read_byte(&breathing_table[local_index]) * 257)) >> breath_intensity;
+
 }
 
+
+
 #endif
\ No newline at end of file
index 0c7aeb1cc8be6e1a0e58bef0d887cebae749975a..456c3fbdf8df35596fc3e92db3421d06e9c4bb2e 100644 (file)
@@ -1,11 +1,7 @@
 #ifndef ATOMIC_H
 #define ATOMIC_H
 
-#include "matrix.h"
-#include "keymap_common.h"
-#ifdef BACKLIGHT_ENABLE
-    #include "backlight.h"
-#endif
+#include "quantum.h"
 #include <stddef.h>
 #include <avr/io.h>
 
 
 void matrix_init_user(void);
 void matrix_scan_user(void);
-void process_action_user(keyrecord_t *record);
+bool process_action_user(keyrecord_t *record);
 void led_set_user(uint8_t usb_led);
 void backlight_init_ports(void);
 
+void breathing_enable(void);
+void breathing_pulse(void);
+void breathing_disable(void);
+void breathing_self_disable(void);
+void breathing_toggle(void);
+bool is_breathing(void);
+
+
+void breathing_defaults(void);
+void breathing_intensity_default(void);
+void breathing_speed_default(void);
+void breathing_speed_set(uint8_t value);
+void breathing_speed_inc(uint8_t value);
+void breathing_speed_dec(uint8_t value);
+
+
 #endif
\ No newline at end of file
index cc926346463c217d624e0a8b205b74aa92fdf110..5e956286b542bce4f5db14ba3580e50fbc176088 100644 (file)
@@ -22,7 +22,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* USB Device descriptor parameter */
 #define VENDOR_ID       0xFEED
-#define PRODUCT_ID      0x6060
+#define PRODUCT_ID      0x0419
 #define DEVICE_VER      0x0001
 #define MANUFACTURER    Ortholinear Keyboards
 #define PRODUCT         The Atomic Keyboard
@@ -158,4 +158,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //#define NO_ACTION_MACRO
 //#define NO_ACTION_FUNCTION
 
+
+//#define VIBRATO_ENABLE
+//#define VIBRATO_STRENGTH_ENABLE
+
 #endif
index e17c41e23db446f0443c4ddf711a261c3d0968e6..8431654d7ded9afd45a6ab750ca43a41a39fff45 100644 (file)
@@ -8,42 +8,44 @@
     #include "song_list.h"
 #endif
 
-#define LAYER_QWERTY         0
-#define LAYER_COLEMAK        1
-#define LAYER_DVORAK         2
-#define LAYER_LOWER          3
-#define LAYER_RAISE          4
-#define LAYER_FUNCTION       5
-#define LAYER_MOUSE          6
-#define LAYER_MUSIC          7
-#define LAYER_ADJUST         8
-
-#define MACRO_QWERTY         0
-#define MACRO_COLEMAK        1
-#define MACRO_DVORAK         2
-#define MACRO_LOWER          3
-#define MACRO_RAISE          4
-#define MACRO_FUNCTION       5
-#define MACRO_MOUSE          6
-#define MACRO_TIMBRE_1       7
-#define MACRO_TIMBRE_2       8
-#define MACRO_TIMBRE_3       9
-#define MACRO_TIMBRE_4      10
-#define MACRO_TEMPO_U       11
-#define MACRO_TEMPO_D       12
-#define MACRO_TONE_DEFAULT  13
-#define MACRO_MUSIC_ON      14
-#define MACRO_MUSIC_OFF     15
-#define MACRO_AUDIO_ON      16
-#define MACRO_AUDIO_OFF     17
-#define MACRO_INC_VOICE     18
-#define MACRO_DEC_VOICE     19
+#define LAYER_QWERTY                     0
+#define LAYER_COLEMAK                    1
+#define LAYER_DVORAK                     2
+#define LAYER_UPPER                      3
+#define LAYER_LOWER                      4
+#define LAYER_FUNCTION                   5
+#define LAYER_MOUSE                      6
+#define LAYER_ADJUST                     7
+
+#define MACRO_QWERTY                     0
+#define MACRO_COLEMAK                    1
+#define MACRO_DVORAK                     2
+#define MACRO_UPPER                      3
+#define MACRO_LOWER                      4
+#define MACRO_FUNCTION                   5
+#define MACRO_MOUSE                      6
+#define MACRO_TIMBRE_1                   7
+#define MACRO_TIMBRE_2                   8
+#define MACRO_TIMBRE_3                   9
+#define MACRO_TIMBRE_4                  10
+#define MACRO_TEMPO_U                   11
+#define MACRO_TEMPO_D                   12
+#define MACRO_TONE_DEFAULT              13
+#define MACRO_MUSIC_TOGGLE              14
+#define MACRO_AUDIO_TOGGLE              16
+#define MACRO_INC_VOICE                 18
+#define MACRO_DEC_VOICE                 19
+#define MACRO_BACKLIGHT                 20
+#define MACRO_BREATH_TOGGLE             21
+#define MACRO_BREATH_SPEED_INC          23
+#define MACRO_BREATH_SPEED_DEC          24
+#define MACRO_BREATH_DEFAULT            25
 
 #define M_QWRTY             M(MACRO_QWERTY)
 #define M_COLMK             M(MACRO_COLEMAK)
 #define M_DVORK             M(MACRO_DVORAK)
+#define M_UPPER             M(MACRO_UPPER)
 #define M_LOWER             M(MACRO_LOWER)
-#define M_RAISE             M(MACRO_RAISE)
 #define M_FUNCT             M(MACRO_FUNCTION)
 #define M_MOUSE             M(MACRO_MOUSE)
 #define TIMBR_1             M(MACRO_TIMBRE_1)
 #define TMPO_UP             M(MACRO_TEMPO_U)
 #define TMPO_DN             M(MACRO_TEMPO_D)
 #define TMPO_DF             M(MACRO_TONE_DEFAULT)
+#define M_BACKL             M(MACRO_BACKLIGHT)
+#define M_BRTOG             M(MACRO_BREATH_TOGGLE)
+#define M_BSPDU             M(MACRO_BREATH_SPEED_INC)
+#define M_BSPDD             M(MACRO_BREATH_SPEED_DEC)
+#define M_BDFLT             M(MACRO_BREATH_DEFAULT)
 
 
-#define MUS_ON              M(MACRO_MUSIC_ON)
-#define MUS_OFF             M(MACRO_MUSIC_OFF)
-#define AUD_OFF             M(MACRO_AUDIO_OFF)
-#define AUD_ON              M(MACRO_AUDIO_ON)
+//#define MU_TOG             M(MACRO_MUSIC_TOGGLE)
+//#define AU_TOG              M(MACRO_AUDIO_TOGGLE)
 #define VC_UP               M(MACRO_INC_VOICE)
 #define VC_DOWN             M(MACRO_DEC_VOICE)
 
@@ -74,6 +79,7 @@
 #define SC_ACLS             LALT(KC_F4)
 #define SC_CCLS             LCTL(KC_F4)
 
+#define OS_SHFT             KC_FN0
 
 #define _______             KC_TRNS
 #define XXXXXXX             KC_NO
@@ -92,16 +98,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
  * | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | /      | XXXXXX . RSHIFT | UP     | PG DN  |
  * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
- * | LCTRL  | LWIN   | FN     | LALT   | RAISE  | XXXXXX . SPACE  | LOWER  | RALT   | RWIN   | MENU   | RCTRL  | LEFT   | DOWN   | RIGHT  |
+ * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | XXXXXX . SPACE  | LOWER  | SHIFT  | RALT   | APP    | RCTRL  | LEFT   | DOWN   | RIGHT  |
  * '--------------------------------------------------------------------------------------------------------------------------------------'
  */
 
- [LAYER_QWERTY]       = { /* QWERTY */
+ [LAYER_QWERTY]       = { // 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, 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_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,  KC_ENT,  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, KC_RSFT, KC_UP,   KC_PGDN  },
-  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC,  KC_SPC,  M_LOWER, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
+  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
  },
 
  /* COLEMAK
@@ -114,17 +120,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
  * | LSHIFT | Z      | X      | C      | V      | B      | K      | M      | ,      | .      | /      | XXXXXX . RSHIFT | UP     | PG DN  |
  * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
- * | LCTRL  | LWIN   | FN     | LALT   | RAISE  | XXXXXX . SPACE  | LOWER  | RALT   | RWIN   | MENU   | RCTRL  | LEFT   | DOWN   | RIGHT  |
+ * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | XXXXXX . SPACE  | LOWER  | SHIFT  | RALT   | APP    | RCTRL  | LEFT   | DOWN   | RIGHT  |
  * '--------------------------------------------------------------------------------------------------------------------------------------'
  */
 
- [LAYER_COLEMAK]      = { /* COLEMAK */
+ [LAYER_COLEMAK]      = { // 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_BSPC  },
   { KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL   },
   { KC_BSPC, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT, KC_ENT,  KC_ENT,  KC_PGUP  },
   { KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT, KC_UP,   KC_PGDN  },
-  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC,  KC_SPC,  M_LOWER, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
- },
+  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
+},
 
 /* DVORAK
  * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
@@ -136,36 +142,63 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
  * | LSHIFT | ;      | Q      | J      | K      | X      | B      | M      | W      | V      | Z      | XXXXXX . RSHIFT | UP     | PG DN  |
  * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
- * | LCTRL  | LWIN   | FN     | LALT   | RAISE  | XXXXXX . SPACE  | LOWER  | RALT   | RWIN   | MENU   | RCTRL  | LEFT   | DOWN   | RIGHT  |
+ * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | XXXXXX . SPACE  | LOWER  | SHIFT  | RALT   | APP    | RCTRL  | LEFT   | DOWN   | RIGHT  |
  * '--------------------------------------------------------------------------------------------------------------------------------------'
  */
 
- [LAYER_DVORAK]       = { /* DVORAK */
+ [LAYER_DVORAK]       = { // 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_BSPC  },
   { 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_BSLS, KC_DEL   },
   { 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_ENT,  KC_PGUP  },
   { 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_RSFT, KC_UP,   KC_PGDN  },
-  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC,  KC_SPC,  M_LOWER, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
+  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
  },
 
+/* UPPER
+ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
+ * | PRINT  | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | NUM LK | /      | *      | -      | NUM LK | SCR LK | XXXXXX . PAUSE  |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
+ * |        | F1     | F2     | F3     | F4     |        |        | 7      | 8      | 9      | +      | ~      |        |        | INS    |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
+ * | CAP LK | F5     | F6     | F7     | F8     |        |        | 4      | 5      | 6      | +      | `      | XXXXXX .        | HOME   |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
+ * |        | F9     | F10    | F11    | F12    |        |        | 1      | 2      | 3      | ENTER  | XXXXXX .        |        | END    |
+ * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
+ * |        |        |        |        |        | 0               |        | RALT   | .      | ENTER  |        |        |        |        |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ */
 
- [LAYER_LOWER]        = { /* 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,  ________________  },
-  { _______, _______, _______, _______, SC_CCLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS   },
-  { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME  },
-  { _______, SC_REDO, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______, KC_END   },
-  { _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______, _______, _______, _______, _______  },
+ [LAYER_UPPER]        = { // UPPER
+  { KC_PSCR, M_BRTOG, M_BSPDU, M_BSPDD, M_BDFLT, XXXXXXX, XXXXXXX, KC_NLCK, KC_PSLS, KC_PAST, XXXXXXX, XXXXXXX, KC_SLCK, KC_PAUS, KC_PAUS  },
+  { _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, _______, _______, _______, KC_INS   },
+  { KC_CAPS, KC_F5,   KC_F6,   KC_F7,   KC_F8,   XXXXXXX, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______, ________________, KC_HOME  },
+  { _______, KC_F9,   KC_F10,  KC_F11,  KC_F12,  XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, ________________, _______, KC_END   },
+  { _______, _______, _______, _______, _______, KC_KP_0, KC_KP_0, _______, KC_RALT, KC_PDOT, KC_PENT, _______, _______, _______, _______  },
  },
 
- [LAYER_RAISE]        = { /* 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,  ________________  },
-  { _______, _______, _______, _______, SC_ACLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS   },
-  { _______, SC_SELA, SC_SAVE, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME  },
-  { _______, SC_UNDO, SC_CUT,  SC_COPY, SC_PSTE, _______, _______, _______, _______, _______, _______, ________________, _______, KC_END   },
+/* LOWER
+ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
+ * |        | F1     | F2     | F3     | F4     | F5     | F6     | F7     | F8     | F9     | F10    | F11    | F12    | XXXXXX . BACKSP |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
+ * |        | $      | {      | [      | (      | %      | #      | )      | ]      | }      | @      |        |        |        | INS    |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
+ * |        | ^      | *      | +      | -      | ;      | :      | _      | '      | "      | `      |        | XXXXXX .        | HOME   |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
+ * |        | |      | &      | !      | ~      | /      | \      | =      | <      | >      | ?      | XXXXXX .        |        | END    |
+ * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
+ * |        |        |        |        |        |                 |        |        |        |        |        |        |        |        |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ */
+
+ [LAYER_LOWER]        = { // LOWER
+  { _______, 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_DLR,  KC_LCBR, KC_LBRC, KC_LPRN, KC_PERC, KC_HASH, KC_RPRN, KC_RBRC, KC_RCBR, KC_AT,   _______, _______, _______, KC_INS   },
+  { _______, KC_CIRC, KC_ASTR, KC_PPLS, KC_PMNS, KC_SCLN, KC_COLN, KC_UNDS, KC_QUOT, KC_DQT,  KC_GRV,  _______, ________________, KC_HOME  },
+  { _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SLSH, KC_BSLS, KC_EQL,  KC_LT,   KC_GT,   KC_QUES, ________________, _______, KC_END   },
   { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______  },
  },
 
- [LAYER_FUNCTION]     = { /* FUNCTION */
+ [LAYER_FUNCTION]     = { // 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,  ________________  },
   { 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_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_PSCR  },
@@ -175,7 +208,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
 #ifdef MOUSEKEY_ENABLE
 
- [LAYER_MOUSE]        = { /* MOUSE */
+ [LAYER_MOUSE]        = { // MOUSE
   { _______, KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX  },
   { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  },
   { XXXXXXX, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX, KC_WH_U  },
@@ -185,25 +218,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
 #endif
 
- [LAYER_MUSIC]        = { /* 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, ________________  },
+ [LAYER_ADJUST]       = { // ADJUST
+  { _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, _______, _______, _______, MU_TOG,  AU_TOG,  ________________  },
   { _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______  },
   { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______  },
-  { _______, _______, _______, _______, _______, RESET,   _______, M_MOUSE, _______, _______, _______, ________________, VC_UP,   _______  },
-  { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, VC_DOWN, _______  },
+  { _______, _______, _______, _______, M_BACKL, RESET,   _______, M_MOUSE, _______, _______, _______, ________________, MUV_IN,  _______  },
+  { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, MUV_DE,  _______  },
  },
 
 
 /*
- [LAYER_EMPTY]        = {
+ [LAYER_EMPTY]        = { // LAYER
   { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________  },
   { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______  },
   { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______  },
@@ -225,13 +250,14 @@ 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);
+float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
+
 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);
-float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
 
 #endif /* AUDIO_ENABLE */
 
@@ -242,6 +268,7 @@ void persistant_default_layer_set(uint16_t default_layer)
 }
 
 const uint16_t PROGMEM fn_actions[] = {
+    [0] = ACTION_MODS_ONESHOT(MOD_LSFT),
 };
 
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
@@ -251,13 +278,41 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
     switch(id)
     {
 
+        case MACRO_BREATH_TOGGLE:
+            if (record->event.pressed)
+            {
+                breathing_toggle();
+            }
+            break;
+
+        case MACRO_BREATH_SPEED_INC:
+            if (record->event.pressed)
+            {
+                breathing_speed_inc(1);
+            }
+            break;
+
+        case MACRO_BREATH_SPEED_DEC:
+            if (record->event.pressed)
+            {
+                breathing_speed_dec(1);
+            }
+            break;
+
+        case MACRO_BREATH_DEFAULT:
+            if (record->event.pressed)
+            {
+                breathing_defaults();
+            }
+            break;
+
         case MACRO_QWERTY:
             if (record->event.pressed)
             {
                 persistant_default_layer_set(1UL<<LAYER_QWERTY);
-                               #ifdef AUDIO_ENABLE
-                       PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO);
-                               #endif /* AUDIO_ENABLE */
+                #ifdef AUDIO_ENABLE
+                    PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO);
+                #endif /* AUDIO_ENABLE */
             }
             break;
 
@@ -265,9 +320,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
             if (record->event.pressed)
             {
                 persistant_default_layer_set(1UL<<LAYER_COLEMAK);
-                               #ifdef AUDIO_ENABLE
-                       PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
-                               #endif /* AUDIO_ENABLE */
+                #ifdef AUDIO_ENABLE
+                    PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
+                #endif /* AUDIO_ENABLE */
             }
             break;
 
@@ -275,45 +330,53 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
             if (record->event.pressed)
             {
                 persistant_default_layer_set(1UL<<LAYER_DVORAK);
-                               #ifdef AUDIO_ENABLE
-                   PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO);
-                               #endif /* AUDIO_ENABLE */
+                #ifdef AUDIO_ENABLE
+                    PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO);
+                #endif /* AUDIO_ENABLE */
             }
             break;
 
-        case MACRO_LOWER:
+        case MACRO_UPPER:
             if (record->event.pressed)
             {
-                layer_on(LAYER_LOWER);
-                update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
+                layer_on(LAYER_UPPER);
+                breathing_speed_set(2);
+                breathing_pulse();
+                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
             }
             else
             {
-                layer_off(LAYER_LOWER);
-                update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
+                layer_off(LAYER_UPPER);
+                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
             }
             break;
 
-        case MACRO_RAISE:
+        case MACRO_LOWER:
             if (record->event.pressed)
             {
-                layer_on(LAYER_RAISE);
-                update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
+                layer_on(LAYER_LOWER);
+                breathing_speed_set(2);
+                breathing_pulse();
+                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
             }
             else
             {
-                layer_off(LAYER_RAISE);
-                update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
+                layer_off(LAYER_LOWER);
+                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
             }
             break;
 
         case MACRO_FUNCTION:
             if (record->event.pressed)
             {
+                breathing_speed_set(3);
+                breathing_enable();
                 layer_on(LAYER_FUNCTION);
             }
             else
             {
+                breathing_speed_set(1);
+                breathing_self_disable();
                 layer_off(LAYER_FUNCTION);
             }
             break;
@@ -363,45 +426,37 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
             }
             break;
 
-        case MACRO_AUDIO_OFF:
-            if (record->event.pressed)
-            {
-                #ifdef AUDIO_ENABLE
-                    audio_off();
-                #endif
-            }
-            break;
-
-        case MACRO_AUDIO_ON:
+/*
+        case MACRO_AUDIO_TOGGLE:
             if (record->event.pressed)
             {
-                #ifdef AUDIO_ENABLE
-                    audio_on();
-                PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO);
-                #endif
+                    if (is_audio_on())
+                    {
+                        audio_off();
+                    }
+                    else
+                    {
+                        audio_on();
+                        PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO);
+                    }
             }
             break;
 
-        case MACRO_MUSIC_ON:
+        case MACRO_MUSIC_TOGGLE:
             if (record->event.pressed)
             {
-                #ifdef AUDIO_ENABLE
+                    if (IS_LAYER_ON(LAYER_MUSIC))
+                    {
+                        layer_off(LAYER_MUSIC);
+                        stop_all_notes();
+                    }
+                    else
+                    {
                     PLAY_NOTE_ARRAY(tone_music_on, false, STACCATO);
                     layer_on(LAYER_MUSIC);
-                #endif
-            }
-            break;
-
-        case MACRO_MUSIC_OFF:
-            if (record->event.pressed)
-            {
-                #ifdef AUDIO_ENABLE
-                    layer_off(LAYER_MUSIC);
-                    stop_all_notes();
-                #endif
+                    }
             }
             break;
-
         case MACRO_INC_VOICE:
             if (record->event.pressed)
             {
@@ -421,9 +476,18 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
                 #endif
             }
             break;
+*/
 
 #endif /* AUDIO_ENABLE */
 
+#ifdef BACKLIGHT_ENABLE
+        case MACRO_BACKLIGHT:
+            if (record->event.pressed)
+            {
+                backlight_step();
+            }
+#endif
+
         default:
             break;
 
@@ -434,8 +498,8 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 
 #ifdef AUDIO_ENABLE
 
-
-void process_action_user(keyrecord_t *record)
+/*
+bool process_action_user(keyrecord_t *record)
 {
 
     uint8_t starting_note = 0x0C;
@@ -453,7 +517,7 @@ void process_action_user(keyrecord_t *record)
         }
     }
 }
-
+*/
 
 void matrix_init_user(void)
 {
@@ -468,36 +532,40 @@ void led_set_user(uint8_t usb_led)
 
     _delay_ms(10); // gets rid of tick
 
-    if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK)))
-    {
-            // If CAPS LK LED is turning on...
-            PLAY_NOTE_ARRAY(tone_caps_on,  false, LEGATO);
-    }
-    else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK)))
-    {
-            // If CAPS LK LED is turning off...
-            PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO);
-    }
-    else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK)))
-    {
-            // If NUM LK LED is turning on...
-            PLAY_NOTE_ARRAY(tone_numlk_on,  false, LEGATO);
-    }
-    else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK)))
-    {
-            // If NUM LED is turning off...
-            PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO);
-    }
-    else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
-    {
-            // If SCROLL LK LED is turning on...
-            PLAY_NOTE_ARRAY(tone_scroll_on,  false, LEGATO);
-    }
-    else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
+    if (!is_playing_notes())
     {
-            // If SCROLL LED is turning off...
-            PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO);
+        if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK)))
+        {
+                // If CAPS LK LED is turning on...
+                PLAY_NOTE_ARRAY(tone_caps_on,  false, LEGATO);
+        }
+        else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK)))
+        {
+                // If CAPS LK LED is turning off...
+                PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO);
+        }
+        else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK)))
+        {
+                // If NUM LK LED is turning on...
+                PLAY_NOTE_ARRAY(tone_numlk_on,  false, LEGATO);
+        }
+        else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK)))
+        {
+                // If NUM LED is turning off...
+                PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO);
+        }
+        else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
+        {
+                // If SCROLL LK LED is turning on...
+                PLAY_NOTE_ARRAY(tone_scroll_on,  false, LEGATO);
+        }
+        else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
+        {
+                // If SCROLL LED is turning off...
+                PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO);
+        }
     }
+
     old_usb_led = usb_led;
 }
 
@@ -511,7 +579,23 @@ void play_startup_tone()
 void play_goodbye_tone()
 {
     PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO);
-    _delay_ms(1000);
+    _delay_ms(2000);
+    stop_all_notes();
+}
+
+void play_audio_on_tone(void)
+{
+       PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO);
+}
+
+void play_music_on_tone(void)
+{
+       PLAY_NOTE_ARRAY(tone_music_on, false, STACCATO);
+}
+
+void play_music_scale(void)
+{
+       PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
 }
 
 #endif /* AUDIO_ENABLE */
\ No newline at end of file
index eefa42855fd7d504495b1b9dc1200b353c848b8b..f7798b09d5cb24b321974f5626d57431ae430f4c 100644 (file)
@@ -4,7 +4,7 @@ EXTRAKEY_ENABLE  = yes # Audio control and System control(+450)
 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
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
 MIDI_ENABLE      = no  # MIDI controls
 AUDIO_ENABLE     = yes # Audio output on port C6
 UNICODE_ENABLE   = no  # Unicode
index ca0cd7e47a084acc7fe0e1de44cd6021cd3d85f8..55d3b62b9293b68a270d4fd7ff754806e67ce527 100644 (file)
@@ -36,7 +36,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 // Change this to how you wired your keyboard
 // COLS: Left to right, ROWS: Top to bottom
 #if defined(ATREUS_ASTAR)
-  #define COLS (int []){ B7, D6, F7, F6, B6, D4, E6, B4, B5, C6, D7 }
+  #define COLS (int []){ D7, C6, B5, B4, E6, D4, B6, F6, F7, D6, B7 }
   #define ROWS (int []){ D0, D1, D3, D2 }
 #elif defined(ATREUS_TEENSY2)
   #define COLS (int []){ F6, F5, F4, B7, B6, B5, B4, B3, B2, B1, B0}
index 5dfcca2c80321d43643dfea092b15a353e0fceed..3a07ec254f4db0f4b52a4a66f150299c2d7ba47a 100644 (file)
@@ -101,6 +101,22 @@ NKRO_ENABLE      = yes             # USB Nkey Rollover - if this doesn't work, see here: ht
 # MIDI_ENABLE    = yes                 # MIDI controls
 # UNICODE_ENABLE = yes                 # Unicode
 
+# If you want to have your own config_user.h, you can just put it in
+# your keymap directory. Anything you set there will take precedence
+# over the global config.h.
+ifneq ("$(wildcard keymaps/$(KEYMAP)/config_user.h)","")
+CONFIG_USER_H = keymaps/$(KEYMAP)/config_user.h
+endif
+
+ifdef KEYMAP
+
+ifeq ("$(wildcard keymaps/$(KEYMAP).c)","")
+ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
+       include keymaps/$(KEYMAP)/makefile.mk
+endif
+endif
+endif
+
 
 # Optimize size but this may cause error "relocation truncated to fit"
 #EXTRALDFLAGS = -Wl,--relax
diff --git a/keyboard/ergodox_ez/keymaps/adnw/k_o_y/k_o_y.hex b/keyboard/ergodox_ez/keymaps/adnw/k_o_y/k_o_y.hex
new file mode 100644 (file)
index 0000000..95036fc
--- /dev/null
@@ -0,0 +1,1152 @@
+:100000000C9465020C94A9020C94A9020C94A90208\r
+:100010000C94A9020C94A9020C94A9020C94A902B4\r
+:100020000C94A9020C94A9020C946B0C0C943D0D39\r
+:100030000C94A9020C94A9020C94A9020C94A90294\r
+:100040000C94A9020C940F220C94A9020C94A902FE\r
+:100050000C94A9020C94B31B0C94A9020C94A90251\r
+:100060000C94A9020C94A9020C94A9020C94A90264\r
+:100070000C94A9020C94A9020C94A9020C94A90254\r
+:100080000C94A9020C94A9020C94A9020C94A90244\r
+:100090000C94A9020C94A9020C94A9020C94A90234\r
+:1000A0000C94A9020C94A9020C94A902A20DC40DEF\r
+:1000B000AF0EC40DAF0E060E290EAF0E7E0E910EC2\r
+:1000C0008B118B11CC11CC110E124A124A144A1406\r
+:1000D00062124A145913591324144A144A14381436\r
+:1000E0000000F0A12E004C002A00E1003581000044\r
+:1000F0001E000E000B001B7134004D001F00370066\r
+:1001000004001400E104280020001200080034005C\r
+:1001100050002C00210036000C002F004F004A0038\r
+:1001200022001D00180033000000657450000154C7\r
+:100130000000007F0000E3004F0001540000007742\r
+:100140000000E200230019000700050000002971EB\r
+:1001500024000A001700130052004B00250006007F\r
+:1001600015001A005100E50026000F0011001000D4\r
+:100170002F002B0027002D0016820D7130004E003D\r
+:100180002D001C000978E500C100000001000100FD\r
+:1001900001000100010000003A001E0220022202BC\r
+:1001A000010001003B001F022102230201000100A7\r
+:1001B0003C002F0226022F00010001003D0030020A\r
+:1001C00027023000010001003E00310235003502F7\r
+:1001D000000001000100010000000100000001001A\r
+:1001E0000100010000000100000001003F0052007A\r
+:1001F00051002402000001004000240021001E00E4\r
+:10020000010001004100250022001F00370001000D\r
+:1002100042002600230020002700010043002502A1\r
+:100220002E0231002E0001004400450001000100B3\r
+:1002300001000000010001000100010001000000B8\r
+:1002400001000100010001000100010001000100A6\r
+:10025000F2000100010001000100F000F1000100C6\r
+:10026000F400010001000100F3000100F5000100AD\r
+:100270000100010001000100000001000100010077\r
+:100280000000010000000100010001000000010069\r
+:100290000000010001000100010001000000010058\r
+:1002A0000100010001000100A9000100010001009E\r
+:1002B0000100AC00AA00B600010001000100AB0083\r
+:1002C000A80001000100010001000100010001007F\r
+:1002D00001000100AE00010001000000160345000E\r
+:1002E000720067006F0044006F0078002000450036\r
+:1002F0005A00000016034500720067006F004400BA\r
+:100300006F007800200045005A0000000403090433\r
+:1003100009026D00040100A0FA09040000010301B4\r
+:100320000100092111010001223F00070581030896\r
+:10033000000A090401000103010200092111010062\r
+:1003400001224D000705820308000A09040200018A\r
+:100350000300000009211101000122360007058376\r
+:100360000308000A09040300010300000009211129\r
+:100370000100012239000705840310000112011059\r
+:100380000100000008EDFE07130100010200010555\r
+:10039000010906A101050719E029E71500250195C6\r
+:1003A0000875018102050819012905950575019156\r
+:1003B000029501750391010507190029771500259C\r
+:1003C00001957875018102C005010980A1018502AE\r
+:1003D00016010026B7001A01002AB7007510950112\r
+:1003E0008100C0050C0901A1018503160100269CAE\r
+:1003F000021A01002A9C02751095018100C00501B6\r
+:100400000902A1010901A100050919012905150029\r
+:10041000250195057501810295017503810105018D\r
+:10042000093009311581257F950275088106093843\r
+:100430001581257F950175088106050C0A3802157E\r
+:1004400081257F950175088106C0C005010906A1B7\r
+:1004500001050719E029E7150025019508750181B7\r
+:100460000295017508810105081901290595057591\r
+:100470000191029501750391010507190029FF15E6\r
+:100480000025FF950675088100C0000000000000EF\r
+:100490000000000000010204060A0F17202C3A4A4F\r
+:1004A0005D71879DB3C7DAE9F5FCFFFCF5E9DAC7B2\r
+:1004B000B39D87715D4A3A2C20170F0A060402018A\r
+:1004C0000000000000000000000011241FBECFEF5C\r
+:1004D000DAE0DEBFCDBF04B603FE24C08091EE019A\r
+:1004E0009091EF01A091F001B091F1018730904B14\r
+:1004F000A740B04BB9F41092EE011092EF011092A8\r
+:10050000F0011092F10114BE84B7877F84BF88E1A7\r
+:100510000FB6F89480936000109260000FBEE0E088\r
+:10052000FFE3099511E0A0E0B1E0ECEAF7E402C0D6\r
+:1005300005900D92A433B107D9F721E0A4E3B1E00F\r
+:1005400001C01D92AE3EB207E1F70E94B1090C94C2\r
+:10055000D4230C94000061110BC0FC01828188231C\r
+:1005600021F085EE0E94131003C085EE0E94DB107F\r
+:1005700080E090E0089508956091B1017091B2011A\r
+:100580008091B3019091B4010E94DC1A56985E9854\r
+:1005900025982D9826982E9827982F98813019F015\r
+:1005A000823021F00895259A2D9A0895269A2E9A40\r
+:1005B00008950C94BC0256985E9825982D9826981C\r
+:1005C0002E9827982F988FEF90E090938900809332\r
+:1005D000880090938B0080938A0090938D00809385\r
+:1005E0008C00259A2D9A2FEF80E792E021508040D1\r
+:1005F0009040E1F700C00000269A2E9A2FEF80E786\r
+:1006000092E0215080409040E1F700C00000279A1E\r
+:100610002F9A2FEF80E792E0215080409040E1F741\r
+:1006200000C0000025982D982FEF80E792E0215020\r
+:1006300080409040E1F700C0000026982E982FEFF0\r
+:1006400080E792E0215080409040E1F700C0000038\r
+:1006500027982F9856985E9825982D9826982E982A\r
+:1006600027982F98089589EA8093800089E08093E5\r
+:10067000810024982C983F988AB18F748AB96E981B\r
+:10068000479A8BB1806B8BB9769A0E94DB020C94EF\r
+:10069000BB0280E2809300018091340181110EC081\r
+:1006A0000E94980381E0809334012FEF83ED90E363\r
+:1006B000215080409040E1F700C0000080E40E949B\r
+:1006C0009E038093000181112EC00E94C803809375\r
+:1006D0000001811128C00E94C8038093000181118C\r
+:1006E00022C08FE30E94C8038093000181111BC0C8\r
+:1006F0000E94C00380E40E949E0380930001811148\r
+:1007000012C08CE00E94C8038093000181110BC0CD\r
+:100710000E94C80380930001811105C08FE30E94ED\r
+:10072000C803809300010E94C003809100010895D6\r
+:100730001092B9008AE08093B800089594EA9093EB\r
+:10074000BC009091BC0097FFFCCF9091B900987FBE\r
+:10075000983021F0903111F081E008958093BB0032\r
+:1007600084E88093BC008091BC0087FFFCCF80911F\r
+:10077000B900887F883111F0803471F780E00895E6\r
+:1007800084E98093BC008091BC0084FDFCCF089577\r
+:100790008093BB0084E88093BC008091BC0087FFFD\r
+:1007A000FCCF9091B900987F81E0983209F480E005\r
+:1007B000089584E88093BC008091BC0087FFFCCF43\r
+:1007C0008091BB00089580910001811115C080E4E3\r
+:1007D0000E949E038093000181110CC082E10E945F\r
+:1007E000C80380930001811105C08FEF0E94C803E8\r
+:1007F000809300010E94C00384B1807F84B985B1D9\r
+:10080000807F85B98AB1837F8AB98BB1837F8BB9A9\r
+:100810003E98469808950E944903809300010E94E3\r
+:10082000E30380B38C7080BB81B3836F81BBE4E44E\r
+:10083000F1E0A6E3B1E011921D9281E0E235F80704\r
+:10084000D1F70C943303BF92CF92DF92EF92FF92D5\r
+:100850000F931F93CF93DF9380910001882379F04A\r
+:10086000809135018F5F80933501811108C00E940E\r
+:10087000490380930001811102C00E94DB0206E35C\r
+:1008800011E0C0E0D0E0DD24D39482E0C82EEE2455\r
+:10089000E394F12CC73000F580910001811162C012\r
+:1008A00080E40E949E0380930001811112C082E1C6\r
+:1008B0000E94C8038093000181110BC0C7010C2E58\r
+:1008C00001C0880F0A94EAF780950E94C8038093BC\r
+:1008D00000010E94C00346C0CA30A1F028F4C8300D\r
+:1008E00059F0C93061F005C0CC3089F070F0CD30DE\r
+:1008F00089F0209A289810C0219A29980DC0229A30\r
+:100900002A980AC0239A2B9807C0529A01C0539A7A\r
+:100910005B9802C03E9A4698E0EAEA95F1F78FB1FB\r
+:1009200079995AC092E081708D25892B7C9B02C0F9\r
+:1009300090E001C094E0892B7D9B02C090E001C053\r
+:1009400098E0892B7E9B02C090E001C090E1892B4A\r
+:100950009FB19095991F9927991F9295990F907E15\r
+:10096000892B0FC08091000181114BC080E40E944F\r
+:100970009E0380930001882389F1B12C0E94C0035B\r
+:100980008B2DF8019081981719F08083C092010196\r
+:100990000E94E30321960F5F1F4FCE30D10509F06F\r
+:1009A00079CF80910101882371F1815080930101F9\r
+:1009B000882339F08FE99FE00197F1F700C000002C\r
+:1009C00022C0A4E4B1E0E6E3F1E081918D9391E0EF\r
+:1009D000E434F907D1F717C090E0A5CF83E10E9476\r
+:1009E000C803809300018111C8CF81E40E949E0357\r
+:1009F000809300018111C1CF0E94D903B82EB09419\r
+:100A0000BDCF80E0BECF0E94D90281E0DF91CF91BF\r
+:100A10001F910F91FF90EF90DF90CF90BF900895BE\r
+:100A2000E82FF0E0EC5BFE4F808108950895089573\r
+:100A300096E0799FF001112494E5899FE00DF11D66\r
+:100A40001124E60FF11DEE0FFF1FEC51FF4F8591B2\r
+:100A500094910895880F991F805A9040FC018591C8\r
+:100A600094910895880F991F80529F4FFC018591A2\r
+:100A7000949108950F931F93CF93DF93EC01811509\r
+:100A800020E3920730F5811530E2930708F0B1C0FA\r
+:100A90008B3B910588F4883A910508F058C0853A57\r
+:100AA000910508F049C08430910508F043C08130B9\r
+:100AB000910509F4B2C1AEC18F3F910509F0D0F59F\r
+:100AC000803F910508F092C0805E9109089790F1EF\r
+:100AD000A1C1C11581E5D807A8F4C23090E5D907B6\r
+:100AE00008F09FC0C11520E5D20709F486C008F0C0\r
+:100AF00092C0C11580E4D80708F08CC18E0111277F\r
+:100B0000106CCCC1C11590E8D90758F4C11520E785\r
+:100B1000D20708F07BC1C11530E6D30708F423C122\r
+:100B200079C1C11580E9D80708F074C18E011F7022\r
+:100B3000106AB4C18E01B2C1853A910509F470C141\r
+:100B4000863A910509F46FC103E810E4A7C1883A19\r
+:100B5000910509F46BC1893A910509F46AC18A3A91\r
+:100B6000910509F469C18B3A910509F468C18C3A81\r
+:100B7000910509F467C18D3A910509F466C1803B7E\r
+:100B8000910509F465C18E3A910509F464C18F3A63\r
+:100B9000910509F463C1813B910509F462C1823B6F\r
+:100BA000910509F461C1833B910509F460C1843B5F\r
+:100BB000910509F45FC1853B910509F45EC1863B4F\r
+:100BC000910509F45DC1873B910509F45CC1883B3F\r
+:100BD000910509F45BC1893B910509F45AC18A3B2F\r
+:100BE000910509F059C10AE216E458C18C0110655B\r
+:100BF00055C19F700E94320552C10E946D149FEF33\r
+:100C000024E33CE0915020403040E1F700C0000078\r
+:100C10000E94D81B43C18091CD0181608093CD019A\r
+:100C20003DC10E94801D811102C00E94661D0E946C\r
+:100C30009D1D90E09093EE018093ED01C23080E520\r
+:100C4000D80721F48091ED01816086C0C43090E521\r
+:100C5000D90721F48091ED0182607EC0C63020E585\r
+:100C6000D20721F48091ED01846076C0C83030E570\r
+:100C7000D30719F48091ED0127C0CA3080E5D80769\r
+:100C800021F48091ED01806167C0CC3090E5D907F7\r
+:100C900021F48091ED0180625FC0CE3020E5D20763\r
+:100CA00021F48091ED01806457C0C03130E5D30755\r
+:100CB00021F48091ED0180684FC0C23180E5D807F2\r
+:100CC00029F48091ED018460886046C0C33090E5CE\r
+:100CD000D90721F48091ED018E7F3EC0C53020E51B\r
+:100CE000D20721F48091ED018D7F36C0C73030E509\r
+:100CF000D30721F48091ED018B7F2EC0C93080E5B0\r
+:100D0000D80719F48091ED0126C0CB3090E5D907C2\r
+:100D100021F48091ED018F7E1FC0CD3020E5D207F8\r
+:100D200021F48091ED018F7D17C0CF3030E5D307DE\r
+:100D300021F48091ED018F7B0FC0C13180E5D80790\r
+:100D400021F48091ED018F7707C0C331D04531F494\r
+:100D50008091ED018B7F877F8093ED018091ED0184\r
+:100D60000E94A11D9BC08D2F99278F7099278130DC\r
+:100D70009105E9F48E01037011279C0102C0220F36\r
+:100D8000331F0A95E2F789011C68CE0164E0880FE1\r
+:100D9000991F6A95E1F788279370082B192B73E048\r
+:100DA000CC0FDD1F7A95E1F7C076DD272CC08230AD\r
+:100DB000910529F41C2F0027016F106A6FC0833042\r
+:100DC000910561F4CE018370992701E010E002C023\r
+:100DD000000F111F8A95E2F71C680EC0049709F0F6\r
+:100DE0005DC0CE018370992701E010E002C0000FC2\r
+:100DF000111F8A95E2F71A6843E0CC0FDD1F4A9570\r
+:100E0000E1F7C07ED7700C2B1D2B48C08E011F70E0\r
+:100E1000106244C000E010E041C001E010E03EC0BC\r
+:100E200001E810E43BC002E810E438C002EE14E42C\r
+:100E300035C009EE14E432C00AEE14E42FC005EB0D\r
+:100E400014E42CC006EB14E429C007EB14E426C01C\r
+:100E50000CEC14E423C00DEC14E420C003E815E40A\r
+:100E60001DC00AE815E41AC002E915E417C004E938\r
+:100E700015E414C001E216E411C003E216E40EC04A\r
+:100E800004E216E40BC005E216E408C006E216E42C\r
+:100E900005C007E216E402C000E014E4C801DF91D7\r
+:100EA000CF911F910F91089596E0799FF001112441\r
+:100EB00094E5899FE00DF11D1124E60FF11DEE0F61\r
+:100EC000FF1FEC51FF4F85919491803E9105E0F416\r
+:100ED000803C910558F58133910509F46FC048F4C1\r
+:100EE0008932910509F463C08A32910509F46DC015\r
+:100EF00072C089339105E9F082389105D1F08533CC\r
+:100F0000910509F44DC067C0833E910581F138F425\r
+:100F1000803E9105B9F0823E9105D9F05CC0863ED5\r
+:100F2000910561F1873E9105A1F155C00E942A0506\r
+:100F300008952091ED0120FD02C021FF4CC080EEFC\r
+:100F400090E049C08091ED0180FFF9CF89E390E006\r
+:100F500042C08091ED0182FF0EC08091ED0184FFBF\r
+:100F600003C080E090E037C083EE90E034C0809111\r
+:100F7000ED0182FFF2CF82EE90E02DC08091ED0175\r
+:100F800083FF0BC08091ED0184FDEBCF87EE90E0F5\r
+:100F900022C08091ED0183FFF5CF86EE90E01BC06B\r
+:100FA0008091ED0185FF07C089E290E014C0809137\r
+:100FB000ED0185FFF9CF85E390E00DC08091ED0153\r
+:100FC00086FF07C08AE290E006C08091ED0186FFAF\r
+:100FD000F9CF81E390E00E943A05089508950C94BA\r
+:100FE000EE07809162010895CF93DF9300D01F92A6\r
+:100FF000CDB7DEB72091E401243019F523E0298331\r
+:101000009B838A832093E9008FEF9091E8008150C1\r
+:1010100095FD06C095ED9A95F1F700008111F5CF89\r
+:101020008091E80085FF0DC040E050E063E070E093\r
+:10103000CE0101960E945E0A8091E8008E7780932F\r
+:10104000E8000F900F900F90DF91CF910895CF930C\r
+:10105000DF9300D01F92CDB7DEB72091E40124309A\r
+:1010600021F522E029839B838A8383E08093E90032\r
+:101070008FEF9091E800815095FD06C095ED9A950F\r
+:10108000F1F700008111F5CF8091E80085FF0DC0D8\r
+:1010900040E050E063E070E0CE0101960E945E0AFD\r
+:1010A0008091E8008E778093E8000F900F900F906A\r
+:1010B000DF91CF9108952091E4012430F1F422E0F2\r
+:1010C0002093E9002FEF3091E800215035FD06C054\r
+:1010D00035ED3A95F1F700002111F5CF2091E800A8\r
+:1010E00025FF0BC040E050E065E070E00E945E0A22\r
+:1010F0008091E8008E778093E8000895CF93DF9386\r
+:10110000EC018091E401843009F046C090910C011B\r
+:101110009923D9F090910D019923B9F08093E900BA\r
+:101120008FEF9091E800815095FD06C095E19A956A\r
+:10113000F1F700008111F5CF8091E80085FF2CC008\r
+:1011400040E050E060E170E017C081E08093E9008A\r
+:101150008FEF9091E800815095FD06C095ED9A952E\r
+:10116000F1F700008111F5CF8091E80085FF14C0F0\r
+:1011700040E050E068E070E0CE010E945E0A80919D\r
+:10118000E8008E778093E80080E1FE01A2E5B1E0FF\r
+:1011900001900D928A95E1F7DF91CF9108958091AA\r
+:1011A000E301811109C00E94F00B0E944D0C809157\r
+:1011B000E20084608093E20008951092E3010895B4\r
+:1011C00008950C94FC210E946F1B0E9402220E9431\r
+:1011D000EA0E0C94EF0742E061EC81E00E946A0B9A\r
+:1011E00042E061EC82E00E946A0B42E061EC83E045\r
+:1011F0000E946A0B42E161EC84E00C946A0B8091DE\r
+:10120000E601833009F455C030F4813071F082304A\r
+:1012100009F48EC008958A3009F47AC08B3009F43D\r
+:1012200060C0893009F09CC020C08091E501813AFE\r
+:1012300009F096C08091E800877F8093E800809154\r
+:10124000E9019091EA01892B21F060E080E090E0D3\r
+:1012500003C060E182E591E070E00E94A70A8091FE\r
+:10126000E8008B778093E80008958091E501813252\r
+:1012700009F076C08091E9019091EA01009719F098\r
+:10128000039709F06DC08091E800877F8093E800A4\r
+:101290008091E80082FD05C08091E4018111F8CFC2\r
+:1012A0005FC08091F100809362018091E8008B77AC\r
+:1012B00053C08091E501813A09F052C08091E90163\r
+:1012C0009091EA01892B09F04BC08091E800877F5B\r
+:1012D0008093E8008091E80080FFFCCF80910C01B2\r
+:1012E00036C08091E5018132D9F58091E901909174\r
+:1012F000EA01892BA9F58091E800877F8093E800B7\r
+:101300000E949F0B8091E70180930C010C946D1457\r
+:101310008091E501813221F58091E800877F8093FB\r
+:10132000E8000E949F0B8091E8018093630108957B\r
+:101330008091E501813AA1F48091E800877F809354\r
+:10134000E8008091E80080FFFCCF809163018093EA\r
+:10135000F1008091E8008E778093E8000C949F0B59\r
+:10136000089584B7877F84BF88E10FB6F89480938F\r
+:101370006000109260000FBE90E080E80FB6F89415\r
+:1013800080936100909361000FBE0E94390F0E940C\r
+:10139000F00B0E944D0C8091E20084608093E2008B\r
+:1013A00078940E94C80E0E943B0F82E091E00E9458\r
+:1013B000E50E0E94EA218091E401853069F40E94E3\r
+:1013C0002F1B8091E2018823B1F30E945A1B8823CE\r
+:1013D00091F30E94480AEFCF0E94410FECCF292FD2\r
+:1013E000332723303105A9F06CF42130310509F49D\r
+:1013F00042C02230310509F043C08DE690E020E183\r
+:1014000033E042C021323105C9F02232310519F1F1\r
+:1014100037C099278130910541F08230910541F024\r
+:10142000892B71F5ECE0F3E005C0E4EFF2E002C0D7\r
+:10143000ECEDF2E0849190E09F0126C0643000F56D\r
+:10144000E62FF0E0EE0FFF1FEE5DFE4F20813181B1\r
+:1014500089E090E019C0643098F4E62FF0E0DF01F5\r
+:10146000AA0FBB1FA65EBE4F2D913C91EA5EFE4FB8\r
+:10147000808190E009C082E190E02DE733E004C074\r
+:1014800080E090E020E030E0FA013183208308958D\r
+:1014900080E189BD82E189BD09B400FEFDCF809164\r
+:1014A000D8008F7D8093D8008091E0008260809387\r
+:1014B000E0008091E00081FDFCCF0895CF92DF92A3\r
+:1014C000EF92FF920F931F93CF93DF937C018B01D9\r
+:1014D000EA010E94C00B811131C0209731F0888150\r
+:1014E0009981081B190BE80EF91EC12CD12C01158E\r
+:1014F000110519F18091E80085FD14C08091E80084\r
+:101500008E778093E800209741F0888199818C0D37\r
+:101510009D1D9983888385E011C00E94C00B88239C\r
+:1015200031F30CC0F70181917F018093F1000150EC\r
+:101530001109FFEFCF1ADF0ADACF80E0DF91CF91F8\r
+:101540001F910F91FF90EF90DF90CF900895209121\r
+:10155000EB013091EC012617370748F06115710552\r
+:1015600039F42091E8002E772093E80001C0B901FA\r
+:10157000FC0120E061157105B9F18091E401882337\r
+:1015800009F440C0853009F43FC08091E80083FD34\r
+:101590003DC08091E80082FF06C08091E80082FF94\r
+:1015A00026C080E008958091E80080FFE3CF20917D\r
+:1015B000F3008091F20090E0922B6115710551F0DB\r
+:1015C0008830910538F421912093F1006150710920\r
+:1015D0000196F3CF21E0089709F020E08091E80020\r
+:1015E0008E778093E800C6CF2111C7CFD6CF8091E8\r
+:1015F000E401882339F0853039F08091E80083FFD9\r
+:10160000CCCF04C082E0089583E0089581E008957E\r
+:101610002091EB013091EC012617370748F0611556\r
+:10162000710539F42091E8002E772093E80001C07D\r
+:10163000B901FC0120E061157105C1F18091E4015F\r
+:10164000882309F441C0853009F440C08091E80046\r
+:1016500083FD3EC08091E80082FF06C08091E800D3\r
+:1016600082FF27C080E008958091E80080FFE3CFEB\r
+:101670002091F3008091F20090E0922B61157105AA\r
+:1016800059F08830910540F424912093F10031966F\r
+:10169000615071090196F2CF21E0089709F020E02E\r
+:1016A0008091E8008E778093E800C5CF2111C6CFE6\r
+:1016B000D5CF8091E401882339F0853039F08091CD\r
+:1016C000E80083FFCBCF04C082E0089583E0089553\r
+:1016D00081E00895982F973058F59093E900981776\r
+:1016E00039F07091EC002091ED005091F00003C0B2\r
+:1016F000242F762F50E021FF19C03091EB003E7F60\r
+:101700003093EB003091ED003D7F3093ED00309150\r
+:10171000EB0031603093EB007093EC002093ED0010\r
+:101720005093F0002091EE0027FF07C09F5FD3CFBA\r
+:101730008F708093E90081E0089580E008958091A2\r
+:10174000E50187FD05C08091E80080FF0EC012C052\r
+:101750008091E80082FD05C08091E4018111F8CFFD\r
+:1017600008958091E8008B7708C08091E401811191\r
+:10177000EACF08958091E8008E778093E80008957D\r
+:101780008091E4009091E50045E62091EC0020FF77\r
+:1017900021C02091E80020FD21C02091E4012223F6\r
+:1017A00089F0253089F02091EB0025FD0FC02091B4\r
+:1017B000E4003091E5002817390739F3415041F032\r
+:1017C000C901E3CF82E0089583E0089581E00895A0\r
+:1017D00084E008952091E80022FFDFCF80E00895A3\r
+:1017E0000E945E0C0E94660CE0EEF0E08081816059\r
+:1017F0008083E8EDF0E080818F77808319BCA7EDCE\r
+:10180000B0E08C918E7F8C9380818F7E808310924C\r
+:10181000E30108950F931F93CF93DF930E945E0C13\r
+:101820000E94660CC8EDD0E088818F77888388811C\r
+:101830008068888388818F7D888319BC1092E40139\r
+:101840001092E0011092E2011092E10100EE10E02E\r
+:10185000F80180818B7F808388818160888342E06A\r
+:1018600060E080E00E946A0BE1EEF0E080818E7F14\r
+:101870008083E2EEF0E080818160808380818860F7\r
+:101880008083F80180818E7F808388818061888356\r
+:10189000DF91CF911F910F910895E8EDF0E08081E5\r
+:1018A0008F7E8083E7EDF0E080818160808384E03B\r
+:1018B00082BF81E08093E3010C940A0CE8EDF0E034\r
+:1018C00080818E7F80831092E20008951092DA006A\r
+:1018D0001092E10008951F920F920FB60F921124FB\r
+:1018E0002F933F934F935F936F937F938F939F9328\r
+:1018F000AF93BF93EF93FF938091E10082FF0BC002\r
+:101900008091E20082FF07C08091E1008B7F80938D\r
+:10191000E1000E94C70E8091DA0080FF1FC0809115\r
+:10192000D80080FF1BC08091DA008E7F8093DA00A0\r
+:101930008091D90080FF0DC080E189BD82E189BD21\r
+:1019400009B400FEFDCF81E08093E4010E94CF083E\r
+:1019500005C019BC1092E4010E94DD088091E100ED\r
+:1019600080FF19C08091E20080FF15C08091E200E5\r
+:101970008E7F8093E2008091E20080618093E2009C\r
+:101980008091D80080628093D80019BC85E0809354\r
+:10199000E4010E94E1088091E10084FF30C0809161\r
+:1019A000E20084FF2CC080E189BD82E189BD09B4D9\r
+:1019B00000FEFDCF8091D8008F7D8093D80080916C\r
+:1019C000E1008F7E8093E1008091E2008F7E809322\r
+:1019D000E2008091E20081608093E2008091E0016A\r
+:1019E000882311F084E007C08091E30087FF02C0E4\r
+:1019F00083E001C081E08093E4010E94E3088091CC\r
+:101A0000E10083FF29C08091E20083FF25C080911F\r
+:101A1000E100877F8093E10082E08093E4011092EF\r
+:101A2000E0018091E1008E7F8093E1008091E200EF\r
+:101A30008E7F8093E2008091E20080618093E200DB\r
+:101A400042E060E080E00E946A0B8091F0008860D4\r
+:101A50008093F0000E94E008FF91EF91BF91AF9159\r
+:101A60009F918F917F916F915F914F913F912F91B6\r
+:101A70000F900FBE0F901F9018951F920F920FB6E8\r
+:101A80000F9211242F933F934F935F936F937F9304\r
+:101A90008F939F93AF93BF93CF93EF93FF93C09197\r
+:101AA000E900CF708091EC001092E9008091F00085\r
+:101AB000877F8093F00078940E94790D1092E9005E\r
+:101AC0008091F00088608093F000C093E900FF915E\r
+:101AD000EF91CF91BF91AF919F918F917F916F9136\r
+:101AE0005F914F913F912F910F900FBE0F901F90DC\r
+:101AF00018951F93CF93DF93CDB7DEB7AA970FB694\r
+:101B0000F894DEBF0FBECDBFE5EEF1E08091F100AD\r
+:101B1000819321E0ED3EF207C9F70E94FF08809112\r
+:101B2000E80083FF1CC12091E5013091E601832F7D\r
+:101B300090E08A30910508F012C1FC01EA5AFF4F8B\r
+:101B40000C948423203881F0223809F008C1809158\r
+:101B5000E9018F708093E9008091EB0085FB882775\r
+:101B600080F91092E90006C08091E1019091E201B4\r
+:101B7000911182609091E800977F9093E8008093A4\r
+:101B8000F1001092F100C5C0822F8D7F09F0E7C0EF\r
+:101B9000222319F0223061F0E2C08091E701813008\r
+:101BA00009F0DDC0333009F080E08093E20128C005\r
+:101BB0008091E701811124C02091E9012F7009F47F\r
+:101BC000CEC02093E9008091EB0080FF19C0809186\r
+:101BD000EB00333011F4806211C080618093EB0020\r
+:101BE00081E090E0022E01C0880F0A94EAF780930A\r
+:101BF000EA001092EA008091EB0088608093EB008D\r
+:101C00001092E9008091E800877F86C02111A7C06B\r
+:101C10001091E7011F778091E3008078812B8093FA\r
+:101C2000E3008091E800877F8093E8000E949F0B8B\r
+:101C30008091E80080FFFCCF8091E3008068809372\r
+:101C4000E300112311F083E001C082E08093E401FE\r
+:101C500086C02058223008F082C08091E701909120\r
+:101C6000E8018C3D23E0920779F583E08A838AE2DC\r
+:101C700089834FB7F894DE01139620E03EE051E2ED\r
+:101C8000E32FF0E050935700E49120FF03C0E2956A\r
+:101C9000EF703F5FEF708E2F90E0EA3010F0C79644\r
+:101CA00001C0C0968D939D932F5F243149F74FBF9C\r
+:101CB0008091E800877F8093E8006AE270E0CE01BF\r
+:101CC00001960E94A70A14C0AE014F5F5F4F60915A\r
+:101CD000E9010E94EF09009709F441C02091E80052\r
+:101CE000277F2093E800BC0189819A810E94080B1C\r
+:101CF0008091E8008B778093E80031C0203879F537\r
+:101D00008091E800877F8093E8008091E0018093D4\r
+:101D1000F1008091E8008E778093E8000E949F0B8D\r
+:101D20001EC021111CC09091E7019230C0F4809137\r
+:101D3000E800877F8093E8009093E0010E949F0B6A\r
+:101D40008091E001811104C08091E30087FF02C00F\r
+:101D500084E001C081E08093E4010E94EB0880915F\r
+:101D6000E80083FF0AC08091E800877F8093E80045\r
+:101D70008091EB0080628093EB00AA960FB6F894F6\r
+:101D8000DEBF0FBECDBFDF91CF911F9108950895A3\r
+:101D9000CF938091E4018823B1F08091E9008F70A6\r
+:101DA0009091EC0090FF02C090E801C090E0C92F34\r
+:101DB000C82B1092E9008091E80083FD0E94790D04\r
+:101DC000CF70C093E900CF910895909369018093FB\r
+:101DD00068010895E0916801F0916901309721F060\r
+:101DE0000190F081E02D099480E00895E091680170\r
+:101DF000F0916901309721F00280F381E02D099480\r
+:101E00000895E0916801F0916901309721F0048014\r
+:101E1000F581E02D099408952091660130916701C4\r
+:101E20008217930771F09093670180936601E091A8\r
+:101E30006801F0916901309721F00680F781E02D6B\r
+:101E400009940895209164013091650182179307E8\r
+:101E500071F09093650180936401E0916801F091C5\r
+:101E60006901309721F00084F185E02D09940895EF\r
+:101E700008950C94380F0E94751B0E940B040C945B\r
+:101E80003B1CCF92DF92EF92FF920F931F93CF9361\r
+:101E9000DF93CDB7DEB72B970FB6F894DEBF0FBE3A\r
+:101EA000CDBF0E9423043BE6E32E31E0F32E00E099\r
+:101EB00010E0C02E802F0E941005F701D1907F0105\r
+:101EC000D826B1F40F5F1F4F0E30110591F78FEF39\r
+:101ED00089838A831B820E947E1B8160782F9D8369\r
+:101EE0008C8349815A816B818D810E94E40F41C0AE\r
+:101EF0009091CD0191FF04C08B870E9416058B85C0\r
+:101F000020E030E04D2D50E0922FBA01022E02C0A9\r
+:101F1000759567950A94E2F760FF25C02E83CF82FE\r
+:101F2000EE24E394F12C02C0EE0CFF1C9A95E2F72C\r
+:101F300090E08E219F2121E0892B09F420E0288761\r
+:101F40000E947E1B8160782F9A8789874E815F81EE\r
+:101F500068858A850E94E40FF801E559FE4F80816B\r
+:101F60008E25808306C02F5F3F4F2630310561F6F6\r
+:101F7000A9CF0E941F1F10916A010E94EA0E181734\r
+:101F8000A1F00E94EA0E80936A012B960FB6F89496\r
+:101F9000DEBF0FBECDBFDF91CF911F910F91FF909C\r
+:101FA000EF90DF90CF900C94EF072B960FB6F8943C\r
+:101FB000DEBF0FBECDBFDF91CF911F910F91FF907C\r
+:101FC000EF90DF90CF900895CF93DF93CDB7DEB73A\r
+:101FD0002B970FB6F894DEBF0FBECDBF4F83588747\r
+:101FE00069877A878B87DE01119686E0FD01119261\r
+:101FF0008A95E9F785E0FE01379601900D928A9562\r
+:10200000E1F749815A816B817C818D819E810E949B\r
+:1020100039172B960FB6F894DEBF0FBECDBFDF91F8\r
+:10202000CF9108950895CF93C82F882309F4C1C094\r
+:10203000823859F40E94EA0E81FDBBC089E30E94F8\r
+:10204000E3190E94AD1A89E30CC0833879F40E9429\r
+:10205000EA0E80FDAEC083E50E94E3190E94AD1A2E\r
+:1020600083E50E94231ACF910C94AD1A843859F459\r
+:102070000E94EA0E82FD9DC087E40E94E3190E943F\r
+:10208000AD1A87E4EECF8CEF8C0F813A48F48C2F99\r
+:102090000E94522181118DC08C2F0E94E319E3CF41\r
+:1020A00080E28C0F883048F4C77081E001C0880F4F\r
+:1020B000CA95EAF70E94641AD6CF8BE58C0F83305D\r
+:1020C00078F4C53A29F0C63A31F482E890E005C0C8\r
+:1020D00081E890E002C083E890E0CF910C940C0F6F\r
+:1020E00088E58C0F833108F064C0C83A39F1C93AE9\r
+:1020F00041F1CA3A49F1CB3A51F1CC3A59F1CD3AD2\r
+:1021000061F1C03B69F1CE3A71F1CF3A79F1C13B4F\r
+:1021100081F1C23B89F1C33B91F1C43B99F1C53BCD\r
+:10212000A1F1C63BA9F1C73BB1F1C83BB9F1C93B2D\r
+:10213000C1F1CA3BC9F58AE292E038C082EE90E074\r
+:1021400035C089EE90E032C08AEE90E02FC085EB7A\r
+:1021500090E02CC086EB90E029C087EB90E026C091\r
+:102160008CEC90E023C08DEC90E020C083E891E0FF\r
+:102170001DC08AE891E01AC082E991E017C084E9A5\r
+:1021800091E014C081E292E011C083E292E00EC0BF\r
+:1021900084E292E00BC085E292E008C086E292E021\r
+:1021A00005C087E292E002C080E090E0CF910C94FD\r
+:1021B000220FCF910895882309F44BC0823859F437\r
+:1021C0000E94EA0E81FF45C089E30E94E3190E9444\r
+:1021D000AD1A89E30CC0833871F40E94EA0E80FFC7\r
+:1021E00038C083E50E94E3190E94AD1A83E50E947E\r
+:1021F000231A0C94AD1A843859F40E94EA0E82FF17\r
+:1022000028C087E40E94E3190E94AD1A87E4EFCF4B\r
+:102210009CEF980F913A58F390E2980F983050F451\r
+:10222000877091E001C0990F8A95EAF7892F0E9483\r
+:102230006A1ADFCF9BE5980F933020F480E090E09E\r
+:102240000C940C0F885A833120F480E090E00C94B9\r
+:10225000220F0895882321F00E94641A0C94AD1A6D\r
+:102260000895882321F00E946A1A0C94AD1A0895EB\r
+:10227000CF92DF92EF92FF920F931F93CF93DF9352\r
+:10228000CDB7DEB728970FB6F894DEBF0FBECDBF2F\r
+:102290008C0185E0F801DE01119601900D928A957E\r
+:1022A000E1F7F801D080E180F280558152955F70AE\r
+:1022B00023813481232B39F0FFEFEF1206C081E038\r
+:1022C000DF1203C003C081E001C080E080FDE2C2F4\r
+:1022D000C8015F830E941210D982EA8269817A81E3\r
+:1022E0008F2D0E94DF199E8388870E9493190E9478\r
+:1022F00066184E815F816885FF2029F00E94811A4F\r
+:1023000068855F814E81E42FE295EF70F0E0E05A3E\r
+:10231000FF4F0C948423842F807F142F1F708823F9\r
+:1023200011F01295107FFF20B1F0112309F467C25C\r
+:1023300080E2860F883028F4812F68870E94641A13\r
+:1023400004C0812F68870E94741A688568870E947C\r
+:10235000AD1A688554C2862F68870E94DB10688595\r
+:10236000112309F497C2605E812F683018F40E942F\r
+:102370006A1A02C00E947A1A28960FB6F894DEBF35\r
+:102380000FBECDBFDF91CF911F910F91FF90EF90C6\r
+:10239000DF90CF900C94AD1A242F207F842F8F7064\r
+:1023A000203211F08295807F662319F0613019F197\r
+:1023B0002BC0FF20B1F0552309F493C1513009F02F\r
+:1023C00090C128960FB6F894DEBF0FBECDBFDF9147\r
+:1023D000CF911F910F91FF90EF90DF90CF900C94D1\r
+:1023E000941A552319F0513009F454C28E830E9477\r
+:1023F000971A8E8189C1FF2021F0523008F04AC21D\r
+:1024000070C1511147C280C1FF2021F0552309F44A\r
+:1024100068C1F5C1552309F477C105C2242F26955B\r
+:102420002695237030E02115310521F0213031054A\r
+:10243000C9F030C2FF2021F0862F942F937002C084\r
+:1024400080E090E028960FB6F894DEBF0FBECDBFB7\r
+:10245000DF91CF911F910F91FF90EF90DF90CF9080\r
+:102460000C940C0FFF2021F0862F942F937002C044\r
+:1024700080E090E028960FB6F894DEBF0FBECDBF87\r
+:10248000DF91CF911F910F91FF90EF90DF90CF9050\r
+:102490000C94220F862FFF2019F00E94271E02C0E5\r
+:1024A0000E948F1E28960FB6F894DEBF0FBECDBFD8\r
+:1024B000DF91CF911F910F91FF90EF90DF90CF9020\r
+:1024C0000C94141F842F837009F076C0F110E2C1C0\r
+:1024D000262F229526952770220F220F862F8F7088\r
+:1024E000C82ED12CE12CF12C022E04C0CC0CDD1C0A\r
+:1024F000EE1CFF1C0A94D2F764FF10C06FE070E07E\r
+:1025000080E090E004C0660F771F881F991F2A950E\r
+:10251000D2F7609570958095909503C060E070E06B\r
+:10252000CB01242F269526952370422F50E0423070\r
+:102530005105D1F04330510559F16C297D298E297F\r
+:102540009F294130510541F128960FB6F894DEBF1E\r
+:102550000FBECDBFDF91CF911F910F91FF90EF90F4\r
+:10256000DF90CF900C948B186C297D298E299F29A0\r
+:1025700028960FB6F894DEBF0FBECDBFDF91CF9186\r
+:102580001F910F91FF90EF90DF90CF900C94A518C2\r
+:102590000E948B18C701B60128960FB6F894DEBFCB\r
+:1025A0000FBECDBFDF91CF911F910F91FF90EF90A4\r
+:1025B000DF90CF900C947118FF2019F0842F817058\r
+:1025C00001C08695882309F465C1262F229526959A\r
+:1025D0002770220F220F862F8F70C82ED12CE12C4E\r
+:1025E000F12C022E04C0CC0CDD1CEE1CFF1C0A9446\r
+:1025F000D2F764FF10C06FE070E080E090E004C0AC\r
+:10260000660F771F881F991F2A95D2F760957095DE\r
+:102610008095909503C060E070E0CB01242F269553\r
+:1026200026952370422F50E042305105D1F04330BF\r
+:10263000510559F16C297D298E299F294130510579\r
+:1026400041F128960FB6F894DEBF0FBECDBFDF91E3\r
+:10265000CF911F910F91FF90EF90DF90CF900C944E\r
+:102660005F196C297D298E299F2928960FB6F89429\r
+:10267000DEBF0FBECDBFDF91CF911F910F91FF90B5\r
+:10268000EF90DF90CF900C9479190E945F19C701E9\r
+:10269000B60128960FB6F894DEBF0FBECDBFDF910E\r
+:1026A000CF911F910F91FF90EF90DF90CF900C94FE\r
+:1026B0004519603FC9F118F4603E50F49BC0623F79\r
+:1026C00009F460C008F44AC0633F09F46FC092C0C7\r
+:1026D000162F1F70842F8F71FF2099F00E94DE1833\r
+:1026E000812F28960FB6F894DEBF0FBECDBFDF91C5\r
+:1026F000CF911F910F91FF90EF90DF90CF900C94AE\r
+:102700002A110E94FF18812F28960FB6F894DEBF79\r
+:102710000FBECDBFDF91CF911F910F91FF90EF9032\r
+:10272000DF90CF900C943111FF20A1F05111B2C075\r
+:10273000842F8F7128960FB6F894DEBF0FBECDBFE1\r
+:10274000DF91CF911F910F91FF90EF90DF90CF908D\r
+:102750000C942419523008F09DC0EACFFF20A1F05C\r
+:10276000842F8F7128960FB6F894DEBF0FBECDBFB1\r
+:10277000DF91CF911F910F91FF90EF90DF90CF905D\r
+:102780000C94DE18FF2061F3842F8F7128960FB60A\r
+:10279000F894DEBF0FBECDBFDF91CF911F910F9197\r
+:1027A000FF90EF90DF90CF900C94FF18FF2091F0F6\r
+:1027B000842F8F7128960FB6F894DEBF0FBECDBF61\r
+:1027C000DF91CF911F910F91FF90EF90DF90CF900D\r
+:1027D0000C94C91828960FB6F894DEBF0FBECDBF73\r
+:1027E000DF91CF911F910F91FF90EF90DF90CF90ED\r
+:1027F0000C94BF18FF20A1F0552309F4B1CF862F08\r
+:1028000028960FB6F894DEBF0FBECDBFDF91CF91F3\r
+:102810001F910F91FF90EF90DF90CF900C941310C9\r
+:10282000552309F4B1CF862F28960FB6F894DEBF52\r
+:102830000FBECDBFDF91CF911F910F91FF90EF9011\r
+:10284000DF90CF900C94DB104F70C8010E94AB0258\r
+:1028500028960FB6F894DEBF0FBECDBFDF91CF91A3\r
+:102860001F910F91FF90EF90DF90CF900C94E6179F\r
+:102870004F70C80128960FB6F894DEBF0FBECDBFCB\r
+:10288000DF91CF911F910F91FF90EF90DF90CF904C\r
+:102890000C94170528960FB6F894DEBF0FBECDBF77\r
+:1028A000DF91CF911F910F91FF90EF90DF90CF902C\r
+:1028B00008950E94811A0E94911A0E94561A0E943D\r
+:1028C000AD1A0E94C01F0E94141F80E090E00E9479\r
+:1028D0000C0F80E090E00C94220F0E94711A0C946F\r
+:1028E00059140E94D419292F22952F7030E02C30D2\r
+:1028F00031054CF42A3031056CF422503109223074\r
+:10290000310590F407C02C30310551F02F303105DE\r
+:1029100039F00AC0803E10F0803F31F481E0089524\r
+:1029200093FB882780F9089580E00895CF93DF9383\r
+:1029300000D000D01F92CDB7DEB70F900F900F9050\r
+:102940000F900F90DF91CF910895CF93DF9300D038\r
+:1029500000D000D0CDB7DEB726960FB6F894DEBF14\r
+:102960000FBECDBFDF91CF9108951F93CF93DF931B\r
+:10297000C091790116E080917A01C81799F0D0E0F2\r
+:102980001C9FF0011D9FF00D1124E558FE4F408162\r
+:10299000518162817381848195810E94A514219661\r
+:1029A000C770E9CFDF91CF911F9108954091AB019E\r
+:1029B0005091AC016091AD017091AE018091AF0179\r
+:1029C0009091B0010C94A514CF938091B0018295A1\r
+:1029D0008F7009F05FC08091AD01882309F45AC05F\r
+:1029E00020917901A0917A016091AB017091AC01C5\r
+:1029F0008091AE019091AF0131E06F3F09F030E07E\r
+:102A0000B32FC6E02A1709F445C0009721F07F3F95\r
+:102A100021F44B2F03C041E001C040E030E040FD15\r
+:102A200035C0C29FF001C39FF00D1124E558FE4F41\r
+:102A3000418174132BC04081641328C0428141112D\r
+:102A400025C0438154814817590710F4415051095A\r
+:102A5000481B590B483C5105C8F48091B0018F7058\r
+:102A600080618093B00186E0829FF001839FF00D2A\r
+:102A70001124E058FE4F80818F70806180838BEA43\r
+:102A800091E00E943811CF910C94B5142F5F3F4F05\r
+:102A90002770B8CFCF910895CF92DF92EF92FF9237\r
+:102AA0000F931F93CF93DF93CDB7DEB762970FB627\r
+:102AB000F894DEBF0FBECDBF8C0185E0F801DE01CA\r
+:102AC0001D9601900D928A95E1F7D8014C911196CF\r
+:102AD0005C91119712966C9112971396ED90FC9061\r
+:102AE00014977091AB01E091AC012091AE0130914F\r
+:102AF000AF012115310531F0EF3F31F481E07F3F27\r
+:102B000019F403C081E001C080E0B82FB170CB2E72\r
+:102B100080FD6CC1D090AD01DD2009F4F5C0F091CD\r
+:102B2000B001E216F30638F0C701821B930B883C14\r
+:102B3000910548F09BC0209530952E0D3F1D283CF7\r
+:102B4000310508F093C08F2F807F09F052C0E51344\r
+:102B500014C0741312C0D62E61110FC0FF70F06143\r
+:102B6000F093B0010E94D6148BEA91E00E943811D4\r
+:102B70008091B001F80185836CC1EF2831F05F3F8F\r
+:102B800031F481E04F3F19F403C081E001C080E0DF\r
+:102B900080FD03C081E0862701C080E0F82FF1703E\r
+:102BA000FF2E80FF1CC08091790120917A0136E0D0\r
+:102BB000821709F428C190E0389FF001399FF00D89\r
+:102BC0001124E558FE4F7181571306C070814713D9\r
+:102BD00003C07281671303C001968770E9CFD62EB8\r
+:102BE000662309F436C18091B00181608093B00101\r
+:102BF00053C0E51308C0741306C0611104C0D801A6\r
+:102C00001596FC93AEC04D875E878D859E856A8B39\r
+:102C10000E9471146A89882329F1D62E662311F146\r
+:102C20002091B001822F82958F7090E002970CF472\r
+:102C300060C08091AB019091AC0198878F83198619\r
+:102C4000FB86EA862C87CE01079651C0E51731F145\r
+:102C50004D875E878D859E856A8B0E9471146A8977\r
+:102C600081112EC0C8010E943811A4C08F2F807F0F\r
+:102C700069F77E2DF98AE88A89890E9496148BEA81\r
+:102C800091E00E943811EBEAF1E086E0DF011D924D\r
+:102C90008A95E9F70E94D614D12CDBC07413D8CFE3\r
+:102CA0006111D6CFD8011596FC93C8010E94381146\r
+:102CB000EBEAF1E086E0DF011D928A95E9F7C9C0F1\r
+:102CC000D62E662379F22091B001822F82958F70E3\r
+:102CD00090E0029774F08091AB019091AC019A83DF\r
+:102CE00089831B82FD82EC822E83CE0101960E9495\r
+:102CF000381186E0F801ABEAB1E001900D928A95B7\r
+:102D0000E1F70E94E4146FC0E216F30628F0C70151\r
+:102D1000821B930B9C0104C0209530952E0D3F1D06\r
+:102D2000283C310508F052C0D62E662309F49ACF0C\r
+:102D3000E5132CC074132AC08091B00180FD1DC022\r
+:102D4000982F92959F70C9F0D80115968C9315977E\r
+:102D50009F3039F09F5F9295907F8F70892B1596E9\r
+:102D60008C93C8010E94381186E0F801ABEAB1E00B\r
+:102D700001900D928A95E1F736C086E0F801ABEA42\r
+:102D8000B1E001900D928A95E1F763C04D875E87AF\r
+:102D90008D859E850E947114882379F086E0F80164\r
+:102DA000ABEAB1E001900D928A95E1F70E94E4143C\r
+:102DB0000E94D614DD24D3944CC08091B001816070\r
+:102DC0008093B001C8010E94381143C07E2DF98A5A\r
+:102DD000E88A89890E949614EBEAF1E086E0DF0137\r
+:102DE0001D928A95E9F70E94D61433C0662309F430\r
+:102DF00039CF4D875E878D859E850E94711488230B\r
+:102E000009F430CFCBCF4D875E878D859E850E949C\r
+:102E1000D419292F22952F7030E0223031052CF45F\r
+:102E20009F7041F0811106C00CC0243031052CF494\r
+:102E30009F7049F4805E883020F0C8010E943811EC\r
+:102E4000CF2CDC2C06C0D80115969C91907F91F771\r
+:102E5000F8CF8D2D62960FB6F894DEBF0FBECDBFB2\r
+:102E6000DF91CF911F910F91FF90EF90DF90CF9066\r
+:102E700008951F93CF93DF93CDB7DEB72C970FB68E\r
+:102E8000F894DEBF0FBECDBF4F83588769877A871E\r
+:102E90008B879C87CE0107960E944C158823C1F032\r
+:102EA0002F8138858A859B85892B31F03F3F11F032\r
+:102EB00080E003C02F3FE1F781E0811147C04F81DF\r
+:102EC000588569857A858B859C850E94A5143EC0AE\r
+:102ED00086E0FE013796DE01119601900D928A95EB\r
+:102EE000E1F7FF81E8854A855B854115510531F0A1\r
+:102EF000EF3F31F481E0FF3F19F403C081E001C0EE\r
+:102F000080E080FD23C020917A0130E0C901019664\r
+:102F1000877099276091790170E086179707F1F122\r
+:102F2000F983EA835D834C8396E0929FD001939F5F\r
+:102F3000B00D1124A558BE4FFE01319601900D929F\r
+:102F40009A95E1F780937A010E94B51416E080917A\r
+:102F5000790190917A01891779F1189FC0011124A4\r
+:102F600085589E4F0E944C15882331F1E0917901DC\r
+:102F70001E9FF0011124E558FE4F4081518162816E\r
+:102F80007381848195810E94A5148091790190E0DC\r
+:102F900001968770992780937901D9CF0E946D148B\r
+:102FA00010927A0110927901EBEAF1E086E0DF01FC\r
+:102FB0001D928A95E9F7CACF2C960FB6F894DEBF1A\r
+:102FC0000FBECDBFDF91CF911F910895EF92FF9279\r
+:102FD0000F931F93CF93DF93FC01009709F46FC009\r
+:102FE000F12CEE24E394EF0121968491843740F490\r
+:102FF000843008F055C0813081F0823021F15FC00B\r
+:10300000853709F447C0C0F19CE7980F903708F066\r
+:1030100056C08F770E94DB1045C08F010E5F1F4F97\r
+:10302000FE01849190E2980F983050F48770FE2D45\r
+:1030300001C0FF0F8A95EAF78F2F0E94841A15C0EE\r
+:103040000E94131014C08F010E5F1F4FFE01849168\r
+:1030500090E2980F983068F48770FE2D01C0FF0F42\r
+:103060008A95EAF78F2F0E948A1A0E94AD1AE8010A\r
+:1030700019C00E94DB10FBCFCF010296FE01C49164\r
+:10308000CC2361F0EFE9FFE03197F1F700C00000D9\r
+:10309000C150F6CFCF010296FE01F490EC0102C0C0\r
+:1030A0000E9413108F2D882341F0EFE9FFE0319744\r
+:1030B000F1F700C000008150F6CFFE0194CFDF9100\r
+:1030C000CF911F910F91FF90EF9008950895609315\r
+:1030D000B5017093B6018093B7019093B8010C9439\r
+:1030E00059140F931F930091B5011091B6012091CF\r
+:1030F000B7013091B801062B172B282B392B0093E1\r
+:10310000B5011093B6012093B7013093B8011F9118\r
+:103110000F910C9459140F931F930091B5011091C6\r
+:10312000B6012091B7013091B80106231723282357\r
+:1031300039230093B5011093B6012093B701309362\r
+:10314000B8011F910F910C9459140F931F93009184\r
+:10315000B5011091B6012091B7013091B801062751\r
+:103160001727282739270093B5011093B60120931C\r
+:10317000B7013093B8011F910F910C94591410921C\r
+:10318000B1011092B2011092B3011092B4010C94EB\r
+:10319000591441E050E060E070E004C0440F551F56\r
+:1031A000661F771F8A95D2F74093B1015093B20101\r
+:1031B0006093B3017093B4010C94591441E050E052\r
+:1031C00060E070E004C0440F551F661F771F8A95AA\r
+:1031D000D2F78091B1019091B201A091B301B09169\r
+:1031E000B401842B952BA62BB72B8093B101909320\r
+:1031F000B201A093B301B093B4010C94591441E00F\r
+:1032000050E060E070E004C0440F551F661F771F58\r
+:103210008A95D2F740955095609570958091B1014F\r
+:103220009091B201A091B301B091B4018423952390\r
+:10323000A623B7238093B1019093B201A093B30169\r
+:10324000B093B4010C94591441E050E060E070E098\r
+:1032500004C0440F551F661F771F8A95D2F78091CF\r
+:10326000B1019091B201A091B301B091B401842752\r
+:103270009527A627B7278093B1019093B201A09319\r
+:10328000B301B093B4010C9459140F931F930091A0\r
+:10329000B1011091B2012091B3013091B401062B1C\r
+:1032A000172B282B392B0093B1011093B2012093D7\r
+:1032B000B3013093B4011F910F910C9459140F93E3\r
+:1032C0001F930091B1011091B2012091B30130918F\r
+:1032D000B40106231723282339230093B101109347\r
+:1032E000B2012093B3013093B4011F910F910C945C\r
+:1032F00059140F931F930091B1011091B2012091C5\r
+:10330000B3013091B40106271727282739270093E6\r
+:10331000B1011093B2012093B3013093B4011F9116\r
+:103320000F910C9459140895CF92DF92EF92FF926F\r
+:103330000F931F93CF93DF93EC01C090B501D09012\r
+:10334000B601E090B701F090B8018091B101909181\r
+:10335000B201A091B301B091B401C82AD92AEA2AD6\r
+:10336000FB2A0FE110E0B701A601002E04C07695FC\r
+:103370006795579547950A94D2F740FD05C00150CF\r
+:10338000110988F780E007C0BE01802F0E94540712\r
+:103390000197A9F3802FDF91CF911F910F91FF909B\r
+:1033A000EF90DF90CF900895CF93DF93EC010E94D0\r
+:1033B0009419BE010E945407DF91CF910895CB016B\r
+:1033C0000E94D419089590910C019923D9F09091FD\r
+:1033D0000D019923B9F0982F9695969596959F3063\r
+:1033E00088F5E0910E01F0910F01E90FF11D877052\r
+:1033F00021E030E001C0220F8A95EAF78181822B1B\r
+:103400008183089540910E0150910F0120E030E03A\r
+:103410009FEFFA01E20FF31F6281681799F09F3F57\r
+:1034200019F4611101C0922F2F5F3F4F2E303105EB\r
+:1034300081F79F3F39F0FA01E90FF11D97FDFA95E9\r
+:1034400082830895089590910C019923E1F0909161\r
+:103450000D019923C1F0982F9695969596959F30DA\r
+:1034600020F5E0910E01F0910F01E90FF11D877039\r
+:1034700021E030E001C0220F8A95EAF72095818192\r
+:1034800028232183089540910E0150910F0120E0DF\r
+:1034900030E0FA01E20FF31F9281981301C012820B\r
+:1034A0002F5F3F4F2E303105A1F7089581E090E066\r
+:1034B000E0910E01F0910F01E80FF91F10820196C3\r
+:1034C00080319105A9F708959091CC01982B9093A4\r
+:1034D000CC01089580959091CC0198239093CC01D4\r
+:1034E00008951092CC0108959091CB01982B909360\r
+:1034F000CB01089580959091CB0198239093CB01B7\r
+:1035000008951092CB0108959091CA01982B909341\r
+:10351000CA01089580959091CA0198239093CA0199\r
+:1035200008951092CA0108958093B90108951092E8\r
+:10353000B901089540910E0150910F0120E030E053\r
+:1035400080E0FA01E20FF31F918191118F5F2F5FED\r
+:103550003F4F2F303105A9F70895E0910E01F0910A\r
+:103560000F018091CC018083E0910E01F0910F0159\r
+:1035700080819091CB01892B8083E0910E01F091A5\r
+:103580000F0180819091CA01892B80839091B901AC\r
+:10359000992361F0E0910E01F0910F018081892B58\r
+:1035A00080830E949A1A81111092B90180910E01B4\r
+:1035B00090910F010C94F60ECF92DF92EF92FF9252\r
+:1035C0000F931F936C01EE24FF24C114D104E10476\r
+:1035D000F10421F46B017C0180E001C080E133271C\r
+:1035E0002F2D1E2D0D2D011511052105310519F069\r
+:1035F000885F6801790197018601A4E036952795D7\r
+:1036000017950795AA95D1F70115110521053105E3\r
+:1036100019F08C5F6801790197018601F2E0369517\r
+:10362000279517950795FA95D1F7011511052105ED\r
+:10363000310519F08E5F68017901B701A601769511\r
+:10364000679557954795452B462B472B09F08F5F7C\r
+:103650001F910F91FF90EF90DF90CF900895809190\r
+:10366000E401843021F11092CE0120E488E190E061\r
+:103670000FB6F894A895809360000FBE2093600069\r
+:1036800080E00E94EF0783B7817F846083BF83B7A8\r
+:10369000816083BF7894889583B78E7F83BF88E1EC\r
+:1036A0000FB6F89480936000109260000FBE0895EA\r
+:1036B00008950895CF930E94581B0E9423040E94EE\r
+:1036C000591BC0E08C2F0E941005811105C0CF5FEF\r
+:1036D000CE30C1F780E001C081E0CF9108950E9413\r
+:1036E0006D140E94EA0E0C94EF0782E084BD93E013\r
+:1036F00095BD9AEF97BD80936E0008952FB7F8940B\r
+:103700008091CF019091D001A091D101B091D201CF\r
+:103710002FBF0895CF92DF92EF92FF920F931F93E6\r
+:103720002FB7F8944091CF015091D0016091D10111\r
+:103730007091D2012FBF6A017B01EE24FF248C011E\r
+:1037400020E030E0C016D106E206F30610F4415046\r
+:103750005109481B590BCA011F910F91FF90EF901F\r
+:10376000DF90CF9008951F920F920FB60F92112401\r
+:103770008F939F93AF93BF938091CF019091D0018E\r
+:10378000A091D101B091D2010196A11DB11D8093EC\r
+:10379000CF019093D001A093D101B093D201BF91FA\r
+:1037A000AF919F918F910F900FBE0F901F90189522\r
+:1037B0000E94F00BF8942FEF87EA91E621508040A9\r
+:1037C0009040E1F700C0000087E090EBDC018093BF\r
+:1037D000EE019093EF01A093F001B093F1012CE082\r
+:1037E00088E190E00FB6F894A895809360000FBE32\r
+:1037F00020936000FFCFEF92FF920F931F93CF9320\r
+:10380000DF93E82EF12C8F2D0E941005C0E0D0E050\r
+:10381000082F10E098010C2E02C0359527950A94C8\r
+:10382000E2F720FD05C02196C630D10599F709C001\r
+:103830006C2F7F2D80E00E941805E812F4CF81E004\r
+:1038400005C0F3948EE0F812DECF80E0DF91CF91D7\r
+:103850001F910F91FF90EF900895CF93C82F8CE2A6\r
+:103860000E94FB1B882321F08C2FCF910C94FB1B13\r
+:1038700080E0CF910895CF930E94801D811102C0F6\r
+:103880000E94661DC5E6C15049F00E9423048FE3E3\r
+:103890009CE90197F1F700C00000F5CF89E20E9492\r
+:1038A0002D1C811111C18AE20E942D1C81110E94E0\r
+:1038B000661D85E00E942D1C81110E94D81B0E946C\r
+:1038C0008B1D8093CD0187E00E942D1C882399F1E8\r
+:1038D0008BE10E942D1C882351F09091CD0191FB2A\r
+:1038E000882780F921E0822780FB91F922C08EE0B1\r
+:1038F0000E942D1C882351F09091CD0192FB8827C6\r
+:1039000080F921E0822780FB92F913C080E10E94B8\r
+:103910002D1C9091CD01882341F093FB882780F9DD\r
+:1039200021E0822780FB93F904C0892F809580FBDA\r
+:1039300090F99093CD018091CD010E948F1D0E943E\r
+:103940009D1D8093ED0180EE0E942D1C882341F087\r
+:103950008091ED01982F909590FB80F98093ED0177\r
+:1039600089E30E942D1C882359F09091ED0191FB71\r
+:10397000882780F921E0822780FB91F99093ED015F\r
+:1039800082EE0E942D1C882359F09091ED0192FB4C\r
+:10399000882780F921E0822780FB92F99093ED013E\r
+:1039A00086EE0E942D1C882359F09091ED0193FB27\r
+:1039B000882780F921E0822780FB93F99093ED011D\r
+:1039C00083EE0E942D1C882359F09091ED0194FB09\r
+:1039D000882780F921E0822780FB94F99093ED01FC\r
+:1039E00085E30E942D1C882359F09091ED0195FBF1\r
+:1039F000882780F921E0822780FB95F99093ED01DB\r
+:103A000081E30E942D1C882359F09091ED0196FBD3\r
+:103A1000882780F921E0822780FB96F99093ED01B9\r
+:103A200081E10E942D1C882359F09091ED0197FBB4\r
+:103A3000882780F921E0822780FB97F99093ED0198\r
+:103A40008091ED010E94A11D8091ED0187FB8827E7\r
+:103A500080F980930D0187E20E942D1CC82F8EE112\r
+:103A60000E942D1C8111C2608FE10E942D1C8111CA\r
+:103A7000C46080E20E942D1C8111C86081E20E9416\r
+:103A80002D1C8111C06182E20E942D1C8111C06237\r
+:103A900083E20E942D1C8111C06484E20E942D1CCF\r
+:103AA000882311F0C06802C0CC2329F08C2F0E941B\r
+:103AB000981D6C2F03C00E94941D682F70E080E059\r
+:103AC00090E0CF910C946718CF9108956DEE7EEF42\r
+:103AD00080E090E00E94BE2360E082E090E00E94DF\r
+:103AE000AC2360E083E090E00E94AC2360E084E0DF\r
+:103AF00090E00E94AC2360E085E090E00C94AC2361\r
+:103B000080E090E00E94A62321E08D3E9E4F09F0C8\r
+:103B100020E0822F089582E090E00C949E23682F8D\r
+:103B200082E090E00C94AC2383E090E00C949E2320\r
+:103B3000682F83E090E00C94AC2384E090E00C9438\r
+:103B40009E23682F84E090E00C94AC238091D501F3\r
+:103B500080FF0BC06091130185E0689FB0011124C4\r
+:103B600075956795759567952AC081FF09C0609125\r
+:103B7000130185E0689FB0011124759567951FC0FA\r
+:103B800082FF07C06091130185E0689FB001112496\r
+:103B900016C04091D6014423C9F060911201461726\r
+:103BA00088F72091130185E0289F90011124429FFE\r
+:103BB000C001439F900D112470E00E947023603873\r
+:103BC000710540F46115710539F002C065E070E0DF\r
+:103BD000862F08958FE7089581E008958091D5019B\r
+:103BE00080FF08C06091110170E07595679575952B\r
+:103BF000679521C081FF06C06091110170E0759545\r
+:103C0000679519C082FF04C06091110170E010C077\r
+:103C10008091D6018823C1F0609110018617A0F72A\r
+:103C200090911101989FC001112470E00E947023AF\r
+:103C30006038710528F46115710521F0862F08950B\r
+:103C40008FE7089581E0089561E070E0F4CF803F50\r
+:103C500021F40E94A61D819504C0813F29F40E9491\r
+:103C6000A61D8093D9010895823F21F40E94A61DCC\r
+:103C7000819504C0833F29F40E94A61D8093D8013A\r
+:103C80000895893F19F40E94EE1D05C08A3F31F462\r
+:103C90000E94EE1D81958093DA0108958B3F21F4F7\r
+:103CA0000E94EE1D819504C08C3F29F40E94EE1DF8\r
+:103CB0008093DB010895843F21F48091D7018160D6\r
+:103CC00017C0853F21F48091D701826011C0863FE3\r
+:103CD00021F48091D70184600BC0873F21F480914B\r
+:103CE000D701886005C0883F31F48091D701806199\r
+:103CF0008093D70108958D3F21F48091D501816093\r
+:103D00000BC08E3F21F48091D501826005C08F3FAA\r
+:103D100029F48091D50184608093D5010895803F76\r
+:103D200039F48091D90187FF6CC01092D90169C024\r
+:103D3000813F29F48091D9011816BCF362C090919B\r
+:103D4000D801823F29F497FF5CC01092D80159C076\r
+:103D5000833F19F41916CCF354C0893F41F4809184\r
+:103D6000DA0118160CF04DC01092DA014AC08A3FF1\r
+:103D700029F48091DA0187FF44C0F6CF8B3F39F4F4\r
+:103D80008091DB0187FF3DC01092DB013AC08C3F80\r
+:103D900029F48091DB011816BCF333C0843F21F471\r
+:103DA0008091D7018E7F17C0853F21F48091D70184\r
+:103DB0008D7F11C0863F21F48091D7018B7F0BC08E\r
+:103DC000873F21F48091D701877F05C0883F31F478\r
+:103DD0008091D7018F7E8093D70113C08D3F21F44E\r
+:103DE0008091D5018E7F0BC08E3F21F48091D5014B\r
+:103DF0008D7F05C08F3F29F48091D5018B7F809303\r
+:103E0000D5018091D80181110EC08091D901811115\r
+:103E10000AC08091DA01811106C08091DB01811115\r
+:103E200002C01092D601089587ED91E00E94010F23\r
+:103E30000E947E1B9093D4018093D30108951F9319\r
+:103E4000CF93DF938091D3019091D4010E948A1B7C\r
+:103E50004091D601442321F02091140130E006C0A6\r
+:103E6000209115015AE0259F900111248217930794\r
+:103E700008F482C08091D8011091D901D091DA0163\r
+:103E8000C091DB01811107C0111105C0D11103C020\r
+:103E9000CC2309F471C04F3F19F04F5F4093D60116\r
+:103EA000181624F40E94A61D8093D8018091D80191\r
+:103EB00087FF05C00E94A61D81958093D801111629\r
+:103EC00024F40E94A61D8093D9018091D90187FF17\r
+:103ED00005C00E94A61D81958093D9016091D801EB\r
+:103EE000662339F11091D901112319F1772767FD64\r
+:103EF0007095872F972F0E94812223E333E343E3BA\r
+:103F00005FE30E94E5220E944E226093D801612F58\r
+:103F1000772767FD7095872F972F0E94812223E3D3\r
+:103F200033E343E35FE30E94E5220E944E22609365\r
+:103F3000D9011D1624F40E94EE1D8093DA018091B0\r
+:103F4000DA0187FF05C00E94EE1D81958093DA019A\r
+:103F50001C1624F40E94EE1D8093DB018091DB018E\r
+:103F600087FF05C00E94EE1D81958093DB01DF91E4\r
+:103F7000CF911F910C94141FDF91CF911F91089541\r
+:103F8000E7EDF1E085E0DF011D928A95E9F71092F7\r
+:103F9000D6011092D5010895833081F128F4813043\r
+:103FA00059F08230D1F00895853009F449C0B8F154\r
+:103FB000863009F456C0089520911501862F90E0AF\r
+:103FC000820F911D8F3F910520F4620F60931501C0\r
+:103FD00008958FEF80931501089520911401862F85\r
+:103FE00090E0820F911D8F3F910520F4620F609346\r
+:103FF000140108958FEF8093140108952091130107\r
+:10400000862F90E0820F911D8F3F910520F4620F63\r
+:104010006093130108958FEF809313010895209109\r
+:104020001201862F90E0820F911D8F3F910520F4A1\r
+:10403000620F6093120108958FEF8093120108952B\r
+:1040400020911101862F90E0820F911D8F3F9105E5\r
+:1040500020F4620F6093110108958FEF8093110196\r
+:10406000089520911001862F90E0820F911D8F3FBF\r
+:10407000910520F4620F6093100108958FEF8093F3\r
+:1040800010010895833011F128F4813049F0823015\r
+:1040900091F00895853081F120F18630C1F10895C5\r
+:1040A00080911501681720F4861B809315010895EF\r
+:1040B00010921501089580911401681720F4861B51\r
+:1040C00080931401089510921401089580911301B2\r
+:1040D000681720F4861B8093130108951092130132\r
+:1040E000089580911201681720F4861B80931201B5\r
+:1040F000089510921201089580911101681720F41B\r
+:10410000861B8093110108951092110108958091EA\r
+:104110001001681720F4861B8093100108951092F7\r
+:10412000100108958D3109F442C020F58E3009F454\r
+:1041300077C070F4873009F459C018F48630F1F173\r
+:1041400034C0883009F4A8C08B3009F4A5C02DC054\r
+:10415000863109F4A1C038F4803109F472C081318C\r
+:1041600009F479C022C0893109F496C08B3109F471\r
+:104170004DC01BC0853309F487C048F4873209F469\r
+:1041800083C008F473C0893209F47EC00EC0833442\r
+:1041900038F48A3308F068C0883309F47DC005C05C\r
+:1041A000833409F471C0883499F080E008950E9446\r
+:1041B00008220E94EA0E0E94EF076EC08091CD0196\r
+:1041C000817F8E7F8093CD0181E08093DD01089512\r
+:1041D0000E946D142FEF83ED90E3215080409040BA\r
+:1041E000E1F700C000000E94D81B56C09091CD019D\r
+:1041F000892F8095817080FB90F919F09660986006\r
+:104200001DC0997F977F9093CD0146C09091CD01BD\r
+:1042100091FB882780F921E0822780FB91F909C072\r
+:104220009091CD0192FB882780F921E0822780FBC5\r
+:1042300092F99093CD01882379F191609093CD010B\r
+:1042400008959091CD0193FB882780F921E0822782\r
+:1042500080FB93F9EECF0E946D1480910D0191E0E7\r
+:10426000892780930D0118C027EC01C023EE280F89\r
+:1042700061E070E080E090E004C0660F771F881F67\r
+:10428000991F2A95D2F704C061E070E080E090E0C9\r
+:104290000E9467180E946D1481E0089580E00895DF\r
+:1042A00080E00895CF93C82F8091DD01813079F0AF\r
+:1042B00018F08230D1F184C0A0910E01B0910F01AD\r
+:1042C0008C91813169F0823209F07CC009C0A091E3\r
+:1042D0000E01B0910F018C91813111F0823249F4BD\r
+:1042E0008C2F0E944E2181111DC08C2F0E94922084\r
+:1042F0001AC08C2F0E945021811114C0C43179F052\r
+:1043000048F4CB3079F0C03109F060C082E080938E\r
+:10431000DD0108C0C93219F0C83321F057C010922E\r
+:10432000DD0154C081E0817053C0C93289F118F5B4\r
+:10433000C43171F1A8F4C73009F046C08AE0809317\r
+:10434000150194E19093140193E0909313018093ED\r
+:10435000120188E08093110188E28093100134C03B\r
+:10436000CE51C63088F5EC2FF0E0E65DFE4F80813F\r
+:104370008093DC0129C0CE34E9F020F4CB3421F560\r
+:104380006AE013C0C13579F0C235F1F461E00DC0C7\r
+:104390008091DC01882319F01092DC0115C081E0C6\r
+:1043A0008093DD0115C061E006C08091DC010E94B0\r
+:1043B000CC1F0AC06AE08091DC010E94422004C048\r
+:1043C0001092DD0180E004C081E002C080E0ABCF4C\r
+:1043D000CF910895E1E8F0E080818860808380815A\r
+:1043E000816080838FB7F89493E09093890090ED7B\r
+:1043F000909388008FBF0895EFE6F0E0808182609F\r
+:1044000080830895EFE6F0E080818D7F80830895BA\r
+:10441000EFE6F0E0808192E08927808308951F9283\r
+:104420000F920FB60F9211242F933F934F935F93E8\r
+:104430006F937F938F939F93AF93BF93EF93FF936C\r
+:104440008091DE019091DF0101969093DF018093CE\r
+:10445000DE01811103C082E00E94EF07E091DF01DD\r
+:10446000E695E695F0E0E657FB4FE4918091DE019A\r
+:104470008E1303C080E00E94EF07FF91EF91BF9180\r
+:10448000AF919F918F917F916F915F914F913F91EC\r
+:104490002F910F900FBE0F901F90189504D0689425\r
+:1044A000B1118DC0089570D088F09F5790F0B92F4A\r
+:1044B0009927B751A0F0D1F0660F771F881F991F79\r
+:1044C0001AF0BA95C9F712C0B13081F077D0B1E0D7\r
+:1044D000089574C0672F782F8827B85F39F0B93FE7\r
+:1044E000CCF3869577956795B395D9F73EF490957B\r
+:1044F0008095709561957F4F8F4F9F4F0895E894F9\r
+:1045000009C097FB3EF490958095709561957F4F1B\r
+:104510008F4F9F4F9923A9F0F92F96E9BB279395C9\r
+:10452000F695879577956795B795F111F8CFFAF4D9\r
+:10453000BB0F11F460FF1BC06F5F7F4F8F4F9F4F0A\r
+:1045400016C0882311F096E911C0772321F09EE868\r
+:10455000872F762F05C0662371F096E8862F70E0CE\r
+:1045600060E02AF09A95660F771F881FDAF7880FA8\r
+:104570009695879597F9089557FD9058440F551FC4\r
+:1045800059F05F3F71F04795880F97FB991F61F0D5\r
+:104590009F3F79F087950895121613061406551F4C\r
+:1045A000F2CF4695F1DF08C0161617061806991FB8\r
+:1045B000F1CF86957105610508940895E894BB27AD\r
+:1045C00066277727CB0197F908950BD078C069D07B\r
+:1045D00028F06ED018F0952309F05AC05FC011245E\r
+:1045E000EECFCADFA0F3959FD1F3950F50E0551F92\r
+:1045F000629FF001729FBB27F00DB11D639FAA2738\r
+:10460000F00DB11DAA1F649F6627B00DA11D661F86\r
+:10461000829F2227B00DA11D621F739FB00DA11DA7\r
+:10462000621F839FA00D611D221F749F3327A00D61\r
+:10463000611D231F849F600D211D822F762F6A2FFD\r
+:1046400011249F5750408AF0E1F088234AF0EE0F82\r
+:10465000FF1FBB1F661F771F881F91505040A9F78F\r
+:104660009E3F510570F014C0AACF5F3FECF3983E17\r
+:10467000DCF3869577956795B795F795E7959F5FF6\r
+:10468000C1F7FE2B880F911D9695879597F9089590\r
+:1046900097F99F6780E870E060E008959FEF80ECF5\r
+:1046A000089500240A941616170618060906089598\r
+:1046B00000240A9412161306140605060895092EFE\r
+:1046C0000394000C11F4882352F0BB0F40F4BF2B6D\r
+:1046D00011F460FF04C06F5F7F4F8F4F9F4F0895AD\r
+:1046E00097FB072E16F4009407D077FD09D00E949F\r
+:1046F0008A2307FC05D03EF4909581959F4F08953D\r
+:10470000709561957F4F0895EE0FFF1F0590F4910E\r
+:10471000E02D0994AA1BBB1B51E107C0AA1FBB1FB8\r
+:10472000A617B70710F0A61BB70B881F991F5A953D\r
+:10473000A9F780959095BC01CD010895F999FECF18\r
+:1047400092BD81BDF89A992780B50895A8E1B0E09F\r
+:1047500042E050E00C94C623262FF999FECF92BD7B\r
+:1047600081BDF89A019700B4021639F01FBA20BD36\r
+:104770000FB6F894FA9AF99A0FBE08950196272F6A\r
+:104780000E94AD230C94AC23DC01CB01FC01F99910\r
+:10479000FECF06C0F2BDE1BDF89A319600B40D928D\r
+:0C47A00041505040B8F70895F894FFCF46\r
+:1047AC002002F1077E085B082708F4070101BA0113\r
+:1047BC0028080A03140A3F4D36394B04FE03C8037C\r
+:1047CC008F0322033B0354036D030102030405060C\r
+:0447DC0007080900C1\r
+:00000001FF\r
diff --git a/keyboard/ergodox_ez/keymaps/adnw/k_o_y/keymap.c b/keyboard/ergodox_ez/keymaps/adnw/k_o_y/keymap.c
new file mode 100644 (file)
index 0000000..e33037b
--- /dev/null
@@ -0,0 +1,185 @@
+#include "ergodox_ez.h"
+#include "debug.h"
+#include "action_layer.h"
+#include "keymap_extras/keymap_german.h"
+
+#define BASE 0 // default layer
+#define SYMB 1 // symbols
+#define MDIA 2 // media keys
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |   =    |   1  |   2  |   3  |   4  |   5  | LEFT |           | RIGHT|   6  |   7  |   8  |   9  |   0  |   -    |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * | Del    |   K  |   .  |   O  |   ,  |   Y  |  L1  |           |  L1  |   V  |   G  |   C  |   L  |   ß  |   Z    |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * | BkSp   |   H  |   A  |   E  |   I  |   U  |------|           |------|   D  |   T  |   R  |   N  |   S  |   F    |
+ * |--------+------+------+------+------+------| Hyper|           | Meh  |------+------+------+------+------+--------|
+ * | LShift |X/Ctrl|   Q  |   Ä  |   Ü  |   Ö  |      |           |      |   B  |   P  |   W  |   M  |   J  | RShift |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |Grv/L1|  '"  |AltShf| Left | Right|                                       |  Up  | Down |   [  |   ]  | ~L1  |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        | App  | LGui |       | Alt  |Ctrl/Esc|
+ *                                 ,------|------|------|       |------+--------+------.
+ *                                 |      |      | Home |       | PgUp |        |      |
+ *                                 | Space|Enter |------|       |------|  Tab   |RShift|
+ *                                 |      |      | End  |       | PgDn |        |      |
+ *                                 `--------------------'       `----------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[BASE] = KEYMAP(  // layer 0 : default
+        // left hand
+        KC_EQL,         KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   KC_LEFT,
+        KC_DELT,        DE_K,         DE_DOT, DE_O,   DE_COMM,DE_Y,   TG(SYMB),
+        KC_BSPC,        DE_H,         DE_A,   DE_E,   DE_I,   DE_U,
+        KC_LSFT,        CTL_T(DE_X),  DE_Q,   DE_AE,  DE_UE,  DE_OE,  ALL_T(KC_NO),
+        LT(SYMB,KC_GRV),KC_QUOT,      LALT(KC_LSFT),  KC_LEFT,KC_RGHT,
+                                              ALT_T(KC_APP),  KC_LGUI,
+                                                              KC_HOME,
+                                               KC_SPC,KC_ENT ,KC_END,
+        // right hand
+        KC_RGHT,     KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
+        TG(SYMB),    DE_V,   DE_G,   DE_C,   DE_L,   DE_SS,            DE_Z,
+                     DE_D,   DE_T,   DE_R,   DE_N,   LT(MDIA, DE_S),   GUI_T(KC_F),
+        MEH_T(KC_NO),KC_B,   KC_P,   KC_W,   KC_M,   CTL_T(KC_J),      KC_RSFT,
+                          KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC,          KC_FN1,
+        KC_LALT,        CTL_T(KC_ESC),
+        KC_PGUP,
+        KC_PGDN,KC_TAB, KC_RSFT
+    ),
+/* Keymap 1: Symbol Layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |   !  |   @  |   {  |   }  |   |  |      |           |      |   Up |   7  |   8  |   9  |   *  |   F12  |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   #  |   $  |   (  |   )  |   `  |------|           |------| Down |   4  |   5  |   6  |   +  |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   %  |   ^  |   [  |   ]  |   ~  |      |           |      |   &  |   1  |   2  |   3  |   \  |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |      |    . |   0  |   =  |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |------|       |------|      |      |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+// SYMBOLS
+[SYMB] = KEYMAP(
+       // left hand
+       KC_TRNS,KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_TRNS,
+       KC_TRNS,KC_EXLM,KC_AT,  KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
+       KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
+       KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,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,    KC_ASTR, KC_F12,
+                KC_DOWN, KC_4,   KC_5,    KC_6,    KC_PLUS, KC_TRNS,
+       KC_TRNS, KC_AMPR, KC_1,   KC_2,    KC_3,    KC_BSLS, KC_TRNS,
+                         KC_TRNS,KC_DOT,  KC_0,    KC_EQL,  KC_TRNS,
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS
+),
+/* Keymap 2: Media and mouse keys
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |      |      | MsUp |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |MsLeft|MsDown|MsRght|      |------|           |------|      |      |      |      |      |  Play  |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      | Prev | Next |      |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      | Lclk | Rclk |                                       |VolUp |VolDn | Mute |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |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_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
+                                           KC_TRNS, KC_TRNS,
+                                                    KC_TRNS,
+                                  KC_TRNS, KC_TRNS, KC_TRNS,
+    // right hand
+       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_MPLY,
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
+                          KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_WBAK
+),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_LAYER_TAP_TOGGLE(SYMB)                // FN1 - Momentary Layer 1 (Symbols)
+};
+
+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;
+};
+
+// 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) {
+      // TODO: Make this relevant to the ErgoDox EZ.
+        case 1:
+            ergodox_right_led_1_on();
+            break;
+        case 2:
+            ergodox_right_led_2_on();
+            break;
+        default:
+            // none
+            break;
+    }
+
+};
diff --git a/keyboard/ergodox_ez/keymaps/adnw/k_o_y/readme.md b/keyboard/ergodox_ez/keymaps/adnw/k_o_y/readme.md
new file mode 100644 (file)
index 0000000..f0dd381
--- /dev/null
@@ -0,0 +1,7 @@
+# Basic implementation for k.o,y variant of the adnw layout
+
+adnw is a layout optimised for usage with german and english language
+k.o,y is a variant of this layout
+http://www.adnw.de/index.php?n=Main.SeitlicheNachbaranschl%C3%A4ge
+
+The os must use the de_DE layout
index 81b49ceff9490c65d95b08c6559a881e623f0cea..c57ffbb889ae91eeb1cb27f9e4186d08f3388cb2 100644 (file)
@@ -36,7 +36,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 [BASE] = KEYMAP(  // layer 0 : default
         // left hand
         KC_EQL,         KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   KC_LEFT,
-        KC_DELT,        KC_Q,         KC_W,   KC_E,   KC_R,   KC_T,   TG(1),
+        KC_DELT,        KC_Q,         KC_W,   KC_E,   KC_R,   KC_T,   TG(SYMB),
         KC_BSPC,        KC_A,         KC_S,   KC_D,   KC_F,   KC_G,
         KC_LSFT,        CTL_T(KC_Z),  KC_X,   KC_C,   KC_V,   KC_B,   ALL_T(KC_NO),
         LT(SYMB,KC_GRV),KC_QUOT,      LALT(KC_LSFT),  KC_LEFT,KC_RGHT,
@@ -45,7 +45,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                                KC_SPC,KC_BSPC,KC_END,
         // right hand
              KC_RGHT,     KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
-             TG(1),       KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSLS,
+             TG(SYMB),       KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSLS,
                           KC_H,   KC_J,   KC_K,   KC_L,   LT(MDIA, KC_SCLN),KC_LGUI,
              MEH_T(KC_NO),KC_N,   KC_M,   KC_COMM,KC_DOT, CTL_T(KC_SLSH),   KC_RSFT,
                                   KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC,          KC_FN1,
@@ -117,7 +117,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  *                                 `--------------------'       `--------------------'
  */
 // MEDIA AND MOUSE
-KEYMAP(
+[MDIA] = KEYMAP(
        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
        KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
        KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
diff --git a/keyboard/ergodox_ez/keymaps/erez_experimental/config_user.h b/keyboard/ergodox_ez/keymaps/erez_experimental/config_user.h
new file mode 100644 (file)
index 0000000..d19c278
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H
+
+#include "config.h"
+#define ONESHOT_TAP_TOGGLE 2
+#define ONESHOT_TIMEOUT 3000
+
+#endif
index ab32e94dd223fd44318cadc3e6840e9d48b885c0..bdd707165f34c86bc8276950137ecce5cd0951d2 100644 (file)
-:100000000C9465020C94A9020C94A9020C94A90208\r
-:100010000C94A9020C94A9020C94A9020C94A902B4\r
-:100020000C94A9020C94A9020C94A00C0C94720DCF\r
-:100030000C94A9020C94A9020C94A9020C94A90294\r
-:100040000C94A9020C9446220C94A9020C94A902C7\r
-:100050000C94A9020C94EA1B0C94A9020C94A9021A\r
-:100060000C94A9020C94A9020C94A9020C94A90264\r
-:100070000C94A9020C94A9020C94A9020C94A90254\r
-:100080000C94A9020C94A9020C94A9020C94A90244\r
-:100090000C94A9020C94A9020C94A9020C94A90234\r
-:1000A0000C94A9020C94A9020C94A902D70DF90D85\r
-:1000B000E40EF90DE40E3B0E5E0EE40EB30EC60E1A\r
-:1000C000C011C0110112011243127F127F147F145C\r
-:1000D00097127F148E138E1359147F147F146D148E\r
-:1000E0000000F0A12E004C002A00003035810000F5\r
-:1000F0001E00140004001D7134004D001F001A0082\r
-:1001000016001B00E104C1002000080007000600E3\r
-:1001100050002C0021001500090019004F004A0072\r
-:10012000220017000A000500000065745000015409\r
-:1001300000002F7F0000E3004F00015400003077E3\r
-:100140000000E20023001C000B00110000002971D8\r
-:10015000240018000D74100052004B0025000C0004\r
-:100160000E00360051002800260012000F00370054\r
-:100170002F002B81270013003382387130004E008E\r
-:100180002D003100347801302D0000000100010005\r
-:1001900001000100010000003A001E0022002602BA\r
-:1001A000010001003B001F002300270201000100A5\r
-:1001B0003C00200024002F004B0101003D002100E5\r
-:1001C000250030004E0101003E00010026002700FE\r
-:1001D000000001000100010000000100000001001A\r
-:1001E0000100010000000100000001003F000100CB\r
-:1001F0002402310200000100400022022D022602EA\r
-:100200000100010041002E002D0027020100010025\r
-:1002100042001F0213002000010001004300010002\r
-:100220002E02010001000100440045000100010010\r
-:1002300001000000010001000100010001000000B8\r
-:1002400001000100010001000100010001000100A6\r
-:10025000F2000100010001000100F000F1000100C6\r
-:10026000F400010001000100F3000100F5000100AD\r
-:100270000100010001000100000001000100010077\r
-:100280000000010000000100010001000000010069\r
-:100290000000010001000100010001000000010058\r
-:1002A0000100010001000100A9000100010001009E\r
-:1002B0000100AC00AA00B600010001000100AB0083\r
-:1002C000A80001000100010001000100010001007F\r
-:1002D00001000100AE00010001000000160345000E\r
-:1002E000720067006F0044006F0078002000450036\r
-:1002F0005A00000016034500720067006F004400BA\r
-:100300006F007800200045005A0000000403090433\r
-:1003100009026D00040100A0FA09040000010301B4\r
-:100320000100092111010001223F00070581030896\r
-:10033000000A090401000103010200092111010062\r
-:1003400001224D000705820308000A09040200018A\r
-:100350000300000009211101000122360007058376\r
-:100360000308000A09040300010300000009211129\r
-:100370000100012239000705840310000112011059\r
-:100380000100000008EDFE07130100010200010555\r
-:10039000010906A101050719E029E71500250195C6\r
-:1003A0000875018102050819012905950575019156\r
-:1003B000029501750391010507190029771500259C\r
-:1003C00001957875018102C005010980A1018502AE\r
-:1003D00016010026B7001A01002AB7007510950112\r
-:1003E0008100C0050C0901A1018503160100269CAE\r
-:1003F000021A01002A9C02751095018100C00501B6\r
-:100400000902A1010901A100050919012905150029\r
-:10041000250195057501810295017503810105018D\r
-:10042000093009311581257F950275088106093843\r
-:100430001581257F950175088106050C0A3802157E\r
-:1004400081257F950175088106C0C005010906A1B7\r
-:1004500001050719E029E7150025019508750181B7\r
-:100460000295017508810105081901290595057591\r
-:100470000191029501750391010507190029FF15E6\r
-:100480000025FF950675088100C0000000000000EF\r
-:100490000000000000010204060A0F17202C3A4A4F\r
-:1004A0005D71879DB3C7DAE9F5FCFFFCF5E9DAC7B2\r
-:1004B000B39D87715D4A3A2C20170F0A060402018A\r
-:1004C0000000000000000000000011241FBECFEF5C\r
-:1004D000DAE0DEBFCDBF04B603FE24C08091F00198\r
-:1004E0009091F101A091F201B091F3018730904B0E\r
-:1004F000A740B04BB9F41092F0011092F1011092A4\r
-:10050000F2011092F30114BE84B7877F84BF88E1A3\r
-:100510000FB6F89480936000109260000FBEE0E088\r
-:10052000FFE3099511E0A0E0B1E0EAE1F8E402C0E0\r
-:1005300005900D92A433B107D9F711E0A4E3B1E01F\r
-:1005400001C01D92A03FB107E1F70E94E6090C949B\r
-:100550000B240C940000662319F06130F1F03DC0CB\r
-:10056000FC018281882341F00E94B51B90933501E4\r
-:100570008093340181EE1CC080913401909135014B\r
-:100580000E94C11B8634910534F486E20E94481013\r
-:1005900086E20E94101181EE1EC0FC018281882338\r
-:1005A00051F00E94B51B909335018093340185EE84\r
-:1005B0000E94481012C080913401909135010E9430\r
-:1005C000C11B8634910534F487E20E94481087E20B\r
-:1005D0000E94101185EE0E94101180E090E00895B5\r
-:1005E00008956091B3017091B4018091B50190912B\r
-:1005F000B6010E94131B56985E9825982D98269850\r
-:100600002E9827982F98813019F0823021F0089584\r
-:10061000259A2D9A0895269A2E9A08950C94F102FF\r
-:1006200056985E9825982D9826982E9827982F985A\r
-:100630008FEF90E0909389008093880090938B00D7\r
-:1006400080938A0090938D0080938C00259A2D9A38\r
-:100650002FEF80E792E0215080409040E1F700C00A\r
-:100660000000269A2E9A2FEF80E792E021508040DA\r
-:100670009040E1F700C00000279A2F9A2FEF80E703\r
-:1006800092E0215080409040E1F700C000002598A2\r
-:100690002D982FEF80E792E0215080409040E1F7C5\r
-:1006A00000C0000026982E982FEF80E792E021509E\r
-:1006B00080409040E1F700C0000027982F9856989E\r
-:1006C0005E9825982D9826982E9827982F9808950B\r
-:1006D00089EA8093800089E08093810024982C9897\r
-:1006E0003F988AB18F748AB96E98479A8BB1806BA4\r
-:1006F0008BB9769A0E9410030C94F00280E28093EA\r
-:1007000000018091360181110EC00E94CD0381E06D\r
-:10071000809336012FEF83ED90E32150804090408D\r
-:10072000E1F700C0000080E40E94D3038093000141\r
-:1007300081112EC00E94FD0380930001811128C009\r
-:100740000E94FD0380930001811122C08FE30E946B\r
-:10075000FD038093000181111BC00E94F50380E41A\r
-:100760000E94D30380930001811112C08CE00E948B\r
-:10077000FD038093000181110BC00E94FD03809353\r
-:100780000001811105C08FE30E94FD0380930001E9\r
-:100790000E94F5038091000108951092B9008AE04B\r
-:1007A0008093B800089594EA9093BC009091BC00A7\r
-:1007B00097FFFCCF9091B900987F983021F090314D\r
-:1007C00011F081E008958093BB0084E88093BC0021\r
-:1007D0008091BC0087FFFCCF8091B900887F883171\r
-:1007E00011F0803471F780E0089584E98093BC00B3\r
-:1007F0008091BC0084FDFCCF08958093BB0084E809\r
-:100800008093BC008091BC0087FFFCCF9091B90021\r
-:10081000987F81E0983209F480E0089584E880931D\r
-:10082000BC008091BC0087FFFCCF8091BB00089585\r
-:1008300080910001811115C080E40E94D303809350\r
-:10084000000181110CC082E10E94FD038093000130\r
-:10085000811105C08FEF0E94FD03809300010E946B\r
-:10086000F50384B1807F84B985B1807F85B98AB171\r
-:10087000837F8AB98BB1837F8BB93E984698089560\r
-:100880000E947E03809300010E94180480B38C7044\r
-:1008900080BB81B3836F81BBE6E4F1E0A8E3B1E004\r
-:1008A00011921D9281E0E435F807D1F70C946803AA\r
-:1008B000BF92CF92DF92EF92FF920F931F93CF934D\r
-:1008C000DF9380910001882379F0809137018F5F59\r
-:1008D00080933701811108C00E947E03809300013C\r
-:1008E000811102C00E94100308E311E0C0E0D0E0D3\r
-:1008F000DD24D39482E0C82EEE24E394F12CC7309B\r
-:1009000000F580910001811162C080E40E94D30350\r
-:1009100080930001811112C082E10E94FD03809347\r
-:10092000000181110BC0C7010C2E01C0880F0A9471\r
-:10093000EAF780950E94FD03809300010E94F50371\r
-:1009400046C0CA30A1F028F4C83059F0C93061F06F\r
-:1009500005C0CC3089F070F0CD3089F0209A28980D\r
-:1009600010C0219A29980DC0229A2A980AC0239A69\r
-:100970002B9807C0529A01C0539A5B9802C03E9AC6\r
-:100980004698E0EAEA95F1F78FB179995AC092E07A\r
-:1009900081708D25892B7C9B02C090E001C094E082\r
-:1009A000892B7D9B02C090E001C098E0892B7E9B43\r
-:1009B00002C090E001C090E1892B9FB19095991FF2\r
-:1009C0009927991F9295990F907E892B0FC080913E\r
-:1009D000000181114BC080E40E94D3038093000189\r
-:1009E000882389F1B12C0E94F5038B2DF8019081A9\r
-:1009F000981719F08083C09201010E941804219673\r
-:100A00000F5F1F4FCE30D10509F079CF80910101E2\r
-:100A1000882371F1815080930101882339F08FE997\r
-:100A20009FE00197F1F700C0000022C0A6E4B1E00A\r
-:100A3000E8E3F1E081918D9391E0E634F907D1F795\r
-:100A400017C090E0A5CF83E10E94FD0380930001D1\r
-:100A50008111C8CF81E40E94D303809300018111EA\r
-:100A6000C1CF0E940E04B82EB094BDCF80E0BECF9F\r
-:100A70000E940E0381E0DF91CF911F910F91FF90B3\r
-:100A8000EF90DF90CF90BF900895E82FF0E0EA5B01\r
-:100A9000FE4F808108950895089596E0799FF001B2\r
-:100AA000112494E5899FE00DF11D1124E60FF11D3D\r
-:100AB000EE0FFF1FEC51FF4F859194910895880F21\r
-:100AC000991F805A9040FC01859194910895880F58\r
-:100AD000991F80529F4FFC018591949108950F9327\r
-:100AE0001F93CF93DF93EC01811520E3920730F53C\r
-:100AF000811530E2930708F0B1C08B3B910588F473\r
-:100B0000883A910508F058C0853A910508F049C027\r
-:100B10008430910508F043C08130910509F4B2C1D9\r
-:100B2000AEC18F3F910509F0D0F5803F910508F0E7\r
-:100B300092C0805E9109089790F1A1C1C11581E52D\r
-:100B4000D807A8F4C23090E5D90708F09FC0C115B6\r
-:100B500020E5D20709F486C008F092C0C11580E4F0\r
-:100B6000D80708F08CC18E011127106CCCC1C115BB\r
-:100B700090E8D90758F4C11520E7D20708F07BC1E7\r
-:100B8000C11530E6D30708F423C179C1C11580E946\r
-:100B9000D80708F074C18E011F70106AB4C18E01AD\r
-:100BA000B2C1853A910509F470C1863A910509F4FC\r
-:100BB0006FC103E810E4A7C1883A910509F46BC13D\r
-:100BC000893A910509F46AC18A3A910509F469C123\r
-:100BD0008B3A910509F468C18C3A910509F467C113\r
-:100BE0008D3A910509F466C1803B910509F465C110\r
-:100BF0008E3A910509F464C18F3A910509F463C1F5\r
-:100C0000813B910509F462C1823B910509F461C100\r
-:100C1000833B910509F460C1843B910509F45FC1F0\r
-:100C2000853B910509F45EC1863B910509F45DC1E0\r
-:100C3000873B910509F45CC1883B910509F45BC1D0\r
-:100C4000893B910509F45AC18A3B910509F059C1C4\r
-:100C50000AE216E458C18C01106555C19F700E94CC\r
-:100C6000670552C10E94A2149FEF24E33CE091501B\r
-:100C700020403040E1F700C000000E940F1C43C13B\r
-:100C80008091CF0181608093CF013DC10E94B71D4B\r
-:100C9000811102C00E949D1D0E94D41D90E090937E\r
-:100CA000F0018093EF01C23080E5D80721F48091F4\r
-:100CB000EF01816086C0C43090E5D90721F48091AE\r
-:100CC000EF0182607EC0C63020E5D20721F480911A\r
-:100CD000EF01846076C0C83030E5D30719F4809105\r
-:100CE000EF0127C0CA3080E5D80721F48091EF01D9\r
-:100CF000806167C0CC3090E5D90721F48091EF0185\r
-:100D000080625FC0CE3020E5D20721F48091EF01F0\r
-:100D1000806457C0C03130E5D30721F48091EF01E2\r
-:100D200080684FC0C23180E5D80729F48091EF0177\r
-:100D30008460886046C0C33090E5D90721F4809173\r
-:100D4000EF018E7F3EC0C53020E5D20721F48091AF\r
-:100D5000EF018D7F36C0C73030E5D30721F4809195\r
-:100D6000EF018B7F2EC0C93080E5D80719F4809140\r
-:100D7000EF0126C0CB3090E5D90721F48091EF0137\r
-:100D80008F7E1FC0CD3020E5D20721F48091EF0186\r
-:100D90008F7D17C0CF3030E5D30721F48091EF016C\r
-:100DA0008F7B0FC0C13180E5D80721F48091EF011E\r
-:100DB0008F7707C0C331D04531F48091EF018B7F2D\r
-:100DC000877F8093EF018091EF010E94D81D9BC027\r
-:100DD0008D2F99278F70992781309105E9F48E0125\r
-:100DE000037011279C0102C0220F331F0A95E2F7FE\r
-:100DF00089011C68CE0164E0880F991F6A95E1F7AC\r
-:100E000088279370082B192B73E0CC0FDD1F7A9580\r
-:100E1000E1F7C076DD272CC08230910529F41C2F24\r
-:100E20000027016F106A6FC08330910561F4CE0115\r
-:100E30008370992701E010E002C0000F111F8A950E\r
-:100E4000E2F71C680EC0049709F05DC0CE01837004\r
-:100E5000992701E010E002C0000F111F8A95E2F708\r
-:100E60001A6843E0CC0FDD1F4A95E1F7C07ED770CA\r
-:100E70000C2B1D2B48C08E011F70106244C000E077\r
+:100000000C945C020C94A0020C94A0020C94A0022C\r
+:100010000C94A0020C94A0020C94A0020C94A002D8\r
+:100020000C94A0020C94A0020C94970C0C94690DF3\r
+:100030000C94D61B0C94A0020C94A0020C94A00269\r
+:100040000C94A0020C94A0020C94A0020C94A002A8\r
+:100050000C94A0020C943D1C0C94A0020C94A002E1\r
+:100060000C94A0020C94A0020C94A0020C94A00288\r
+:100070000C94A0020C94A0020C94A0020C94A00278\r
+:100080000C94A0020C94A0020C94A0020C94A00268\r
+:100090000C94A0020C94A0020C94A0020C94A00258\r
+:1000A0000C94A0020C94A0020C94A002CE0DF00DB2\r
+:1000B000DB0EF00DDB0E320E550EDB0EAA0EBD0E62\r
+:1000C000CC11CC11FB11FB1146126812CF13CF13C8\r
+:1000D0007312CF131C131C13C013CF13CF13C913E8\r
+:1000E0002913291329132913291329132913291330\r
+:1000F0002913291329132913291329132913291320\r
+:100100003A1348134F13561360130000F0A100C8B0\r
+:1001100001C82E004C002A000030358100001E006E\r
+:10012000140004001D7134004D001F001A00160059\r
+:100130001B00E104C1002000080007000600500079\r
+:100140002C0021001500090019004F004A00220070\r
+:1001500017000A00050000006574500001540000FB\r
+:100160002F7F0000E3004F000154000030770000B3\r
+:10017000E20023001C000B00110000002971240084\r
+:1001800018000D74100052004B0025000C000E00EA\r
+:10019000360051002800260012000F0037002F0003\r
+:1001A0002B81270013003382387130004E002D0060\r
+:1001B0003100347801302D81000001000100010080\r
+:1001C0000100010000003A0001001E0023000100B0\r
+:1001D00001003B0001001F002400010001003C0061\r
+:1001E0000100200025004B0101003D00010021001D\r
+:1001F00026004E0101003E00010022002700000001\r
+:1002000001000100010000000100000001000100E8\r
+:10021000010000000100000001003F000100240275\r
+:10022000310200000100400001002D021F02010008\r
+:100230000100410001002D002E00010001004200DC\r
+:1002400001001300220201000100430001002E0200\r
+:10025000010001000100440045000100010001000F\r
+:100260000000010001000100010001000000010088\r
+:1002700001004B00010001000100010001004A00E3\r
+:10028000010001000100010001004D00010001001A\r
+:100290000100010001004E00010001000100010009\r
+:1002A0000100010001000000010001000100000048\r
+:1002B0000100000001000100010000000100000039\r
+:1002C0000100010001000100010000000100010027\r
+:1002D000010001000100A90001000100010001006E\r
+:1002E000AC00AA00B600010001000100AB00A800AC\r
+:1002F00001000100010001000100010001000100F6\r
+:100300000100AE000100010000001603450072006C\r
+:1003100067006F0044006F007800200045005A001D\r
+:10032000000016034500720067006F0044006F0074\r
+:100330007800200045005A00000004030904090267\r
+:100340006D00040100A0FA0904000001030101008E\r
+:10035000092111010001223F000705810308000A5D\r
+:100360000904010001030102000921110100012219\r
+:100370004D000705820308000A090402000103007A\r
+:10038000000009211101000122360007058303083E\r
+:10039000000A090403000103000000092111010003\r
+:1003A0000122390007058403100001120110010029\r
+:1003B000000008EDFE07130100010200010501091C\r
+:1003C00006A101050719E029E71500250195087523\r
+:1003D000018102050819012905950575019102950C\r
+:1003E000017503910105071900297715002501956D\r
+:1003F0007875018102C005010980A10185021601FD\r
+:100400000026B7001A01002AB70075109501810077\r
+:10041000C0050C0901A1018503160100269C021AE2\r
+:1004200001002A9C02751095018100C00501090296\r
+:10043000A1010901A10005091901290515002501DE\r
+:10044000950575018102950175038101050109304A\r
+:1004500009311581257F95027508810609381581B6\r
+:10046000257F950175088106050C0A38021581253E\r
+:100470007F950175088106C0C005010906A1010527\r
+:100480000719E029E71500250195087501810295F6\r
+:100490000175088101050819012905950575019166\r
+:1004A000029501750391010507190029FF15002523\r
+:1004B000FF950675088100C011241FBECFEFDAE05A\r
+:1004C000DEBFCDBF04B603FE24C08091F20190913F\r
+:1004D000F301A091F401B091F5018730904BA74052\r
+:1004E000B04BB9F41092F2011092F3011092F401A2\r
+:1004F0001092F50114BE84B7877F84BF88E10FB6E0\r
+:10050000F89480936000109260000FBEE0E0FFE37B\r
+:10051000099511E0A0E0B1E0EAEEF7E402C0059031\r
+:100520000D92A433B107D9F711E0A4E3B1E001C003\r
+:100530001D92A23FB107E1F70E94DF090C94F3235B\r
+:100540000C940000CF93DF93EC01662319F0613027\r
+:1005500079F031C08A818823C9F082E00E94561167\r
+:100560008D81982F907F71F080FD0CC086E21BC0BA\r
+:100570008A818823D9F082E00E9456118D81982FBC\r
+:10058000907F71F48D818F708D8315C08D81807FF8\r
+:1005900019F086E20E94071182E00E945D110BC0F3\r
+:1005A00080FDF0CF87E20E943F1005C08D81807FE3\r
+:1005B00099F387E2EFCF80E090E0DF91CF9108954B\r
+:1005C00008956091B1017091B2018091B301909151\r
+:1005D000B4010E943D1B56985E9825982D98269848\r
+:1005E0002E9827982F98813019F0823021F00895A5\r
+:1005F000259A2D9A0895269A2E9A08950C94E10230\r
+:1006000056985E9825982D9826982E9827982F987A\r
+:100610008FEF90E0909389008093880090938B00F7\r
+:1006200080938A0090938D0080938C00259A2D9A58\r
+:100630002FEF80E792E0215080409040E1F700C02A\r
+:100640000000269A2E9A2FEF80E792E021508040FA\r
+:100650009040E1F700C00000279A2F9A2FEF80E723\r
+:1006600092E0215080409040E1F700C000002598C2\r
+:100670002D982FEF80E792E0215080409040E1F7E5\r
+:1006800000C0000026982E982FEF80E792E02150BE\r
+:1006900080409040E1F700C0000027982F985698BE\r
+:1006A0005E9825982D9826982E9827982F9808952B\r
+:1006B00089EA8093800089E08093810024982C98B7\r
+:1006C0003F988AB18F748AB96E98479A8BB1806BC4\r
+:1006D0008BB9769A0E9400030C94E00280E280932A\r
+:1006E00000018091340181110EC00E94BD0381E0A0\r
+:1006F000809334012FEF83ED90E3215080409040B0\r
+:10070000E1F700C0000080E40E94C3038093000171\r
+:1007100081112EC00E94ED0380930001811128C039\r
+:100720000E94ED0380930001811122C08FE30E949B\r
+:10073000ED038093000181111BC00E94E50380E45A\r
+:100740000E94C30380930001811112C08CE00E94BB\r
+:10075000ED038093000181110BC00E94ED03809393\r
+:100760000001811105C08FE30E94ED038093000119\r
+:100770000E94E5038091000108951092B9008AE07B\r
+:100780008093B800089594EA9093BC009091BC00C7\r
+:1007900097FFFCCF9091B900987F983021F090316D\r
+:1007A00011F081E008958093BB0084E88093BC0041\r
+:1007B0008091BC0087FFFCCF8091B900887F883191\r
+:1007C00011F0803471F780E0089584E98093BC00D3\r
+:1007D0008091BC0084FDFCCF08958093BB0084E829\r
+:1007E0008093BC008091BC0087FFFCCF9091B90042\r
+:1007F000987F81E0983209F480E0089584E880933E\r
+:10080000BC008091BC0087FFFCCF8091BB000895A5\r
+:1008100080910001811115C080E40E94C303809380\r
+:10082000000181110CC082E10E94ED038093000160\r
+:10083000811105C08FEF0E94ED03809300010E949B\r
+:10084000E50384B1807F84B985B1807F85B98AB1A1\r
+:10085000837F8AB98BB1837F8BB93E984698089580\r
+:100860000E946E03809300010E94080480B38C7084\r
+:1008700080BB81B3836F81BBE4E4F1E0A6E3B1E028\r
+:1008800011921D9281E0E235F807D1F70C945803DC\r
+:10089000BF92CF92DF92EF92FF920F931F93CF936D\r
+:1008A000DF9380910001882379F0809135018F5F7B\r
+:1008B00080933501811108C00E946E03809300016E\r
+:1008C000811102C00E94000306E311E0C0E0D0E005\r
+:1008D000DD24D39482E0C82EEE24E394F12CC730BB\r
+:1008E00000F580910001811162C080E40E94C30381\r
+:1008F00080930001811112C082E10E94ED03809378\r
+:10090000000181110BC0C7010C2E01C0880F0A9491\r
+:10091000EAF780950E94ED03809300010E94E503B1\r
+:1009200046C0CA30A1F028F4C83059F0C93061F08F\r
+:1009300005C0CC3089F070F0CD3089F0209A28982D\r
+:1009400010C0219A29980DC0229A2A980AC0239A89\r
+:100950002B9807C0529A01C0539A5B9802C03E9AE6\r
+:100960004698E0EAEA95F1F78FB179995AC092E09A\r
+:1009700081708D25892B7C9B02C090E001C094E0A2\r
+:10098000892B7D9B02C090E001C098E0892B7E9B63\r
+:1009900002C090E001C090E1892B9FB19095991F12\r
+:1009A0009927991F9295990F907E892B0FC080915E\r
+:1009B000000181114BC080E40E94C30380930001B9\r
+:1009C000882389F1B12C0E94E5038B2DF8019081D9\r
+:1009D000981719F08083C09201010E9408042196A3\r
+:1009E0000F5F1F4FCE30D10509F079CF8091010103\r
+:1009F000882371F1815080930101882339F08FE9B8\r
+:100A00009FE00197F1F700C0000022C0A4E4B1E02C\r
+:100A1000E6E3F1E081918D9391E0E434F907D1F7B9\r
+:100A200017C090E0A5CF83E10E94ED038093000101\r
+:100A30008111C8CF81E40E94C3038093000181111A\r
+:100A4000C1CF0E94FE03B82EB094BDCF80E0BECFD0\r
+:100A50000E94FE0281E0DF91CF911F910F91FF90E4\r
+:100A6000EF90DF90CF90BF900895E82FF0E0EC5B1F\r
+:100A7000FE4F808108950895089596E0799FF001D2\r
+:100A8000112494E5899FE00DF11D1124E60FF11D5D\r
+:100A9000EE0FFF1FEE5EFE4F859194910895880F33\r
+:100AA000991F86579040FC01859194910895880F75\r
+:100AB000991F865F9E4FFC018591949108950F9335\r
+:100AC0001F93CF93DF93EC01811520E3920730F55C\r
+:100AD000811530E2930708F0B1C08B3B910588F493\r
+:100AE000883A910508F058C0853A910508F049C048\r
+:100AF0008430910508F043C08130910509F4C2C1EA\r
+:100B0000BEC18F3F910509F0D0F5803F910508F0F7\r
+:100B100092C0805E9109089790F1B1C1C11581E53D\r
+:100B2000D807A8F4C23090E5D90708F09FC0C115D6\r
+:100B300020E5D20709F486C008F092C0C11580E410\r
+:100B4000D80708F09CC18E011127106CDCC1C115BB\r
+:100B500090E8D90758F4C11520E7D20708F08BC1F7\r
+:100B6000C11530E6D30708F423C189C1C11580E956\r
+:100B7000D80708F084C18E011F70106AC4C18E01AD\r
+:100B8000C2C1853A910509F480C1863A910509F4FC\r
+:100B90007FC103E810E4B7C1883A910509F47BC12D\r
+:100BA000893A910509F47AC18A3A910509F479C123\r
+:100BB0008B3A910509F478C18C3A910509F477C113\r
+:100BC0008D3A910509F476C1803B910509F475C110\r
+:100BD0008E3A910509F474C18F3A910509F473C1F5\r
+:100BE000813B910509F472C1823B910509F471C101\r
+:100BF000833B910509F470C1843B910509F46FC1F1\r
+:100C0000853B910509F46EC1863B910509F46DC1E0\r
+:100C1000873B910509F46CC1883B910509F46BC1D0\r
+:100C2000893B910509F46AC18A3B910509F069C1C4\r
+:100C30000AE216E468C18C01106565C19F700E94CC\r
+:100C4000570562C10E9419149FEF24E33CE09150C4\r
+:100C500020403040E1F700C000000E94621C53C1F8\r
+:100C60008091D30181608093D3014DC10E940A1EFF\r
+:100C7000811102C00E94F01D0E94271E90E09093F7\r
+:100C8000F2018093F101C23080E5D80721F4809110\r
+:100C9000F101816086C0C43090E5D90721F48091CC\r
+:100CA000F10182607EC0C63020E5D20721F4809138\r
+:100CB000F101846076C0C83030E5D30719F4809123\r
+:100CC000F10127C0CA3080E5D80721F48091F101F5\r
+:100CD000806167C0CC3090E5D90721F48091F101A3\r
+:100CE00080625FC0CE3020E5D20721F48091F1010F\r
+:100CF000806457C0C03130E5D30721F48091F10101\r
+:100D000080684FC0C23180E5D80729F48091F10195\r
+:100D10008460886046C0C33090E5D90721F4809193\r
+:100D2000F1018E7F3EC0C53020E5D20721F48091CD\r
+:100D3000F1018D7F36C0C73030E5D30721F48091B3\r
+:100D4000F1018B7F2EC0C93080E5D80719F480915E\r
+:100D5000F10126C0CB3090E5D90721F48091F10153\r
+:100D60008F7E1FC0CD3020E5D20721F48091F101A4\r
+:100D70008F7D17C0CF3030E5D30721F48091F1018A\r
+:100D80008F7B0FC0C13180E5D80721F48091F1013C\r
+:100D90008F7707C0C331D04531F48091F1018B7F4B\r
+:100DA000877F8093F1018091F1010E942B1EABC0DF\r
+:100DB0008D2F99278F70992781309105E9F48E0145\r
+:100DC000037011279C0102C0220F331F0A95E2F71E\r
+:100DD00089011C68CE01E4E0880F991FEA95E1F7CC\r
+:100DE00088279370082B192BF3E0CC0FDD1FFA95A1\r
+:100DF000E1F7C076DD272CC08230910529F41C2F45\r
+:100E00000027016F106A7FC08330910561F4CE0125\r
+:100E10008370992701E010E002C0000F111F8A952E\r
+:100E2000E2F71C680EC084309105A9F4CE018370EE\r
+:100E3000992701E010E002C0000F111F8A95E2F728\r
+:100E40001A6863E0CC0FDD1F6A95E1F7C07ED770AA\r
+:100E50000C2B1D2B58C08530910529F41C2F002721\r
+:100E6000046F106A50C0069709F04DC0CF71DD279E\r
+:100E70001C2F002702C08E011F70106244C000E0CA\r
 :100E800010E041C001E010E03EC001E810E43BC0CA\r
 :100E900002E810E438C002EE14E435C009EE14E4B0\r
 :100EA00032C00AEE14E42FC005EB14E42CC006EBAC\r
 :100EF00005E216E408C006E216E405C007E216E4BF\r
 :100F000002C000E014E4C801DF91CF911F910F915E\r
 :100F1000089596E0799FF001112494E5899FE00DF2\r
-:100F2000F11D1124E60FF11DEE0FFF1FEC51FF4FD5\r
+:100F2000F11D1124E60FF11DEE0FFF1FEE5EFE4FC7\r
 :100F300085919491803E9105E0F4803C910558F5AF\r
 :100F40008133910509F46FC048F48932910509F4A1\r
 :100F500063C08A32910509F46DC072C0893391056E\r
 :100F6000E9F082389105D1F08533910509F44DC03F\r
 :100F700067C0833E910581F138F4803E9105B9F058\r
 :100F8000823E9105D9F05CC0863E910561F1873EB5\r
-:100F90009105A1F155C00E945F0508952091EF01D0\r
+:100F90009105A1F155C00E944F0508952091F101DE\r
 :100FA00020FD02C021FF4CC080EE90E049C080913E\r
-:100FB000EF0180FFF9CF89E390E042C08091EF011B\r
-:100FC00082FF0EC08091EF0184FF03C080E090E0BB\r
-:100FD00037C083EE90E034C08091EF0182FFF2CF02\r
-:100FE00082EE90E02DC08091EF0183FF0BC08091D5\r
-:100FF000EF0184FDEBCF87EE90E022C08091EF01FE\r
-:1010000083FFF5CF86EE90E01BC08091EF0185FF56\r
-:1010100007C089E290E014C08091EF0185FFF9CF0D\r
-:1010200085E390E00DC08091EF0186FF07C08AE262\r
-:1010300090E006C08091EF0186FFF9CF81E390E058\r
-:101040000E946F05089508950C942308809164010F\r
+:100FB000F10180FFF9CF89E390E042C08091F10117\r
+:100FC00082FF0EC08091F10184FF03C080E090E0B9\r
+:100FD00037C083EE90E034C08091F10182FFF2CF00\r
+:100FE00082EE90E02DC08091F10183FF0BC08091D3\r
+:100FF000F10184FDEBCF87EE90E022C08091F101FA\r
+:1010000083FFF5CF86EE90E01BC08091F10185FF54\r
+:1010100007C089E290E014C08091F10185FFF9CF0B\r
+:1010200085E390E00DC08091F10186FF07C08AE260\r
+:1010300090E006C08091F10186FFF9CF81E390E056\r
+:101040000E945F05089508950C9423088091620121\r
 :101050000895CF93DF9300D01F92CDB7DEB72091D4\r
-:10106000E601243019F523E029839B838A832093AA\r
+:10106000E801243019F523E029839B838A832093A8\r
 :10107000E9008FEF9091E800815095FD06C095ED55\r
 :101080009A95F1F700008111F5CF8091E80085FF76\r
 :101090000DC040E050E063E070E0CE0101960E9498\r
-:1010A000930A8091E8008E778093E8000F900F906C\r
+:1010A0008A0A8091E8008E778093E8000F900F9075\r
 :1010B0000F90DF91CF910895CF93DF9300D01F92CF\r
-:1010C000CDB7DEB72091E601243021F522E0298357\r
+:1010C000CDB7DEB72091E801243021F522E0298355\r
 :1010D0009B838A8383E08093E9008FEF9091E800FF\r
 :1010E000815095FD06C095ED9A95F1F700008111AC\r
 :1010F000F5CF8091E80085FF0DC040E050E063E04F\r
-:1011000070E0CE0101960E94930A8091E8008E77EC\r
+:1011000070E0CE0101960E948A0A8091E8008E77F5\r
 :101110008093E8000F900F900F90DF91CF9108958A\r
-:101120002091E6012430F1F422E02093E9002FEF32\r
+:101120002091E8012430F1F422E02093E9002FEF30\r
 :101130003091E800215035FD06C035ED3A95F1F7C4\r
 :1011400000002111F5CF2091E80025FF0BC040E001\r
-:1011500050E065E070E00E94930A8091E8008E778D\r
-:101160008093E8000895CF93DF93EC018091E6012E\r
+:1011500050E065E070E00E948A0A8091E8008E7796\r
+:101160008093E8000895CF93DF93EC018091E8012C\r
 :10117000843009F046C090910C019923D9F09091E8\r
 :101180000D019923B9F08093E9008FEF9091E80069\r
 :10119000815095FD06C095E19A95F1F70000811107\r
 :1011B00070E017C081E08093E9008FEF9091E80024\r
 :1011C000815095FD06C095ED9A95F1F700008111CB\r
 :1011D000F5CF8091E80085FF14C040E050E068E062\r
-:1011E00070E0CE010E94930A8091E8008E77809390\r
-:1011F000E80080E1FE01A4E5B1E001900D928A953E\r
-:10120000E1F7DF91CF9108958091E501811109C047\r
-:101210000E94250C0E94820C8091E20084608093E1\r
-:10122000E20008951092E501089508950C94332288\r
-:101230000E94A61B0E9439220E941F0F0C942408B2\r
-:1012400042E061EC81E00E949F0B42E061EC82E0B1\r
-:101250000E949F0B42E061EC83E00E949F0B42E101\r
-:1012600061EC84E00C949F0B8091E801833009F4D9\r
-:1012700055C030F4813071F0823009F48EC0089589\r
-:101280008A3009F47AC08B3009F460C0893009F0E3\r
-:101290009CC020C08091E701813A09F096C08091FE\r
-:1012A000E800877F8093E8008091EB019091EC014A\r
-:1012B000892B21F060E080E090E003C060E184E5EC\r
-:1012C00091E070E00E94DC0A8091E8008B778093C7\r
-:1012D000E80008958091E701813209F076C080919D\r
-:1012E000EB019091EC01009719F0039709F06DC0A4\r
-:1012F0008091E800877F8093E8008091E80082FD7C\r
-:1013000005C08091E6018111F8CF5FC08091F100A6\r
-:10131000809364018091E8008B7753C08091E7014E\r
-:10132000813A09F052C08091EB019091EC01892B38\r
-:1013300009F04BC08091E800877F8093E80080919E\r
-:10134000E80080FFFCCF80910C0136C08091E7015E\r
-:101350008132D9F58091EB019091EC01892BA9F5AF\r
-:101360008091E800877F8093E8000E94D40B8091F1\r
-:10137000E90180930C010C94A2148091E701813261\r
-:1013800021F58091E800877F8093E8000E94D40BCC\r
-:101390008091EA018093650108958091E701813A87\r
-:1013A000A1F48091E800877F8093E8008091E800B5\r
-:1013B00080FFFCCF809165018093F1008091E8006F\r
-:1013C0008E778093E8000C94D40B089584B7877FC0\r
-:1013D00084BF88E10FB6F89480936000109260009B\r
-:1013E0000FBE90E080E80FB6F89480936100909370\r
-:1013F00061000FBE0E946E0F0E94250C0E94820C9D\r
-:101400008091E20084608093E20078940E94FD0E57\r
-:101410000E94700F82E091E00E941A0F0E94212228\r
-:101420008091E601853069F40E94661B8091E40199\r
-:101430008823B1F30E94911B882391F30E947D0AB7\r
-:10144000EFCF0E94760FECCF292F332723303105C1\r
-:10145000A9F06CF42130310509F442C02230310585\r
-:1014600009F043C08DE690E020E133E042C0213234\r
-:101470003105C9F02232310519F137C09927813081\r
-:10148000910541F08230910541F0892B71F5ECE036\r
-:10149000F3E005C0E4EFF2E002C0ECEDF2E084918D\r
-:1014A00090E09F0126C0643000F5E62FF0E0EE0FDB\r
-:1014B000FF1FEE5DFE4F2081318189E090E019C071\r
-:1014C000643098F4E62FF0E0DF01AA0FBB1FA65EA0\r
-:1014D000BE4F2D913C91EA5EFE4F808190E009C0A5\r
-:1014E00082E190E02DE733E004C080E090E020E06E\r
-:1014F00030E0FA0131832083089580E189BD82E1E3\r
-:1015000089BD09B400FEFDCF8091D8008F7D809306\r
-:10151000D8008091E00082608093E0008091E0003C\r
-:1015200081FDFCCF0895CF92DF92EF92FF920F934F\r
-:101530001F93CF93DF937C018B01EA010E94F50B8F\r
-:10154000811131C0209731F088819981081B190BD6\r
-:10155000E80EF91EC12CD12C0115110519F180914D\r
-:10156000E80085FD14C08091E8008E778093E80044\r
-:10157000209741F0888199818C0D9D1D99838883E6\r
-:1015800085E011C00E94F50B882331F30CC0F701F0\r
-:1015900081917F018093F10001501109FFEFCF1A73\r
-:1015A000DF0ADACF80E0DF91CF911F910F91FF909A\r
-:1015B000EF90DF90CF9008952091ED013091EE01F2\r
-:1015C0002617370748F06115710539F42091E800B6\r
-:1015D0002E772093E80001C0B901FC0120E06115DD\r
-:1015E0007105B9F18091E601882309F440C0853086\r
-:1015F00009F43FC08091E80083FD3DC08091E80080\r
-:1016000082FF06C08091E80082FF26C080E0089536\r
-:101610008091E80080FFE3CF2091F3008091F200F9\r
-:1016200090E0922B6115710551F08830910538F4E6\r
-:1016300021912093F100615071090196F3CF21E0CF\r
-:10164000089709F020E08091E8008E778093E80009\r
-:10165000C6CF2111C7CFD6CF8091E601882339F0BC\r
-:10166000853039F08091E80083FFCCCF04C082E060\r
-:10167000089583E0089581E008952091ED0130916F\r
-:10168000EE012617370748F06115710539F42091EE\r
-:10169000E8002E772093E80001C0B901FC0120E0AA\r
-:1016A00061157105C1F18091E601882309F441C0FB\r
-:1016B000853009F440C08091E80083FD3EC08091F0\r
-:1016C000E80082FF06C08091E80082FF27C080E02A\r
-:1016D00008958091E80080FFE3CF2091F30080918E\r
-:1016E000F20090E0922B6115710559F08830910558\r
-:1016F00040F424912093F1003196615071090196D4\r
-:10170000F2CF21E0089709F020E08091E8008E7781\r
-:101710008093E800C5CF2111C6CFD5CF8091E601D7\r
-:10172000882339F0853039F08091E80083FFCBCFF2\r
-:1017300004C082E0089583E0089581E00895982F21\r
-:10174000973058F59093E900981739F07091EC00B4\r
-:101750002091ED005091F00003C0242F762F50E02F\r
-:1017600021FF19C03091EB003E7F3093EB003091A8\r
-:10177000ED003D7F3093ED003091EB003160309310\r
-:10178000EB007093EC002093ED005093F00020915B\r
-:10179000EE0027FF07C09F5FD3CF8F708093E900D3\r
-:1017A00081E0089580E008958091E70187FD05C0FC\r
-:1017B0008091E80080FF0EC012C08091E80082FD99\r
-:1017C00005C08091E6018111F8CF08958091E8006D\r
-:1017D0008B7708C08091E6018111EACF089580914E\r
-:1017E000E8008E778093E80008958091E40090915E\r
-:1017F000E50045E62091EC0020FF21C02091E800A3\r
-:1018000020FD21C02091E601222389F0253089F0B6\r
-:101810002091EB0025FD0FC02091E4003091E50000\r
-:101820002817390739F3415041F0C901E3CF82E06D\r
-:10183000089583E0089581E0089584E0089520915B\r
-:10184000E80022FFDFCF80E008950E94930C0E9401\r
-:101850009B0CE0EEF0E0808181608083E8EDF0E0B9\r
-:1018600080818F77808319BCA7EDB0E08C918E7F4B\r
-:101870008C9380818F7E80831092E50108950F9371\r
-:101880001F93CF93DF930E94930C0E949B0CC8ED93\r
-:10189000D0E088818F778883888180688883888179\r
-:1018A0008F7D888319BC1092E6011092E20110929C\r
-:1018B000E4011092E30100EE10E0F80180818B7FDB\r
-:1018C000808388818160888342E060E080E00E94BC\r
-:1018D0009F0BE1EEF0E080818E7F8083E2EEF0E00E\r
-:1018E000808181608083808188608083F80180812D\r
-:1018F0008E7F8083888180618883DF91CF911F9163\r
-:101900000F910895E8EDF0E080818F7E8083E7ED10\r
-:10191000F0E080818160808384E082BF81E08093F9\r
-:10192000E5010C943F0CE8EDF0E080818E7F808330\r
-:101930001092E20008951092DA001092E1000895EA\r
-:101940001F920F920FB60F9211242F933F934F9334\r
-:101950005F936F937F938F939F93AF93BF93EF9317\r
-:10196000FF938091E10082FF0BC08091E20082FF33\r
-:1019700007C08091E1008B7F8093E1000E94FC0E04\r
-:101980008091DA0080FF1FC08091D80080FF1BC0CB\r
-:101990008091DA008E7F8093DA008091D90080FFF9\r
-:1019A0000DC080E189BD82E189BD09B400FEFDCF93\r
-:1019B00081E08093E6010E94040905C019BC1092E1\r
-:1019C000E6010E9412098091E10080FF19C0809118\r
-:1019D000E20080FF15C08091E2008E7F8093E200DC\r
-:1019E0008091E20080618093E2008091D800806263\r
-:1019F0008093D80019BC85E08093E6010E94160907\r
-:101A00008091E10084FF30C08091E20084FF2CC00F\r
-:101A100080E189BD82E189BD09B400FEFDCF8091DE\r
-:101A2000D8008F7D8093D8008091E1008F7E8093D5\r
-:101A3000E1008091E2008F7E8093E2008091E200DD\r
-:101A400081608093E2008091E201882311F084E0BC\r
-:101A500007C08091E30087FF02C083E001C081E0FE\r
-:101A60008093E6010E9418098091E10083FF29C05C\r
-:101A70008091E20083FF25C08091E100877F809301\r
-:101A8000E10082E08093E6011092E2018091E100A2\r
-:101A90008E7F8093E1008091E2008E7F8093E20050\r
-:101AA0008091E20080618093E20042E060E080E0AB\r
-:101AB0000E949F0B8091F00088608093F0000E944C\r
-:101AC0001509FF91EF91BF91AF919F918F917F91F8\r
-:101AD0006F915F914F913F912F910F900FBE0F909B\r
-:101AE0001F9018951F920F920FB60F9211242F93EB\r
-:101AF0003F934F935F936F937F938F939F93AF9396\r
-:101B0000BF93CF93EF93FF93C091E900CF70809183\r
-:101B1000EC001092E9008091F000877F8093F00044\r
-:101B200078940E94AE0D1092E9008091F0008860D8\r
-:101B30008093F000C093E900FF91EF91CF91BF91A6\r
-:101B4000AF919F918F917F916F915F914F913F9155\r
-:101B50002F910F900FBE0F901F9018951F93CF934A\r
-:101B6000DF93CDB7DEB7AA970FB6F894DEBF0FBEEE\r
-:101B7000CDBFE7EEF1E08091F100819321E0EF3EEF\r
-:101B8000F207C9F70E9434098091E80083FF1CC165\r
-:101B90002091E7013091E801832F90E08A30910590\r
-:101BA00008F012C1FC01EA5AFF4F0C94BB23203805\r
-:101BB00081F0223809F008C18091EB018F70809389\r
-:101BC000E9008091EB0085FB882780F91092E900FD\r
-:101BD00006C08091E3019091E4019111826090919F\r
-:101BE000E800977F9093E8008093F1001092F10055\r
-:101BF000C5C0822F8D7F09F0E7C0222319F0223063\r
-:101C000061F0E2C08091E901813009F0DDC033303C\r
-:101C100009F080E08093E40128C08091E9018111FE\r
-:101C200024C02091EB012F7009F4CEC02093E9006D\r
-:101C30008091EB0080FF19C08091EB00333011F4EC\r
-:101C4000806211C080618093EB0081E090E0022E01\r
-:101C500001C0880F0A94EAF78093EA001092EA0024\r
-:101C60008091EB0088608093EB001092E9008091F6\r
-:101C7000E800877F86C02111A7C01091E9011F7776\r
-:101C80008091E3008078812B8093E3008091E800CD\r
-:101C9000877F8093E8000E94D40B8091E80080FF4A\r
-:101CA000FCCF8091E30080688093E300112311F062\r
-:101CB00083E001C082E08093E60186C02058223094\r
-:101CC00008F082C08091E9019091EA018C3D23E007\r
-:101CD000920779F583E08A838AE289834FB7F89483\r
-:101CE000DE01139620E03EE051E2E32FF0E0509356\r
-:101CF0005700E49120FF03C0E295EF703F5FEF7063\r
-:101D00008E2F90E0EA3010F0C79601C0C0968D93F8\r
-:101D10009D932F5F243149F74FBF8091E800877F63\r
-:101D20008093E8006AE270E0CE0101960E94DC0A2E\r
-:101D300014C0AE014F5F5F4F6091EB010E94240A17\r
-:101D4000009709F441C02091E800277F2093E80024\r
-:101D5000BC0189819A810E943D0B8091E8008B77BC\r
-:101D60008093E80031C0203879F58091E800877FC2\r
-:101D70008093E8008091E2018093F1008091E80077\r
-:101D80008E778093E8000E94D40B1EC021111CC0E6\r
-:101D90009091E9019230C0F48091E800877F8093B0\r
-:101DA000E8009093E2010E94D40B8091E20181113E\r
-:101DB00004C08091E30087FF02C084E001C081E09D\r
-:101DC0008093E6010E9420098091E80083FF0AC009\r
-:101DD0008091E800877F8093E8008091EB0080622B\r
-:101DE0008093EB00AA960FB6F894DEBF0FBECDBF6E\r
-:101DF000DF91CF911F9108950895CF938091E601CF\r
-:101E00008823B1F08091E9008F709091EC0090FFF1\r
-:101E100002C090E801C090E0C92FC82B1092E900E1\r
-:101E20008091E80083FD0E94AE0DCF70C093E90061\r
-:101E3000CF91089590936B0180936A010895E0918A\r
-:101E40006A01F0916B01309721F00190F081E02D53\r
-:101E5000099480E00895E0916A01F0916B01309758\r
-:101E600021F00280F381E02D09940895E0916A0148\r
-:101E7000F0916B01309721F00480F581E02D0994F9\r
-:101E8000089520916801309169018217930771F0DC\r
-:101E90009093690180936801E0916A01F0916B0170\r
-:101EA000309721F00680F781E02D09940895209164\r
-:101EB0006601309167018217930771F09093670173\r
-:101EC00080936601E0916A01F0916B01309721F0F7\r
-:101ED0000084F185E02D0994089508950C946D0F08\r
-:101EE0000E94AC1B0E9440040C94721CCF92DF92A3\r
-:101EF000EF92FF920F931F93CF93DF93CDB7DEB78F\r
-:101F00002B970FB6F894DEBF0FBECDBF0E945804CA\r
-:101F10003DE6E32E31E0F32E00E010E0C02E802FEE\r
-:101F20000E944505F701D1907F01D826B1F40F5FDB\r
-:101F30001F4F0E30110591F78FEF89838A831B8223\r
-:101F40000E94B51B8160782F9D838C8349815A81C3\r
-:101F50006B818D810E94191041C09091CF0191FF3A\r
-:101F600004C08B870E944B058B8520E030E04D2D0F\r
-:101F700050E0922FBA01022E02C0759567950A941F\r
-:101F8000E2F760FF25C02E83CF82EE24E394F12C8C\r
-:101F900002C0EE0CFF1C9A95E2F790E08E219F2183\r
-:101FA00021E0892B09F420E028870E94B51B81607D\r
-:101FB000782F9A8789874E815F8168858A850E94FC\r
-:101FC0001910F801E359FE4F80818E25808306C0E9\r
-:101FD0002F5F3F4F2630310561F6A9CF0E94561F73\r
-:101FE00010916C010E941F0F1817A1F00E941F0F83\r
-:101FF00080936C012B960FB6F894DEBF0FBECDBF59\r
-:10200000DF91CF911F910F91FF90EF90DF90CF90D4\r
-:102010000C9424082B960FB6F894DEBF0FBECDBFEC\r
-:10202000DF91CF911F910F91FF90EF90DF90CF90B4\r
-:102030000895CF93DF93CDB7DEB72B970FB6F89403\r
-:10204000DEBF0FBECDBF4F83588769877A878B87E6\r
-:10205000DE01119686E0FD0111928A95E9F785E08F\r
-:10206000FE01379601900D928A95E1F749815A81D8\r
-:102070006B817C818D819E810E946E172B960FB69D\r
-:10208000F894DEBF0FBECDBFDF91CF9108950895C4\r
-:10209000CF93C82F882309F4C1C0823859F40E9415\r
-:1020A0001F0F81FDBBC089E30E941A1A0E94E41A27\r
-:1020B00089E30CC0833879F40E941F0F80FDAEC005\r
-:1020C00083E50E941A1A0E94E41A83E50E945A1AB4\r
-:1020D000CF910C94E41A843859F40E941F0F82FDAA\r
-:1020E0009DC087E40E941A1A0E94E41A87E4EECF8A\r
-:1020F0008CEF8C0F813A48F48C2F0E94892181113A\r
-:102100008DC08C2F0E941A1AE3CF80E28C0F88308A\r
-:1021100048F4C77081E001C0880FCA95EAF70E94B1\r
-:102120009B1AD6CF8BE58C0F833078F4C53A29F013\r
-:10213000C63A31F482E890E005C081E890E002C040\r
-:1021400083E890E0CF910C94410F88E58C0F8331A8\r
-:1021500008F064C0C83A39F1C93A41F1CA3A49F1C4\r
-:10216000CB3A51F1CC3A59F1CD3A61F1C03B69F12A\r
-:10217000CE3A71F1CF3A79F1C13B81F1C23B89F19D\r
-:10218000C33B91F1C43B99F1C53BA1F1C63BA9F119\r
-:10219000C73BB1F1C83BB9F1C93BC1F1CA3BC9F575\r
-:1021A0008AE292E038C082EE90E035C089EE90E09D\r
-:1021B00032C08AEE90E02FC085EB90E02CC086EB19\r
-:1021C00090E029C087EB90E026C08CEC90E023C023\r
-:1021D0008DEC90E020C083E891E01DC08AE891E09A\r
-:1021E0001AC082E991E017C084E991E014C081E24D\r
-:1021F00092E011C083E292E00EC084E292E00BC054\r
-:1022000085E292E008C086E292E005C087E292E0B3\r
-:1022100002C080E090E0CF910C94570FCF910895C9\r
-:10222000882309F44BC0823859F40E941F0F81FFA4\r
-:1022300045C089E30E941A1A0E94E41A89E30CC07F\r
-:10224000833871F40E941F0F80FF38C083E50E941D\r
-:102250001A1A0E94E41A83E50E945A1A0C94E41A8E\r
-:10226000843859F40E941F0F82FF28C087E40E941F\r
-:102270001A1A0E94E41A87E4EFCF9CEF980F913A64\r
-:1022800058F390E2980F983050F4877091E001C0B5\r
-:10229000990F8A95EAF7892F0E94A11ADFCF9BE553\r
-:1022A000980F933020F480E090E00C94410F885A0E\r
-:1022B000833120F480E090E00C94570F0895882338\r
-:1022C00021F00E949B1A0C94E41A0895882321F0AF\r
-:1022D0000E94A11A0C94E41A0895CF92DF92EF9213\r
-:1022E000FF920F931F93CF93DF93CDB7DEB728975D\r
-:1022F0000FB6F894DEBF0FBECDBF8C0185E0F801AC\r
-:10230000DE01119601900D928A95E1F7F801D080D7\r
-:10231000E180F280558152955F7023813481232BB7\r
-:1023200039F0FFEFEF1206C081E0DF1203C003C0F7\r
-:1023300081E001C080E080FDE2C2C8015F830E94AD\r
-:102340004710D982EA8269817A818F2D0E94161AFC\r
-:102350009E8388870E94CA190E949D184E815F81C2\r
-:102360006885FF2029F00E94B81A68855F814E8138\r
-:10237000E42FE295EF70F0E0E05AFF4F0C94BB239E\r
-:10238000842F807F142F1F70882311F01295107FE7\r
-:10239000FF20B1F0112309F467C280E2860F883074\r
-:1023A00028F4812F68870E949B1A04C0812F6887B8\r
-:1023B0000E94AB1A688568870E94E41A688554C237\r
-:1023C000862F68870E9410116885112309F497C22F\r
-:1023D000605E812F683018F40E94A11A02C00E942A\r
-:1023E000B11A28960FB6F894DEBF0FBECDBFDF91AD\r
-:1023F000CF911F910F91FF90EF90DF90CF900C94B1\r
-:10240000E41A242F207F842F8F70203211F08295C0\r
-:10241000807F662319F0613019F12BC0FF20B1F0E5\r
-:10242000552309F493C1513009F090C128960FB695\r
-:10243000F894DEBF0FBECDBFDF91CF911F910F91FA\r
-:10244000FF90EF90DF90CF900C94CB1A552319F0AA\r
-:10245000513009F454C28E830E94CE1A8E8189C1F4\r
-:10246000FF2021F0523008F04AC270C1511147C21A\r
-:1024700080C1FF2021F0552309F468C1F5C155231F\r
-:1024800009F477C105C2242F26952695237030E0E4\r
-:102490002115310521F021303105C9F030C2FF206E\r
-:1024A00021F0862F942F937002C080E090E0289650\r
-:1024B0000FB6F894DEBF0FBECDBFDF91CF911F9155\r
-:1024C0000F91FF90EF90DF90CF900C94410FFF2081\r
-:1024D00021F0862F942F937002C080E090E0289620\r
-:1024E0000FB6F894DEBF0FBECDBFDF91CF911F9125\r
-:1024F0000F91FF90EF90DF90CF900C94570F862FA5\r
-:10250000FF2019F00E945E1E02C00E94C61E28967F\r
-:102510000FB6F894DEBF0FBECDBFDF91CF911F91F4\r
-:102520000F91FF90EF90DF90CF900C944B1F842F72\r
-:10253000837009F076C0F110E2C1262F229526950E\r
-:102540002770220F220F862F8F70C82ED12CE12CDE\r
-:10255000F12C022E04C0CC0CDD1CEE1CFF1C0A94D6\r
-:10256000D2F764FF10C06FE070E080E090E004C03C\r
-:10257000660F771F881F991F2A95D2F7609570956F\r
-:102580008095909503C060E070E0CB01242F2695E4\r
-:1025900026952370422F50E042305105D1F0433050\r
-:1025A000510559F16C297D298E299F29413051050A\r
-:1025B00041F128960FB6F894DEBF0FBECDBFDF9174\r
-:1025C000CF911F910F91FF90EF90DF90CF900C94DF\r
-:1025D000C2186C297D298E299F2928960FB6F89458\r
-:1025E000DEBF0FBECDBFDF91CF911F910F91FF9046\r
-:1025F000EF90DF90CF900C94DC180E94C218C701B6\r
-:10260000B60128960FB6F894DEBF0FBECDBFDF919E\r
-:10261000CF911F910F91FF90EF90DF90CF900C948E\r
-:10262000A818FF2019F0842F817001C08695882397\r
-:1026300009F465C1262F229526952770220F220FB7\r
-:10264000862F8F70C82ED12CE12CF12C022E04C0C5\r
-:10265000CC0CDD1CEE1CFF1C0A94D2F764FF10C0EA\r
-:102660006FE070E080E090E004C0660F771F881F85\r
-:10267000991F2A95D2F7609570958095909503C023\r
-:1026800060E070E0CB01242F269526952370422F21\r
-:1026900050E042305105D1F04330510559F16C29D9\r
-:1026A0007D298E299F294130510541F128960FB689\r
-:1026B000F894DEBF0FBECDBFDF91CF911F910F9178\r
-:1026C000FF90EF90DF90CF900C9496196C297D29A4\r
-:1026D0008E299F2928960FB6F894DEBF0FBECDBF76\r
-:1026E000DF91CF911F910F91FF90EF90DF90CF90EE\r
-:1026F0000C94B0190E949619C701B60128960FB61E\r
-:10270000F894DEBF0FBECDBFDF91CF911F910F9127\r
-:10271000FF90EF90DF90CF900C947C19603FC9F14F\r
-:1027200018F4603E50F49BC0623F09F460C008F4A6\r
-:102730004AC0633F09F46FC092C0162F1F70842FE8\r
-:102740008F71FF2099F00E941519812F28960FB6DE\r
-:10275000F894DEBF0FBECDBFDF91CF911F910F91D7\r
-:10276000FF90EF90DF90CF900C945F110E9436198C\r
-:10277000812F28960FB6F894DEBF0FBECDBFDF9134\r
-:10278000CF911F910F91FF90EF90DF90CF900C941D\r
-:102790006611FF20A1F05111B2C0842F8F712896CD\r
-:1027A0000FB6F894DEBF0FBECDBFDF91CF911F9162\r
-:1027B0000F91FF90EF90DF90CF900C945B19523007\r
-:1027C00008F09DC0EACFFF20A1F0842F8F712896DA\r
-:1027D0000FB6F894DEBF0FBECDBFDF91CF911F9132\r
-:1027E0000F91FF90EF90DF90CF900C941519FF2080\r
-:1027F00061F3842F8F7128960FB6F894DEBF0FBE59\r
-:10280000CDBFDF91CF911F910F91FF90EF90DF909F\r
-:10281000CF900C943619FF2091F0842F8F71289659\r
-:102820000FB6F894DEBF0FBECDBFDF91CF911F91E1\r
-:102830000F91FF90EF90DF90CF900C9400192896A5\r
-:102840000FB6F894DEBF0FBECDBFDF91CF911F91C1\r
-:102850000F91FF90EF90DF90CF900C94F618FF202F\r
-:10286000A1F0552309F4B1CF862F28960FB6F8941E\r
-:10287000DEBF0FBECDBFDF91CF911F910F91FF90B3\r
-:10288000EF90DF90CF900C944810552309F4B1CF0E\r
-:10289000862F28960FB6F894DEBF0FBECDBFDF910E\r
-:1028A000CF911F910F91FF90EF90DF90CF900C94FC\r
-:1028B00010114F70C8010E94AB0228960FB6F89411\r
-:1028C000DEBF0FBECDBFDF91CF911F910F91FF9063\r
-:1028D000EF90DF90CF900C941B184F70C801289692\r
-:1028E0000FB6F894DEBF0FBECDBFDF91CF911F9121\r
-:1028F0000F91FF90EF90DF90CF900C944C052896AD\r
-:102900000FB6F894DEBF0FBECDBFDF91CF911F9100\r
-:102910000F91FF90EF90DF90CF9008950E94B81A2A\r
-:102920000E94C81A0E948D1A0E94E41A0E94F71F82\r
-:102930000E944B1F80E090E00E94410F80E090E0F9\r
-:102940000C94570F0E94A81A0C948E140E940B1A14\r
-:10295000292F22952F7030E02C3031054CF42A308D\r
-:1029600031056CF4225031092230310590F407C052\r
-:102970002C30310551F02F30310539F00AC0803E3E\r
-:1029800010F0803F31F481E0089593FB882780F9AF\r
-:10299000089580E00895CF93DF9300D000D01F9278\r
-:1029A000CDB7DEB70F900F900F900F900F90DF9183\r
-:1029B000CF910895CF93DF9300D000D000D0CDB752\r
-:1029C000DEB726960FB6F894DEBF0FBECDBFDF91FF\r
-:1029D000CF9108951F93CF93DF93C0917B0116E0B1\r
-:1029E00080917C01C81799F0D0E01C9FF0011D9FD9\r
-:1029F000F00D1124E358FE4F4081518162817381B3\r
-:102A0000848195810E94DA142196C770E9CFDF9105\r
-:102A1000CF911F9108954091AD015091AE01609109\r
-:102A2000AF017091B0018091B1019091B2010C940D\r
-:102A3000DA14CF938091B20182958F7009F05FC054\r
-:102A40008091AF01882309F45AC020917B01A091A5\r
-:102A50007C016091AD017091AE018091B0019091C7\r
-:102A6000B10131E06F3F09F030E0B32FC6E02A1723\r
-:102A700009F445C0009721F07F3F21F44B2F03C09C\r
-:102A800041E001C040E030E040FD35C0C29FF001B0\r
-:102A9000C39FF00D1124E358FE4F418174132BC0E6\r
-:102AA0004081641328C04281411125C04381548173\r
-:102AB0004817590710F441505109481B590B483C1D\r
-:102AC0005105C8F48091B2018F7080618093B2018A\r
-:102AD00086E0829FF001839FF00D1124EE57FE4F98\r
-:102AE00080818F70806180838DEA91E00E946D11FA\r
-:102AF000CF910C94EA142F5F3F4F2770B8CFCF913E\r
-:102B00000895CF92DF92EF92FF920F931F93CF938E\r
-:102B1000DF93CDB7DEB762970FB6F894DEBF0FBE76\r
-:102B2000CDBF8C0185E0F801DE011D9601900D926C\r
-:102B30008A95E1F7D8014C9111965C911197129604\r
-:102B40006C9112971396ED90FC9014977091AD01D3\r
-:102B5000E091AE012091B0013091B1012115310514\r
-:102B600031F0EF3F31F481E07F3F19F403C081E0A1\r
-:102B700001C080E0B82FB170CB2E80FD6CC1D09029\r
-:102B8000AF01DD2009F4F5C0F091B201E216F306C1\r
-:102B900038F0C701821B930B883C910548F09BC01D\r
-:102BA000209530952E0D3F1D283C310508F093C02F\r
-:102BB0008F2F807F09F052C0E51314C0741312C028\r
-:102BC000D62E61110FC0FF70F061F093B2010E9428\r
-:102BD0000B158DEA91E00E946D118091B201F80110\r
-:102BE00085836CC1EF2831F05F3F31F481E04F3FC6\r
-:102BF00019F403C081E001C080E080FD03C081E0E2\r
-:102C0000862701C080E0F82FF170FF2E80FF1CC0E6\r
-:102C100080917B0120917C0136E0821709F428C164\r
-:102C200090E0389FF001399FF00D1124E358FE4FDA\r
-:102C30007181571306C07081471303C072816713F7\r
-:102C400003C001968770E9CFD62E662309F436C1FA\r
-:102C50008091B20181608093B20153C0E51308C036\r
-:102C6000741306C0611104C0D8011596FC93AEC060\r
-:102C70004D875E878D859E856A8B0E94A6146A8922\r
-:102C8000882329F1D62E662311F12091B201822FDB\r
-:102C900082958F7090E002970CF460C08091AD0136\r
-:102CA0009091AE0198878F831986FB86EA862C87E0\r
-:102CB000CE01079651C0E51731F14D875E878D85AE\r
-:102CC0009E856A8B0E94A6146A8981112EC0C80154\r
-:102CD0000E946D11A4C08F2F807F69F77E2DF98A25\r
-:102CE000E88A89890E94CB148DEA91E00E946D11D7\r
-:102CF000EDEAF1E086E0DF011D928A95E9F70E9496\r
-:102D00000B15D12CDBC07413D8CF6111D6CFD801ED\r
-:102D10001596FC93C8010E946D11EDEAF1E086E082\r
-:102D2000DF011D928A95E9F7C9C0D62E662379F294\r
-:102D30002091B201822F82958F7090E0029774F0FB\r
-:102D40008091AD019091AE019A8389831B82FD82AF\r
-:102D5000EC822E83CE0101960E946D1186E0F8016F\r
-:102D6000ADEAB1E001900D928A95E1F70E94191544\r
-:102D70006FC0E216F30628F0C701821B930B9C017B\r
-:102D800004C0209530952E0D3F1D283C310508F0DC\r
-:102D900052C0D62E662309F49ACFE5132CC07413C3\r
-:102DA0002AC08091B20180FD1DC0982F92959F701E\r
-:102DB000C9F0D80115968C9315979F3039F09F5F15\r
-:102DC0009295907F8F70892B15968C93C8010E94E5\r
-:102DD0006D1186E0F801ADEAB1E001900D928A959F\r
-:102DE000E1F736C086E0F801ADEAB1E001900D925E\r
-:102DF0008A95E1F763C04D875E878D859E850E9429\r
-:102E0000A614882379F086E0F801ADEAB1E00190DC\r
-:102E10000D928A95E1F70E9419150E940B15DD2489\r
-:102E2000D3944CC08091B20181608093B201C801FB\r
-:102E30000E946D1143C07E2DF98AE88A89890E941B\r
-:102E4000CB14EDEAF1E086E0DF011D928A95E9F707\r
-:102E50000E940B1533C0662309F439CF4D875E8776\r
-:102E60008D859E850E94A614882309F430CFCBCF90\r
-:102E70004D875E878D859E850E940B1A292F22958E\r
-:102E80002F7030E0223031052CF49F7041F0811119\r
-:102E900006C00CC0243031052CF49F7049F4805ECC\r
-:102EA000883020F0C8010E946D11CF2CDC2C06C0A8\r
-:102EB000D80115969C91907F91F7F8CF8D2D629651\r
-:102EC0000FB6F894DEBF0FBECDBFDF91CF911F913B\r
-:102ED0000F91FF90EF90DF90CF9008951F93CF93C5\r
-:102EE000DF93CDB7DEB72C970FB6F894DEBF0FBED9\r
-:102EF000CDBF4F83588769877A878B879C87CE01A0\r
-:102F000007960E9481158823C1F02F8138858A8514\r
-:102F10009B85892B31F03F3F11F080E003C02F3FAC\r
-:102F2000E1F781E0811147C04F81588569857A8535\r
-:102F30008B859C850E94DA143EC086E0FE013796A0\r
-:102F4000DE01119601900D928A95E1F7FF81E885E7\r
-:102F50004A855B854115510531F0EF3F31F481E041\r
-:102F6000FF3F19F403C081E001C080E080FD23C071\r
-:102F700020917C0130E0C90101968770992760910A\r
-:102F80007B0170E086179707F1F1F983EA835D838F\r
-:102F90004C8396E0929FD001939FB00D1124A358CB\r
-:102FA000BE4FFE01319601900D929A95E1F7809304\r
-:102FB0007C010E94EA1416E080917B0190917C01D3\r
-:102FC000891779F1189FC001112483589E4F0E94E0\r
-:102FD0008115882331F1E0917B011E9FF0011124BE\r
-:102FE000E358FE4F408151816281738184819581D4\r
-:102FF0000E94DA1480917B0190E0019687709927F6\r
-:1030000080937B01D9CF0E94A21410927C01109270\r
-:103010007B01EDEAF1E086E0DF011D928A95E9F798\r
-:10302000CACF2C960FB6F894DEBF0FBECDBFDF918E\r
-:10303000CF911F910895EF92FF920F931F93CF931B\r
-:10304000DF939C01009709F471C0F12CEE24E39406\r
-:10305000E9012196F9018491843740F4843008F025\r
-:1030600056C0813081F0823021F160C0853709F48B\r
-:1030700049C0C0F19CE7980F903708F057C08F7790\r
-:103080000E94101146C089010E5F1F4FFE018491FE\r
-:1030900090E2980F983050F48770FE2D01C0FF0F1A\r
-:1030A0008A95EAF78F2F0E94BB1A15C00E9448101C\r
-:1030B00014C089010E5F1F4FFE01849190E2980FAA\r
-:1030C000983068F48770FE2D01C0FF0F8A95EAF7EB\r
-:1030D0008F2F0E94C11A0E94E41AE8011AC00E94B0\r
-:1030E0001011FBCF2E5F3F4FFE01C491CC2341F066\r
-:1030F0008FE99FE00197F1F700C00000C150F6CFC3\r
-:10310000E90107C0FE01F490E901229602C00E9485\r
-:1031100048108F2D882341F0EFE9FFE03197F1F758\r
-:1031200000C000008150F6CF9E0192CFDF91CF9179\r
-:103130001F910F91FF90EF90089508956093B7014C\r
-:103140007093B8018093B9019093BA010C948E14D6\r
-:103150000F931F930091B7011091B8012091B9010D\r
-:103160003091BA01062B172B282B392B0093B7016E\r
-:103170001093B8012093B9013093BA011F910F91B8\r
-:103180000C948E140F931F930091B7011091B80106\r
-:103190002091B9013091BA0106231723282339233E\r
-:1031A0000093B7011093B8012093B9013093BA018D\r
-:1031B0001F910F910C948E140F931F930091B701E0\r
-:1031C0001091B8012091B9013091BA010627172753\r
-:1031D000282739270093B7011093B8012093B9012C\r
-:1031E0003093BA011F910F910C948E141092B30179\r
-:1031F0001092B4011092B5011092B6010C948E1485\r
-:1032000041E050E060E070E004C0440F551F661FCD\r
-:10321000771F8A95D2F74093B3015093B40160931E\r
-:10322000B5017093B6010C948E1441E050E060E05B\r
-:1032300070E004C0440F551F661F771F8A95D2F7B0\r
-:103240008091B3019091B401A091B501B091B60104\r
-:10325000842B952BA62BB72B8093B3019093B401AD\r
-:10326000A093B501B093B6010C948E1441E050E0E8\r
-:1032700060E070E004C0440F551F661F771F8A95F9\r
-:10328000D2F740955095609570958091B3019091DB\r
-:10329000B401A091B501B091B60184239523A62372\r
-:1032A000B7238093B3019093B401A093B501B09379\r
-:1032B000B6010C948E1441E050E060E070E004C070\r
-:1032C000440F551F661F771F8A95D2F78091B3016F\r
-:1032D0009091B401A091B501B091B60184279527D2\r
-:1032E000A627B7278093B3019093B401A093B501AB\r
-:1032F000B093B6010C948E140F931F930091B301F9\r
-:103300001091B4012091B5013091B601062B172B15\r
-:10331000282B392B0093B3011093B4012093B501EE\r
-:103320003093B6011F910F910C948E140F931F933D\r
-:103330000091B3011091B4012091B5013091B60113\r
-:1033400006231723282339230093B3011093B401D4\r
-:103350002093B5013093B6011F910F910C948E14F8\r
-:103360000F931F930091B3011091B4012091B50107\r
-:103370003091B60106271727282739270093B30174\r
-:103380001093B4012093B5013093B6011F910F91B2\r
-:103390000C948E140895CF92DF92EF92FF920F93C8\r
-:1033A0001F93CF93DF93EC01C090B701D090B80189\r
-:1033B000E090B901F090BA018091B3019091B4010D\r
-:1033C000A091B501B091B601C82AD92AEA2AFB2AF0\r
-:1033D0000FE110E0B701A601002E04C076956795B5\r
-:1033E000579547950A94D2F740FD05C00150110941\r
-:1033F00088F780E007C0BE01802F0E9489070197EF\r
-:10340000A9F3802FDF91CF911F910F91FF90EF9043\r
-:10341000DF90CF900895CF93DF93EC010E94CB19FA\r
-:10342000BE010E948907DF91CF910895CB010E94D0\r
-:103430000B1A089590910C019923D9F090910D01E8\r
-:103440009923B9F0982F9695969596959F3088F583\r
-:10345000E0910E01F0910F01E90FF11D877021E05D\r
-:1034600030E001C0220F8A95EAF78181822B8183A7\r
-:10347000089540910E0150910F0120E030E09FEF40\r
-:10348000FA01E20FF31F6281681799F09F3F19F468\r
-:10349000611101C0922F2F5F3F4F2E30310581F710\r
-:1034A0009F3F39F0FA01E90FF11D97FDFA958283EC\r
-:1034B0000895089590910C019923E1F090910D01E8\r
-:1034C0009923C1F0982F9695969596959F3020F563\r
-:1034D000E0910E01F0910F01E90FF11D877021E0DD\r
-:1034E00030E001C0220F8A95EAF7209581812823D8\r
-:1034F0002183089540910E0150910F0120E030E0AA\r
-:10350000FA01E20FF31F9281981301C012822F5F1C\r
-:103510003F4F2E303105A1F7089581E090E0E09112\r
-:103520000E01F0910F01E80FF91F10820196803112\r
-:103530009105A9F708959091CE01982B9093CE0113\r
-:10354000089580959091CE0198239093CE0108958F\r
-:103550001092CE0108959091CD01982B9093CD01BA\r
-:10356000089580959091CD0198239093CD01089571\r
-:103570001092CD0108959091CC01982B9093CC019D\r
-:10358000089580959091CC0198239093CC01089553\r
-:103590001092CC0108958093BB0108951092BB0155\r
-:1035A000089540910E0150910F0120E030E080E03D\r
-:1035B000FA01E20FF31F918191118F5F2F5F3F4F4F\r
-:1035C0002F303105A9F70895E0910E01F0910F0118\r
-:1035D0008091CE018083E0910E01F0910F018081F6\r
-:1035E0009091CD01892B8083E0910E01F0910F0124\r
-:1035F00080819091CC01892B80839091BB0199238C\r
-:1036000061F0E0910E01F0910F018081892B8083A0\r
-:103610000E94D11A81111092BB0180910E019091EC\r
-:103620000F010C942B0FCF92DF92EF92FF920F932A\r
-:103630001F936C01EE24FF24C114D104E104F104B2\r
-:1036400021F46B017C0180E001C080E133272F2D44\r
-:103650001E2D0D2D011511052105310519F0885F6D\r
-:103660006801790197018601A4E0369527951795A1\r
-:103670000795AA95D1F7011511052105310519F016\r
-:103680008C5F6801790197018601F2E036952795F4\r
-:1036900017950795FA95D1F7011511052105310503\r
-:1036A00019F08E5F68017901B701A60176956795DB\r
-:1036B00057954795452B462B472B09F08F5F1F9158\r
-:1036C0000F91FF90EF90DF90CF9008958091E601E9\r
-:1036D000843021F11092D00120E488E190E00FB60F\r
-:1036E000F894A895809360000FBE2093600080E05E\r
-:1036F0000E94240883B7817F846083BF83B7816081\r
-:1037000083BF7894889583B78E7F83BF88E10FB697\r
-:10371000F89480936000109260000FBE08950895A1\r
-:103720000895CF930E948F1B0E9458040E94901B03\r
-:10373000C0E08C2F0E944505811105C0CF5FCE30BF\r
-:10374000C1F780E001C081E0CF9108950E94A214EA\r
-:103750000E941F0F0C94240882E084BD93E095BD65\r
-:103760009AEF97BD80936E0008952FB7F8948091DB\r
-:10377000D1019091D201A091D301B091D4012FBF7A\r
-:103780000895CF92DF92EF92FF920F931F932FB77E\r
-:10379000F8944091D1015091D2016091D301709180\r
-:1037A000D4012FBF6A017B01EE24FF248C0120E0AD\r
-:1037B00030E0C016D106E206F30610F4415051097C\r
-:1037C000481B590BCA011F910F91FF90EF90DF909A\r
-:1037D000CF9008951F920F920FB60F9211248F93DE\r
-:1037E0009F93AF93BF938091D1019091D201A0910B\r
-:1037F000D301B091D4010196A11DB11D8093D101D7\r
-:103800009093D201A093D301B093D401BF91AF9113\r
-:103810009F918F910F900FBE0F901F9018950E944F\r
-:10382000250CF8942FEF87EA91E6215080409040D4\r
-:10383000E1F700C0000087E090EBDC018093F0012D\r
-:103840009093F101A093F201B093F3012CE088E191\r
-:1038500090E00FB6F894A895809360000FBE209377\r
-:103860006000FFCFEF92FF920F931F93CF93DF93F0\r
-:10387000E82EF12C8F2D0E944505C0E0D0E0082FE6\r
-:1038800010E098010C2E02C0359527950A94E2F7B6\r
-:1038900020FD05C02196C630D10599F709C06C2FCF\r
-:1038A0007F2D80E00E944D05E812F4CF81E005C035\r
-:1038B000F3948EE0F812DECF80E0DF91CF911F917C\r
-:1038C0000F91FF90EF900895CF93C82F8CE20E9444\r
-:1038D000321C882321F08C2FCF910C94321C80E075\r
-:1038E000CF910895CF930E94B71D811102C00E940D\r
-:1038F0009D1DC5E6C15049F00E9458048FE39CE924\r
-:103900000197F1F700C00000F5CF89E20E94641C26\r
-:10391000811111C18AE20E94641C81110E949D1DC7\r
-:1039200085E00E94641C81110E940F1C0E94C21D30\r
-:103930008093CF0187E00E94641C882399F18BE17A\r
-:103940000E94641C882351F09091CF0191FB88273D\r
-:1039500080F921E0822780FB91F922C08EE00E944D\r
-:10396000641C882351F09091CF0192FB882780F945\r
-:1039700021E0822780FB92F913C080E10E94641C41\r
-:103980009091CF01882341F093FB882780F921E0B3\r
-:10399000822780FB93F904C0892F809580FB90F9E2\r
-:1039A0009093CF018091CF010E94C61D0E94D41D2B\r
-:1039B0008093EF0180EE0E94641C882341F0809187\r
-:1039C000EF01982F909590FB80F98093EF0189E3A8\r
-:1039D0000E94641C882359F09091EF0191FB882785\r
-:1039E00080F921E0822780FB91F99093EF0182EE2C\r
-:1039F0000E94641C882359F09091EF0192FB882764\r
-:103A000080F921E0822780FB92F99093EF0186EE06\r
-:103A10000E94641C882359F09091EF0193FB882742\r
-:103A200080F921E0822780FB93F99093EF0183EEE8\r
-:103A30000E94641C882359F09091EF0194FB882721\r
-:103A400080F921E0822780FB94F99093EF0185E3D0\r
-:103A50000E94641C882359F09091EF0195FB882700\r
-:103A600080F921E0822780FB95F99093EF0181E3B3\r
-:103A70000E94641C882359F09091EF0196FB8827DF\r
-:103A800080F921E0822780FB96F99093EF0181E194\r
-:103A90000E94641C882359F09091EF0197FB8827BE\r
-:103AA00080F921E0822780FB97F99093EF018091C4\r
-:103AB000EF010E94D81D8091EF0187FB882780F9D4\r
-:103AC00080930D0187E20E94641CC82F8EE10E9442\r
-:103AD000641C8111C2608FE10E94641C8111C4606A\r
-:103AE00080E20E94641C8111C86081E20E94641C13\r
-:103AF0008111C06182E20E94641C8111C06283E274\r
-:103B00000E94641C8111C06484E20E94641C8823AA\r
-:103B100011F0C06802C0CC2329F08C2F0E94CF1D69\r
-:103B20006C2F03C00E94CB1D682F70E080E090E0F6\r
-:103B3000CF910C949E18CF9108956DEE7EEF80E0AA\r
-:103B400090E00E94F52360E082E090E00E94E32391\r
-:103B500060E083E090E00E94E32360E084E090E096\r
-:103B60000E94E32360E085E090E00C94E32380E092\r
-:103B700090E00E94DD2321E08D3E9E4F09F020E081\r
-:103B8000822F089582E090E00C94D523682F82E084\r
-:103B900090E00C94E32383E090E00C94D523682F0D\r
-:103BA00083E090E00C94E32384E090E00C94D52330\r
-:103BB000682F84E090E00C94E3238091D70180FF8C\r
-:103BC0000BC06091130185E0689FB00111247595C9\r
-:103BD0006795759567952AC081FF09C060911301AB\r
-:103BE00085E0689FB0011124759567951FC082FF1D\r
-:103BF00007C06091130185E0689FB001112416C0D1\r
-:103C00004091D8014423C9F060911201461788F70A\r
-:103C10002091130185E0289F90011124429FC0014B\r
-:103C2000439F900D112470E00E94A7236038710516\r
-:103C300040F46115710539F002C065E070E0862F2F\r
-:103C400008958FE7089581E008958091D70180FF5E\r
-:103C500008C06091110170E075956795759567953D\r
-:103C600021C081FF06C06091110170E075956795D4\r
-:103C700019C082FF04C06091110170E010C08091F2\r
-:103C8000D8018823C1F0609110018617A0F79091A8\r
-:103C90001101989FC001112470E00E94A723603891\r
-:103CA000710528F46115710521F0862F08958FE7BD\r
-:103CB000089581E0089561E070E0F4CF803F21F441\r
-:103CC0000E94DD1D819504C0813F29F40E94DD1D05\r
-:103CD0008093DB010895823F21F40E94DD1D8195D0\r
-:103CE00004C0833F29F40E94DD1D8093DA0108950A\r
-:103CF000893F19F40E94251E05C08A3F31F40E94B5\r
-:103D0000251E81958093DC0108958B3F21F40E944C\r
-:103D1000251E819504C08C3F29F40E94251E8093A6\r
-:103D2000DD010895843F21F48091D901816017C09D\r
-:103D3000853F21F48091D901826011C0863F21F432\r
-:103D40008091D90184600BC0873F21F48091D90113\r
-:103D5000886005C0883F31F48091D90180618093EB\r
-:103D6000D90108958D3F21F48091D70181600BC066\r
-:103D70008E3F21F48091D701826005C08F3F29F4E6\r
-:103D80008091D70184608093D7010895803F39F4F2\r
-:103D90008091DB0187FF6CC01092DB0169C0813F1D\r
-:103DA00029F48091DB011816BCF362C09091DA010E\r
-:103DB000823F29F497FF5CC01092DA0159C0833F1B\r
-:103DC00019F41916CCF354C0893F41F48091DC01F9\r
-:103DD00018160CF04DC01092DC014AC08A3F29F43D\r
-:103DE0008091DC0187FF44C0F6CF8B3F39F480918E\r
-:103DF000DD0187FF3DC01092DD013AC08C3F29F400\r
-:103E00008091DD011816BCF333C0843F21F480910A\r
-:103E1000D9018E7F17C0853F21F48091D9018D7F14\r
-:103E200011C0863F21F48091D9018B7F0BC0873F61\r
-:103E300021F48091D901877F05C0883F31F48091BA\r
-:103E4000D9018F7E8093D90113C08D3F21F48091D9\r
-:103E5000D7018E7F0BC08E3F21F48091D7018D7FDB\r
-:103E600005C08F3F29F48091D7018B7F8093D701C4\r
-:103E70008091DA0181110EC08091DB0181110AC0AD\r
-:103E80008091DC01811106C08091DD01811102C0A9\r
-:103E90001092D801089589ED91E00E94360F0E949A\r
-:103EA000B51B9093D6018093D50108951F93CF93AE\r
-:103EB000DF938091D5019091D6010E94C11B409162\r
-:103EC000D801442321F02091140130E006C0209154\r
-:103ED00015015AE0259F900111248217930708F4D9\r
-:103EE00082C08091DA011091DB01D091DC01C09198\r
-:103EF000DD01811107C0111105C0D11103C0CC2310\r
-:103F000009F471C04F3F19F04F5F4093D801181664\r
-:103F100024F40E94DD1D8093DA018091DA0187FF8D\r
-:103F200005C00E94DD1D81958093DA01111624F4ED\r
-:103F30000E94DD1D8093DB018091DB0187FF05C0BE\r
-:103F40000E94DD1D81958093DB016091DA0166237B\r
-:103F500039F11091DB01112319F1772767FD709575\r
-:103F6000872F972F0E94B82223E333E343E35FE3D5\r
-:103F70000E941C230E9485226093DA01612F77271B\r
-:103F800067FD7095872F972F0E94B82223E333E3B4\r
-:103F900043E35FE30E941C230E9485226093DB01C0\r
-:103FA0001D1624F40E94251E8093DC018091DC0103\r
-:103FB00087FF05C00E94251E81958093DC011C1699\r
-:103FC00024F40E94251E8093DD018091DD0187FF8E\r
-:103FD00005C00E94251E81958093DD01DF91CF9160\r
-:103FE0001F910C944B1FDF91CF911F910895E9ED24\r
-:103FF000F1E085E0DF011D928A95E9F71092D80182\r
-:104000001092D7010895833081F128F4813059F05E\r
-:104010008230D1F00895853009F449C0B8F1863076\r
-:1040200009F456C0089520911501862F90E0820F63\r
-:10403000911D8F3F910520F4620F60931501089543\r
-:104040008FEF80931501089520911401862F90E041\r
-:10405000820F911D8F3F910520F4620F6093140130\r
-:1040600008958FEF80931401089520911301862FF6\r
-:1040700090E0820F911D8F3F910520F4620F6093B5\r
-:10408000130108958FEF8093130108952091120179\r
-:10409000862F90E0820F911D8F3F910520F4620FD3\r
-:1040A0006093120108958FEF80931201089520917B\r
-:1040B0001101862F90E0820F911D8F3F910520F412\r
-:1040C000620F6093110108958FEF8093110108959D\r
-:1040D00020911001862F90E0820F911D8F3F910556\r
-:1040E00020F4620F6093100108958FEF8093100108\r
-:1040F0000895833011F128F4813049F0823091F035\r
-:104100000895853081F120F18630C1F108958091C4\r
-:104110001501681720F4861B8093150108951092ED\r
-:104120001501089580911401681720F4861B80936F\r
-:1041300014010895109214010895809113016817D5\r
-:1041400020F4861B809313010895109213010895A3\r
-:1041500080911201681720F4861B80931201089544\r
-:1041600010921201089580911101681720F4861BA6\r
-:10417000809311010895109211010895809110010A\r
-:10418000681720F4861B8093100108951092100187\r
-:1041900008958D3109F442C020F58E3009F477C0BE\r
-:1041A00070F4873009F459C018F48630F1F134C046\r
-:1041B000883009F4A8C08B3009F4A5C02DC0863121\r
-:1041C00009F4A1C038F4803109F472C0813109F4D6\r
-:1041D00079C022C0893109F496C08B3109F44DC0F1\r
-:1041E0001BC0853309F487C048F4873209F483C0C3\r
-:1041F00008F473C0893209F47EC00EC0833438F4E9\r
-:104200008A3308F068C0883309F47DC005C0833460\r
-:1042100009F471C0883499F080E008950E943F222B\r
-:104220000E941F0F0E9424086EC08091CF01817FE1\r
-:104230008E7F8093CF0181E08093DF0108950E94FB\r
-:10424000A2142FEF83ED90E3215080409040E1F7DE\r
-:1042500000C000000E940F1C56C09091CF01892F12\r
-:104260008095817080FB90F919F0966098601DC070\r
-:10427000997F977F9093CF0146C09091CF0191FB9A\r
-:10428000882780F921E0822780FB91F909C090916D\r
-:10429000CF0192FB882780F921E0822780FB92F9E9\r
-:1042A0009093CF01882379F191609093CF01089585\r
-:1042B0009091CF0193FB882780F921E0822780FB32\r
-:1042C00093F9EECF0E94A21480910D0191E089270D\r
-:1042D00080930D0118C027EC01C023EE280F61E088\r
-:1042E00070E080E090E004C0660F771F881F991F80\r
-:1042F0002A95D2F704C061E070E080E090E00E946F\r
-:104300009E180E94A21481E0089580E0089580E044\r
-:104310000895CF93C82F8091DF01813079F018F094\r
-:104320008230D1F184C0A0910E01B0910F018C9127\r
-:10433000813169F0823209F07CC009C0A0910E0180\r
-:10434000B0910F018C91813111F0823249F48C2FA0\r
-:104350000E94852181111DC08C2F0E94C9201AC086\r
-:104360008C2F0E948721811114C0C43179F048F448\r
-:10437000CB3079F0C03109F060C082E08093DF017A\r
-:1043800008C0C93219F0C83321F057C01092DF01BC\r
-:1043900054C081E0817053C0C93289F118F5C4312D\r
-:1043A00071F1A8F4C73009F046C08AE08093150186\r
-:1043B00094E19093140193E0909313018093120180\r
-:1043C00088E08093110188E28093100134C0CE51BF\r
-:1043D000C63088F5EC2FF0E0E65DFE4F80818093DB\r
-:1043E000DE0129C0CE34E9F020F4CB3421F56AE0B7\r
-:1043F00013C0C13579F0C235F1F461E00DC0809190\r
-:10440000DE01882319F01092DE0115C081E080934F\r
-:10441000DF0115C061E006C08091DE010E9403202B\r
-:104420000AC06AE08091DE010E94792004C01092E7\r
-:10443000DF0180E004C081E002C080E0ABCFCF911B\r
-:104440000895E1E8F0E08081886080838081816068\r
-:1044500080838FB7F89493E09093890090ED9093C8\r
-:1044600088008FBF0895EFE6F0E08081826080834E\r
-:104470000895EFE6F0E080818D7F80830895EFE678\r
-:10448000F0E0808192E08927808308951F920F9247\r
-:104490000FB60F9211242F933F934F935F936F9317\r
-:1044A0007F938F939F93AF93BF93EF93FF938091ED\r
-:1044B000E0019091E10101969093E1018093E00188\r
-:1044C000811103C082E00E942408E091E101E69599\r
-:1044D000E695F0E0E657FB4FE4918091E0018E1302\r
-:1044E00003C080E00E942408FF91EF91BF91AF913B\r
-:1044F0009F918F917F916F915F914F913F912F91FC\r
-:104500000F900FBE0F901F90189504D06894B111B2\r
-:104510008DC0089570D088F09F5790F0B92F9927DB\r
-:10452000B751A0F0D1F0660F771F881F991F1AF0BE\r
-:10453000BA95C9F712C0B13081F077D0B1E00895D3\r
-:1045400074C0672F782F8827B85F39F0B93FCCF354\r
-:10455000869577956795B395D9F73EF490958095B4\r
-:10456000709561957F4F8F4F9F4F0895E89409C0D4\r
-:1045700097FB3EF490958095709561957F4F8F4F96\r
-:104580009F4F9923A9F0F92F96E9BB279395F695AC\r
-:10459000879577956795B795F111F8CFFAF4BB0F2A\r
-:1045A00011F460FF1BC06F5F7F4F8F4F9F4F16C08E\r
-:1045B000882311F096E911C0772321F09EE8872F18\r
-:1045C000762F05C0662371F096E8862F70E060E0D4\r
-:1045D0002AF09A95660F771F881FDAF7880F96954D\r
-:1045E000879597F9089557FD9058440F551F59F036\r
-:1045F0005F3F71F04795880F97FB991F61F09F3FD0\r
-:1046000079F087950895121613061406551FF2CFF8\r
-:104610004695F1DF08C0161617061806991FF1CF48\r
-:1046200086957105610508940895E894BB2766276F\r
-:104630007727CB0197F908950BD078C069D028F07F\r
-:104640006ED018F0952309F05AC05FC01124EECF48\r
-:10465000CADFA0F3959FD1F3950F50E0551F629FDD\r
-:10466000F001729FBB27F00DB11D639FAA27F00DCB\r
-:10467000B11DAA1F649F6627B00DA11D661F829FF2\r
-:104680002227B00DA11D621F739FB00DA11D621FD7\r
-:10469000839FA00D611D221F749F3327A00D611DF4\r
-:1046A000231F849F600D211D822F762F6A2F1124D6\r
-:1046B0009F5750408AF0E1F088234AF0EE0FFF1F29\r
-:1046C000BB1F661F771F881F91505040A9F79E3F60\r
-:1046D000510570F014C0AACF5F3FECF3983EDCF3B5\r
-:1046E000869577956795B795F795E7959F5FC1F79D\r
-:1046F000FE2B880F911D9695879597F9089597F948\r
-:104700009F6780E870E060E008959FEF80EC089577\r
-:1047100000240A94161617061806090608950024A0\r
-:104720000A9412161306140605060895092E03941A\r
-:10473000000C11F4882352F0BB0F40F4BF2B11F48E\r
-:1047400060FF04C06F5F7F4F8F4F9F4F089597FBAF\r
-:10475000072E16F4009407D077FD09D00E94C123DC\r
-:1047600007FC05D03EF4909581959F4F0895709574\r
-:1047700061957F4F0895EE0FFF1F0590F491E02D96\r
-:104780000994AA1BBB1B51E107C0AA1FBB1FA61798\r
-:10479000B70710F0A61BB70B881F991F5A95A9F7EA\r
-:1047A00080959095BC01CD010895F999FECF92BDF9\r
-:1047B00081BDF89A992780B50895A8E1B0E042E05C\r
-:1047C00050E00C94FD23262FF999FECF92BD81BDB8\r
-:1047D000F89A019700B4021639F01FBA20BD0FB63F\r
-:1047E000F894FA9AF99A0FBE08950196272F0E941D\r
-:1047F000E4230C94E323DC01CB01FC01F999FECF07\r
-:1048000006C0F2BDE1BDF89A319600B40D92415058\r
-:0A4810005040B8F70895F894FFCF68\r
-:10481A0020022608B30890085C0829080101BC0197\r
-:10482A0028080A03140A3F4D36394B04FE03C8030D\r
-:10483A008F0322033B0354036D030102030405069D\r
-:04484A000708090052\r
+:1011E00070E0CE010E948A0A8091E8008E77809399\r
+:1011F000E80080E1FE01A2E5B1E001900D928A9540\r
+:10120000E1F7DF91CF9108958091E701811109C045\r
+:101210000E941C0C0E94790C8091E20084608093F3\r
+:10122000E20008951092E7010895089508950C943E\r
+:10123000D01B42E061EC81E00E94960B42E061EC41\r
+:1012400082E00E94960B42E061EC83E00E94960BE4\r
+:1012500042E161EC84E00C94960B8091EA018330CA\r
+:1012600009F455C030F4813071F0823009F48EC039\r
+:1012700008958A3009F47AC08B3009F460C089304F\r
+:1012800009F09CC020C08091E901813A09F096C024\r
+:101290008091E800877F8093E8008091ED01909134\r
+:1012A000EE01892B21F060E080E090E003C060E176\r
+:1012B00082E591E070E00E94D30A8091E8008B778C\r
+:1012C0008093E80008958091E901813209F076C0A9\r
+:1012D0008091ED019091EE01009719F0039709F0CC\r
+:1012E0006DC08091E800877F8093E8008091E800DE\r
+:1012F00082FD05C08091E8018111F8CF5FC0809127\r
+:10130000F100809362018091E8008B7753C0809157\r
+:10131000E901813A09F052C08091ED019091EE010E\r
+:10132000892B09F04BC08091E800877F8093E8000B\r
+:101330008091E80080FFFCCF80910C0136C0809145\r
+:10134000E9018132D9F58091ED019091EE01892B6F\r
+:10135000A9F58091E800877F8093E8000E94CB0B7D\r
+:101360008091EB0180930C010C9419148091E90198\r
+:10137000813221F58091E800877F8093E8000E9408\r
+:10138000CB0B8091EC018093630108958091E9017A\r
+:10139000813AA1F48091E800877F8093E8008091F2\r
+:1013A000E80080FFFCCF809163018093F100809181\r
+:1013B000E8008E778093E8000C94CB0B089584B7F7\r
+:1013C000877F84BF88E10FB6F89480936000109205\r
+:1013D00060000FBE90E080E80FB6F8948093610043\r
+:1013E000909361000FBE0E94650F0E941C0C0E942A\r
+:1013F000790C8091E20084608093E20078940E94EE\r
+:10140000F40E0E94670F82E091E00E94110F80911C\r
+:10141000E801853069F40E94901B8091E6018823E1\r
+:10142000B1F30E94BB1B882391F30E94740AEFCF93\r
+:101430000E946D0FECCF292F332723303105A9F0FF\r
+:101440006CF42130310509F442C02230310509F035\r
+:1014500043C08DE690E02EE333E042C021323105F7\r
+:10146000C9F02232310519F137C099278130910531\r
+:1014700041F08230910541F0892B71F5EAE3F3E008\r
+:1014800005C0E2E2F3E002C0EAE0F3E0849190E01C\r
+:101490009F0126C0643000F5E62FF0E0EE0FFF1F3D\r
+:1014A000EE5DFE4F2081318189E090E019C064300B\r
+:1014B00098F4E62FF0E0DF01AA0FBB1FA65EBE4F37\r
+:1014C0002D913C91EA5EFE4F808190E009C082E15F\r
+:1014D00090E02BEA33E004C080E090E020E030E0D0\r
+:1014E000FA0131832083089580E189BD82E189BDBD\r
+:1014F00009B400FEFDCF8091D8008F7D8093D80085\r
+:101500008091E00082608093E0008091E00081FDA6\r
+:10151000FCCF0895CF92DF92EF92FF920F931F932B\r
+:10152000CF93DF937C018B01EA010E94EC0B8111C8\r
+:1015300031C0209731F088819981081B190BE80E82\r
+:10154000F91EC12CD12C0115110519F18091E8006B\r
+:1015500085FD14C08091E8008E778093E800209785\r
+:1015600041F0888199818C0D9D1D9983888385E048\r
+:1015700011C00E94EC0B882331F30CC0F70181915C\r
+:101580007F018093F10001501109FFEFCF1ADF0AAC\r
+:10159000DACF80E0DF91CF911F910F91FF90EF9014\r
+:1015A000DF90CF9008952091EF013091F001261740\r
+:1015B000370748F06115710539F42091E8002E775E\r
+:1015C0002093E80001C0B901FC0120E0611571051C\r
+:1015D000B9F18091E801882309F440C0853009F40D\r
+:1015E0003FC08091E80083FD3DC08091E80082FF0C\r
+:1015F00006C08091E80082FF26C080E008958091B7\r
+:10160000E80080FFE3CF2091F3008091F20090E0AA\r
+:10161000922B6115710551F08830910538F42191B4\r
+:101620002093F100615071090196F3CF21E00897F2\r
+:1016300009F020E08091E8008E778093E800C6CF23\r
+:101640002111C7CFD6CF8091E801882339F08530AA\r
+:1016500039F08091E80083FFCCCF04C082E0089588\r
+:1016600083E0089581E008952091EF013091F00129\r
+:101670002617370748F06115710539F42091E80005\r
+:101680002E772093E80001C0B901FC0120E061152C\r
+:101690007105C1F18091E801882309F441C08530CA\r
+:1016A00009F440C08091E80083FD3EC08091E800CD\r
+:1016B00082FF06C08091E80082FF27C080E0089585\r
+:1016C0008091E80080FFE3CF2091F3008091F20049\r
+:1016D00090E0922B6115710559F08830910540F426\r
+:1016E00024912093F1003196615071090196F2CF57\r
+:1016F00021E0089709F020E08091E8008E77809340\r
+:10170000E800C5CF2111C6CFD5CF8091E80188234D\r
+:1017100039F0853039F08091E80083FFCBCF04C0E9\r
+:1017200082E0089583E0089581E00895982F97302E\r
+:1017300058F59093E900981739F07091EC002091DA\r
+:10174000ED005091F00003C0242F762F50E021FFD0\r
+:1017500019C03091EB003E7F3093EB003091ED00EB\r
+:101760003D7F3093ED003091EB0031603093EB0022\r
+:101770007093EC002093ED005093F0002091EE0068\r
+:1017800027FF07C09F5FD3CF8F708093E90081E070\r
+:10179000089580E008958091E90187FD05C080915A\r
+:1017A000E80080FF0EC012C08091E80082FD05C0F5\r
+:1017B0008091E8018111F8CF08958091E8008B773E\r
+:1017C00008C08091E8018111EACF08958091E80076\r
+:1017D0008E778093E80008958091E4009091E50071\r
+:1017E00045E62091EC0020FF21C02091E80020FD7B\r
+:1017F00021C02091E801222389F0253089F0209131\r
+:10180000EB0025FD0FC02091E4003091E500281782\r
+:10181000390739F3415041F0C901E3CF82E008951F\r
+:1018200083E0089581E0089584E008952091E80020\r
+:1018300022FFDFCF80E008950E948A0C0E94920C64\r
+:10184000E0EEF0E0808181608083E8EDF0E080816F\r
+:101850008F77808319BCA7EDB0E08C918E7F8C933D\r
+:1018600080818F7E80831092E70108950F931F93EC\r
+:10187000CF93DF930E948A0C0E94920CC8EDD0E0B7\r
+:1018800088818F77888388818068888388818F7D2D\r
+:10189000888319BC1092E8011092E4011092E601CD\r
+:1018A0001092E50100EE10E0F80180818B7F8083CB\r
+:1018B00088818160888342E060E080E00E94960B2E\r
+:1018C000E1EEF0E080818E7F8083E2EEF0E08081C7\r
+:1018D00081608083808188608083F80180818E7F31\r
+:1018E0008083888180618883DF91CF911F910F91E0\r
+:1018F0000895E8EDF0E080818F7E8083E7EDF0E0F1\r
+:1019000080818160808384E082BF81E08093E701F1\r
+:101910000C94360CE8EDF0E080818E7F808310928D\r
+:10192000E20008951092DA001092E10008951F92EB\r
+:101930000F920FB60F9211242F933F934F935F9303\r
+:101940006F937F938F939F93AF93BF93EF93FF9387\r
+:101950008091E10082FF0BC08091E20082FF07C00E\r
+:101960008091E1008B7F8093E1000E94F30E8091D3\r
+:10197000DA0080FF1FC08091D80080FF1BC08091DB\r
+:10198000DA008E7F8093DA008091D90080FF0DC04D\r
+:1019900080E189BD82E189BD09B400FEFDCF81E00F\r
+:1019A0008093E8010E94040905C019BC1092E80167\r
+:1019B0000E9412098091E10080FF19C08091E2002D\r
+:1019C00080FF15C08091E2008E7F8093E2008091BD\r
+:1019D000E20080618093E2008091D8008062809371\r
+:1019E000D80019BC85E08093E8010E941609809117\r
+:1019F000E10084FF30C08091E20084FF2CC080E1D0\r
+:101A000089BD82E189BD09B400FEFDCF8091D80077\r
+:101A10008F7D8093D8008091E1008F7E8093E100DC\r
+:101A20008091E2008F7E8093E2008091E2008160ED\r
+:101A30008093E2008091E401882311F084E007C0E4\r
+:101A40008091E30087FF02C083E001C081E08093C2\r
+:101A5000E8010E9417098091E10083FF29C080916D\r
+:101A6000E20083FF25C08091E100877F8093E10041\r
+:101A700082E08093E8011092E4018091E1008E7F82\r
+:101A80008093E1008091E2008E7F8093E20080915C\r
+:101A9000E20080618093E20042E060E080E00E942A\r
+:101AA000960B8091F00088608093F0000E941509E9\r
+:101AB000FF91EF91BF91AF919F918F917F916F9126\r
+:101AC0005F914F913F912F910F900FBE0F901F90FC\r
+:101AD00018951F920F920FB60F9211242F933F93D8\r
+:101AE0004F935F936F937F938F939F93AF93BF9326\r
+:101AF000CF93EF93FF93C091E900CF708091EC00FA\r
+:101B00001092E9008091F000877F8093F000789434\r
+:101B10000E94A50D1092E9008091F00088608093EA\r
+:101B2000F000C093E900FF91EF91CF91BF91AF9189\r
+:101B30009F918F917F916F915F914F913F912F91E5\r
+:101B40000F900FBE0F901F9018951F93CF93DF93A8\r
+:101B5000CDB7DEB7AA970FB6F894DEBF0FBECDBFE4\r
+:101B6000E9EEF1E08091F100819321E0E13FF2079D\r
+:101B7000C9F70E942D098091E80083FF1CC12091C4\r
+:101B8000E9013091EA01832F90E08A30910508F055\r
+:101B900012C1FC01EA5AFF4F0C94A323203881F0B4\r
+:101BA000223809F008C18091ED018F708093E9001F\r
+:101BB0008091EB0085FB882780F91092E90006C030\r
+:101BC0008091E5019091E601911182609091E80089\r
+:101BD000977F9093E8008093F1001092F100C5C0C8\r
+:101BE000822F8D7F09F0E7C0222319F0223061F0A7\r
+:101BF000E2C08091EB01813009F0DDC0333009F0A3\r
+:101C000080E08093E60128C08091EB01811124C01F\r
+:101C10002091ED012F7009F4CEC02093E90080914E\r
+:101C2000EB0080FF19C08091EB00333011F480622B\r
+:101C300011C080618093EB0081E090E0022E01C032\r
+:101C4000880F0A94EAF78093EA001092EA008091E4\r
+:101C5000EB0088608093EB001092E9008091E8002F\r
+:101C6000877F86C02111A7C01091EB011F7780915B\r
+:101C7000E3008078812B8093E3008091E800877FE8\r
+:101C80008093E8000E94CB0B8091E80080FFFCCF9E\r
+:101C90008091E30080688093E300112311F083E0DA\r
+:101CA00001C082E08093E80186C02058223008F00D\r
+:101CB00082C08091EB019091EC018C3D23E0920772\r
+:101CC00079F583E08A838AE289834FB7F894DE014D\r
+:101CD000139620E03EE051E2E32FF0E050935700EE\r
+:101CE000E49120FF03C0E295EF703F5FEF708E2F0D\r
+:101CF00090E0EA3010F0C79601C0C0968D939D9396\r
+:101D00002F5F243149F74FBF8091E800877F809390\r
+:101D1000E8006AE270E0CE0101960E94D30A14C086\r
+:101D2000AE014F5F5F4F6091ED010E941B0A00976B\r
+:101D300009F441C02091E800277F2093E800BC010E\r
+:101D400089819A810E94340B8091E8008B7780937F\r
+:101D5000E80031C0203879F58091E800877F8093D2\r
+:101D6000E8008091E4018093F1008091E8008E7793\r
+:101D70008093E8000E94CB0B1EC021111CC09091E3\r
+:101D8000EB019230C0F48091E800877F8093E800F7\r
+:101D90009093E4010E94CB0B8091E401811104C077\r
+:101DA0008091E30087FF02C084E001C081E080935E\r
+:101DB000E8010E9419098091E80083FF0AC0809120\r
+:101DC000E800877F8093E8008091EB008062809339\r
+:101DD000EB00AA960FB6F894DEBF0FBECDBFDF9121\r
+:101DE000CF911F9108950895CF938091E8018823A2\r
+:101DF000B1F08091E9008F709091EC0090FF02C0EB\r
+:101E000090E801C090E0C92FC82B1092E9008091A2\r
+:101E1000E80083FD0E94A50DCF70C093E900CF912B\r
+:101E2000089590936901809368010895E091680195\r
+:101E3000F0916901309721F00190F081E02D099433\r
+:101E400080E00895E0916801F0916901309721F0F8\r
+:101E50000280F381E02D09940895E0916801F091EA\r
+:101E60006901309721F00480F581E02D09940895EF\r
+:101E700020916601309167018217930771F090936A\r
+:101E8000670180936601E0916801F09169013097E4\r
+:101E900021F00680F781E02D0994089520916401D6\r
+:101EA000309165018217930771F0909365018093DB\r
+:101EB0006401E0916801F0916901309721F000849C\r
+:101EC000F185E02D0994089508950C94640F0E9403\r
+:101ED000FF1B0E9430040C94C51CCF92DF92EF923E\r
+:101EE000FF920F931F93CF93DF93CDB7DEB72B975E\r
+:101EF0000FB6F894DEBF0FBECDBF0E9448043BE68C\r
+:101F0000E32E31E0F32E00E010E0C02E802F0E947F\r
+:101F10003505F701D1907F01D826B1F40F5F1F4F2F\r
+:101F20000E30110591F78FEF89838A831B820E94FF\r
+:101F3000081C8160782F9D838C8349815A816B8135\r
+:101F40008D810E94101041C09091D30191FF04C077\r
+:101F50008B870E943B058B8520E030E04D2D50E0C3\r
+:101F6000922FBA01022E02C0759567950A94E2F786\r
+:101F700060FF25C02E83CF82EE24E394F12C02C0B3\r
+:101F8000EE0CFF1C9A95E2F790E08E219F2121E054\r
+:101F9000892B09F420E028870E94081C8160782F93\r
+:101FA0009A8789874E815F8168858A850E94101093\r
+:101FB000F801E559FE4F80818E25808306C02F5F92\r
+:101FC0003F4F2630310561F6A9CF0E94A91F10911D\r
+:101FD0006A010E94160F1817A1F00E94160F809335\r
+:101FE0006A012B960FB6F894DEBF0FBECDBFDF910E\r
+:101FF000CF911F910F91FF90EF90DF90CF900C94B5\r
+:1020000024082B960FB6F894DEBF0FBECDBFDF912C\r
+:10201000CF911F910F91FF90EF90DF90CF90089597\r
+:10202000CF93DF93CDB7DEB72B970FB6F894DEBF13\r
+:102030000FBECDBF4F83588769877A878B87DE01B4\r
+:10204000119686E0FD0111928A95E9F785E0FE017F\r
+:10205000379601900D928A95E1F749815A816B81FB\r
+:102060007C818D819E810E94E9162B960FB6F89493\r
+:10207000DEBF0FBECDBFDF91CF9108950895CF93FE\r
+:10208000C82F882309F4C1C0823859F40E94160F62\r
+:1020900081FDBBC089E30E94301A0E94071B89E3BF\r
+:1020A0000CC0833879F40E94160F80FDAEC083E522\r
+:1020B0000E94301A0E94071B83E50E94701ACF917C\r
+:1020C0000C94071B843859F40E94160F82FD9DC0A2\r
+:1020D00087E40E94301A0E94071B87E4EECF8CEF42\r
+:1020E0008C0F813A48F48C2F0E94D52181118DC02C\r
+:1020F0008C2F0E94301AE3CF80E28C0F883048F496\r
+:10210000C77081E001C0880FCA95EAF70E94B41A2F\r
+:10211000D6CF8BE58C0F833078F4C53A29F0C63AD8\r
+:1021200031F482E890E005C081E890E002C083E8E5\r
+:1021300090E0CF910C94380F88E58C0F833108F034\r
+:1021400064C0C83A39F1C93A41F1CA3A49F1CB3AC7\r
+:1021500051F1CC3A59F1CD3A61F1C03B69F1CE3A37\r
+:1021600071F1CF3A79F1C13B81F1C23B89F1C33BB7\r
+:1021700091F1C43B99F1C53BA1F1C63BA9F1C73B25\r
+:10218000B1F1C83BB9F1C93BC1F1CA3BC9F58AE21B\r
+:1021900092E038C082EE90E035C089EE90E032C027\r
+:1021A0008AEE90E02FC085EB90E02CC086EB90E0AB\r
+:1021B00029C087EB90E026C08CEC90E023C08DEC2A\r
+:1021C00090E020C083E891E01DC08AE891E01AC049\r
+:1021D00082E991E017C084E991E014C081E292E0C5\r
+:1021E00011C083E292E00EC084E292E00BC085E26F\r
+:1021F00092E008C086E292E005C087E292E002C069\r
+:1022000080E090E0CF910C944E0FCF9108958823F9\r
+:1022100009F44BC0823859F40E94160F81FF45C063\r
+:1022200089E30E94301A0E94071B89E30CC083389F\r
+:1022300071F40E94160F80FF38C083E50E94301AA7\r
+:102240000E94071B83E50E94701A0C94071B8438B8\r
+:1022500059F40E94160F82FF28C087E40E94301AAA\r
+:102260000E94071B87E4EFCF9CEF980F913A58F339\r
+:1022700090E2980F983050F4877091E001C0990F68\r
+:102280008A95EAF7892F0E94BA1ADFCF9BE5980F4B\r
+:10229000933020F480E090E00C94380F885A83311A\r
+:1022A00020F480E090E00C944E0F0895882321F0F4\r
+:1022B0000E94B41A0C94071B0895882321F00E94F1\r
+:1022C000BA1A0C94071B08958F929F92AF92BF92F7\r
+:1022D000CF92DF92EF92FF920F931F93CF93DF93F2\r
+:1022E00000D000D01F92CDB7DEB77C0185E0F701AA\r
+:1022F000DE01119601900D928A95E1F7F701D080E9\r
+:1023000011810281B580B2942FE0B2222381348101\r
+:10231000232B39F01F3F39F481E0FFEFDF1203C0B8\r
+:1023200003C081E001C080E080FD5DC20E94CB1946\r
+:10233000882319F082E00E940E1AC7010E943E1005\r
+:10234000D9821A8369817A81802F0E949119182F6E\r
+:10235000C92E0E9445190E94181801110E94D11A15\r
+:102360000E94291A882379F0002369F080E2810F06\r
+:10237000883048F082E00E940E1A0E94291ADD245B\r
+:10238000D394D82601C0D12CEC2DE295EF70F0E06B\r
+:10239000E05AFF4F0C94A3238C2D807F9C2D9F70BF\r
+:1023A000B92E882319F0B29490EFB922002389F056\r
+:1023B000BB2009F4DAC180E2810F883020F48B2D34\r
+:1023C0000E94B41A03C08B2D0E94C41A0E94071BDE\r
+:1023D000CCC1812F0E940711BB2009F4E0C1105E1F\r
+:1023E0008B2D183018F40E94BA1A02C00E94CA1A23\r
+:1023F0000E94071BD4C18C2D807F9C2D9F70A92E1D\r
+:10240000803219F0A29480EFA822112319F0113024\r
+:1024100049F132C0002391F0BB2091F181E0B81264\r
+:1024200004C08A2D0E94E41ABAC192E0B91228C0F1\r
+:102430000E94ED1A8A2D0E94981922C0BB2079F0C3\r
+:10244000E1E0BE1208C00E94B11A8A2109F4A7C1B6\r
+:102450000E949B1904C0F2E0BF1609F4A0C10E94BB\r
+:10246000ED1A12C0002329F081E08B1508F497C102\r
+:1024700007C0B11094C108C0002321F0B11075C18C\r
+:102480008A2DEFC0B11078C18A2DF1C02C2D269570\r
+:102490002695237030E02115310521F021303105DA\r
+:1024A00061F07DC1002321F0812F9C2D937002C02B\r
+:1024B00080E090E00E94380F72C1002321F0812F4C\r
+:1024C0009C2D937002C080E090E00E944E0F67C187\r
+:1024D000812F002319F00E94B11E02C00E94191F13\r
+:1024E0000E949E1F5CC18C2D837009F04FC00111AA\r
+:1024F00056C1212F229526952770220F220F812F5A\r
+:102500008F70882E912CA12CB12C022E04C0880C27\r
+:10251000991CAA1CBB1C0A94D2F714FF10C06FE0D0\r
+:1025200070E080E090E004C0660F771F881F991F5D\r
+:102530002A95D2F7609570958095909503C060E0DC\r
+:1025400070E0CB012C2D269526952370422F50E06C\r
+:102550004230510569F04330510589F068297929E5\r
+:102560008A299B294130510571F00E943D1817C1FD\r
+:10257000682979298A299B290E94571810C10E942D\r
+:102580003D18C501B4010E94231809C1002319F0A8\r
+:102590008C2D817001C08695882309F400C1212FFC\r
+:1025A000229526952770220F220F812F8F70882E5B\r
+:1025B000912CA12CB12C022E04C0880C991CAA1CB1\r
+:1025C000BB1C0A94D2F714FF10C06FE070E080E0EB\r
+:1025D00090E004C0660F771F881F991F2A95D2F7D5\r
+:1025E000609570958095909503C060E070E0CB0198\r
+:1025F0002C2D269526952370422F50E04230510510\r
+:1026000069F04330510589F0682979298A299B2985\r
+:102610004130510571F00E941119C1C06829792912\r
+:102620008A299B290E942B19BAC00E941119C50141\r
+:10263000B4010E94F718B3C0412F50E0FA01E05EE8\r
+:10264000F109E531F10508F08BC0E059FF4F0C941A\r
+:10265000A3231F708C2D8F71002331F00E949018DE\r
+:10266000812F0E9456119BC00E94B118812F0E9499\r
+:102670005D1195C0002339F0B11091C08C2D8F7180\r
+:102680000E94D6188CC091E09B1508F488C0F6CF44\r
+:10269000002339F08C2D8F710E94901880C0002388\r
+:1026A000C9F38C2D8F710E94B11879C0002329F0D5\r
+:1026B0008C2D8F710E947B1872C00E9471186FC0A0\r
+:1026C0000023C9F00E9495190E94BA1A0E94C719E6\r
+:1026D000843029F40E94071A8C2D8F7171C0E1E0BB\r
+:1026E000EB1508F480C01C2D1F71812F0E949018DB\r
+:1026F00063E0812F0EC00E9495190E94B41AF1E088\r
+:10270000FB15D0F40E94071A0E949B1964E08C2DDF\r
+:102710008F710F900F900F900F900F90DF91CF91CE\r
+:102720001F910F91FF90EF90DF90CF90BF90AF90EF\r
+:102730009F908F900C94F71981E00F900F900F905D\r
+:102740000F900F90DF91CF911F910F91FF90EF901D\r
+:10275000DF90CF90BF90AF909F908F900C940E1A07\r
+:10276000002339F0BB2009F495CF812F0E943F1040\r
+:1027700016C0BB2009F495CF812F0E9407110FC00E\r
+:102780004C2D4F70612FC7010E94A2020E94961724\r
+:1027900006C04C2D4F70612FC7010E943C05DD2003\r
+:1027A00011F10E94C71980FD1EC0F70112820E941C\r
+:1027B000C1190E949018C7010E9464110E94C1199A\r
+:1027C0000F900F900F900F900F90DF91CF911F916E\r
+:1027D0000F91FF90EF90DF90CF90BF90AF909F90C0\r
+:1027E0008F900C94B1180F900F900F900F900F9046\r
+:1027F000DF91CF911F910F91FF90EF90DF90CF90DD\r
+:10280000BF90AF909F908F9008950E94D11A0E9420\r
+:10281000E11A0E94A31A0E94071B0E944A200E94EC\r
+:102820009E1F80E090E00E94380F80E090E00C94C2\r
+:102830004E0F0E94C11A0C9405140E948619292F6C\r
+:1028400022952F7030E02C3031054CF42A303105C0\r
+:102850006CF42250310922303105B0F407C02C301D\r
+:10286000310571F02F30310559F00EC0803F31F045\r
+:1028700018F4803E48F402C0843F31F481E00895AA\r
+:1028800093FB882780F9089580E00895CF93DF9324\r
+:1028900000D000D01F92CDB7DEB70F900F900F90F1\r
+:1028A0000F900F90DF91CF910895CF93DF9300D0D9\r
+:1028B00000D000D0CDB7DEB726960FB6F894DEBFB5\r
+:1028C0000FBECDBFDF91CF9108951F93CF93DF93BC\r
+:1028D000C091790116E080917A01C81799F0D0E093\r
+:1028E0001C9FF0011D9FF00D1124E558FE4F408103\r
+:1028F000518162817381848195810E945514219652\r
+:10290000C770E9CFDF91CF911F9108954091AB013E\r
+:102910005091AC016091AD017091AE018091AF0119\r
+:102920009091B0010C945514CF938091B001829591\r
+:102930008F7009F05FC08091AD01882309F45AC0FF\r
+:1029400020917901A0917A016091AB017091AC0165\r
+:102950008091AE019091AF0131E06F3F09F030E01E\r
+:10296000B32FC6E02A1709F445C0009721F07F3F36\r
+:1029700021F44B2F03C041E001C040E030E040FDB6\r
+:1029800035C0C29FF001C39FF00D1124E558FE4FE2\r
+:10299000418174132BC04081641328C042814111CE\r
+:1029A00025C0438154814817590710F441505109FB\r
+:1029B000481B590B483C5105C8F48091B0018F70F9\r
+:1029C00080618093B00186E0829FF001839FF00DCB\r
+:1029D0001124E058FE4F80818F70806180838BEAE4\r
+:1029E00091E00E946411CF910C9465142F5F3F4FCA\r
+:1029F0002770B8CFCF910895CF92DF92EF92FF92D8\r
+:102A00000F931F93CF93DF93CDB7DEB762970FB6C7\r
+:102A1000F894DEBF0FBECDBF8C0185E0F801DE016A\r
+:102A20001D9601900D928A95E1F7D8014C9111966F\r
+:102A30005C91119712966C9112971396ED90FC9001\r
+:102A400014977091AB01E091AC012091AE013091EF\r
+:102A5000AF012115310531F0EF3F31F481E07F3FC7\r
+:102A600019F403C081E001C080E0B82FB170CB2E13\r
+:102A700080FD6CC1D090AD01DD2009F4F5C0F0916E\r
+:102A8000B001E216F30638F0C701821B930B883CB5\r
+:102A9000910548F09BC0209530952E0D3F1D283C98\r
+:102AA000310508F093C08F2F807F09F052C0E513E5\r
+:102AB00014C0741312C0D62E61110FC0FF70F061E4\r
+:102AC000F093B0010E9486148BEA91E00E94641199\r
+:102AD0008091B001F80185836CC1EF2831F05F3F30\r
+:102AE00031F481E04F3F19F403C081E001C080E080\r
+:102AF00080FD03C081E0862701C080E0F82FF170DF\r
+:102B0000FF2E80FF1CC08091790120917A0136E070\r
+:102B1000821709F428C190E0389FF001399FF00D29\r
+:102B20001124E558FE4F7181571306C07081471379\r
+:102B300003C07281671303C001968770E9CFD62E58\r
+:102B4000662309F436C18091B00181608093B001A1\r
+:102B500053C0E51308C0741306C0611104C0D80146\r
+:102B60001596FC93AEC04D875E878D859E856A8BDA\r
+:102B70000E941D146A89882329F1D62E662311F13B\r
+:102B80002091B001822F82958F7090E002970CF413\r
+:102B900060C08091AB019091AC0198878F831986BA\r
+:102BA000FB86EA862C87CE01079651C0E51731F1E6\r
+:102BB0004D875E878D859E856A8B0E941D146A896C\r
+:102BC00081112EC0C8010E946411A4C08F2F807F84\r
+:102BD00069F77E2DF98AE88A89890E9446148BEA72\r
+:102BE00091E00E946411EBEAF1E086E0DF011D92C2\r
+:102BF0008A95E9F70E948614D12CDBC07413D8CFD4\r
+:102C00006111D6CFD8011596FC93C8010E946411BA\r
+:102C1000EBEAF1E086E0DF011D928A95E9F7C9C091\r
+:102C2000D62E662379F22091B001822F82958F7083\r
+:102C300090E0029774F08091AB019091AC019A837F\r
+:102C400089831B82FD82EC822E83CE0101960E9435\r
+:102C5000641186E0F801ABEAB1E001900D928A952B\r
+:102C6000E1F70E9494146FC0E216F30628F0C70142\r
+:102C7000821B930B9C0104C0209530952E0D3F1DA7\r
+:102C8000283C310508F052C0D62E662309F49ACFAD\r
+:102C9000E5132CC074132AC08091B00180FD1DC0C3\r
+:102CA000982F92959F70C9F0D80115968C9315971F\r
+:102CB0009F3039F09F5F9295907F8F70892B15968A\r
+:102CC0008C93C8010E94641186E0F801ABEAB1E080\r
+:102CD00001900D928A95E1F736C086E0F801ABEAE3\r
+:102CE000B1E001900D928A95E1F763C04D875E8750\r
+:102CF0008D859E850E941D14882379F086E0F80159\r
+:102D0000ABEAB1E001900D928A95E1F70E9494142C\r
+:102D10000E948614DD24D3944CC08091B001816060\r
+:102D20008093B001C8010E94641143C07E2DF98ACE\r
+:102D3000E88A89890E944614EBEAF1E086E0DF0127\r
+:102D40001D928A95E9F70E94861433C0662309F420\r
+:102D500039CF4D875E878D859E850E941D148823FF\r
+:102D600009F430CFCBCF4D875E878D859E850E943D\r
+:102D70008619292F22952F7030E0223031052CF44E\r
+:102D80009F7041F0811106C00CC0243031052CF435\r
+:102D90009F7049F4805E883020F0C8010E94641161\r
+:102DA000CF2CDC2C06C0D80115969C91907F91F712\r
+:102DB000F8CF8D2D62960FB6F894DEBF0FBECDBF53\r
+:102DC000DF91CF911F910F91FF90EF90DF90CF9007\r
+:102DD00008951F93CF93DF93CDB7DEB72C970FB62F\r
+:102DE000F894DEBF0FBECDBF4F83588769877A87BF\r
+:102DF0008B879C87CE0107960E94FC148823C1F024\r
+:102E00002F8138858A859B85892B31F03F3F11F0D2\r
+:102E100080E003C02F3FE1F781E0811147C04F817F\r
+:102E2000588569857A858B859C850E9455143EC09E\r
+:102E300086E0FE013796DE01119601900D928A958B\r
+:102E4000E1F7FF81E8854A855B854115510531F041\r
+:102E5000EF3F31F481E0FF3F19F403C081E001C08E\r
+:102E600080E080FD23C020917A0130E0C901019605\r
+:102E7000877099276091790170E086179707F1F1C3\r
+:102E8000F983EA835D834C8396E0929FD001939F00\r
+:102E9000B00D1124A558BE4FFE01319601900D9240\r
+:102EA0009A95E1F780937A010E94651416E080916B\r
+:102EB000790190917A01891779F1189FC001112445\r
+:102EC00085589E4F0E94FC14882331F1E0917901CE\r
+:102ED0001E9FF0011124E558FE4F4081518162810F\r
+:102EE0007381848195810E9455148091790190E0CD\r
+:102EF00001968770992780937901D9CF0E94191480\r
+:102F000010927A0110927901EBEAF1E086E0DF019C\r
+:102F10001D928A95E9F7CACF2C960FB6F894DEBFBA\r
+:102F20000FBECDBFDF91CF911F910895EF92FF9219\r
+:102F30000F931F93CF93DF939C01009709F471C007\r
+:102F4000F12CEE24E394E9012196F9018491843770\r
+:102F500040F4843008F056C0813081F0823021F195\r
+:102F600060C0853709F449C0C0F19CE7980F9037DD\r
+:102F700008F057C08F770E94071146C089010E5F85\r
+:102F80001F4FFE01849190E2980F983050F48770A3\r
+:102F9000FE2D01C0FF0F8A95EAF78F2F0E94D41AE9\r
+:102FA00015C00E943F1014C089010E5F1F4FFE0123\r
+:102FB000849190E2980F983068F48770FE2D01C0DC\r
+:102FC000FF0F8A95EAF78F2F0E94DA1A0E94071BDB\r
+:102FD000E8011AC00E940711FBCF2E5F3F4FFE0190\r
+:102FE000C491CC2341F08FE99FE00197F1F700C035\r
+:102FF0000000C150F6CFE90107C0FE01F490E901DD\r
+:10300000229602C00E943F108F2D882341F0EFE9E5\r
+:10301000FFE03197F1F700C000008150F6CF9E012C\r
+:1030200092CFDF91CF911F910F91FF90EF90089574\r
+:1030300008956093B5017093B6018093B7019093A2\r
+:10304000B8010C9405140F931F930091B5011091D2\r
+:10305000B6012091B7013091B801062B172B282B10\r
+:10306000392B0093B5011093B6012093B70130932B\r
+:10307000B8011F910F910C9405140F931F930091A9\r
+:10308000B5011091B6012091B7013091B801062326\r
+:103090001723282339230093B5011093B6012093F9\r
+:1030A000B7013093B8011F910F910C9405140F9341\r
+:1030B0001F930091B5011091B6012091B701309195\r
+:1030C000B80106271727282739270093B501109341\r
+:1030D000B6012093B7013093B8011F910F910C9462\r
+:1030E00005141092B1011092B2011092B301109226\r
+:1030F000B4010C94051441E050E060E070E004C0BD\r
+:10310000440F551F661F771F8A95D2F74093B10170\r
+:103110005093B2016093B3017093B4010C94051401\r
+:1031200041E050E060E070E004C0440F551F661FAE\r
+:10313000771F8A95D2F78091B1019091B201A09149\r
+:10314000B301B091B401842B952BA62BB72B8093A0\r
+:10315000B1019093B201A093B301B093B4010C9468\r
+:10316000051441E050E060E070E004C0440F551FDA\r
+:10317000661F771F8A95D2F7409550956095709598\r
+:103180008091B1019091B201A091B301B091B401CD\r
+:1031900084239523A623B7238093B1019093B20192\r
+:1031A000A093B301B093B4010C94051441E050E036\r
+:1031B00060E070E004C0440F551F661F771F8A95BA\r
+:1031C000D2F78091B1019091B201A091B301B09179\r
+:1031D000B40184279527A627B7278093B101909340\r
+:1031E000B201A093B301B093B4010C9405140F93F2\r
+:1031F0001F930091B1011091B2012091B301309160\r
+:10320000B401062B172B282B392B0093B1011093F7\r
+:10321000B2012093B3013093B4011F910F910C942C\r
+:1032200005140F931F930091B1011091B2012091E9\r
+:10323000B3013091B40106231723282339230093C7\r
+:10324000B1011093B2012093B3013093B4011F91E7\r
+:103250000F910C9405140F931F930091B1011091DD\r
+:10326000B2012091B3013091B40106271727282716\r
+:1032700039270093B1011093B2012093B301309329\r
+:10328000B4011F910F910C9405140895CF92DF9211\r
+:10329000EF92FF920F931F93CF93DF93EC01C090B7\r
+:1032A000B501D090B601E090B701F090B8018091DF\r
+:1032B000B1019091B201A091B301B091B401C82ABB\r
+:1032C000D92AEA2AFB2A0FE110E0B701A601002E55\r
+:1032D00004C076956795579547950A94D2F740FDB7\r
+:1032E00005C00150110988F780E007C0BE01802F9A\r
+:1032F0000E9489070197A9F3802FDF91CF911F9139\r
+:103300000F91FF90EF90DF90CF900895CF93DF93D0\r
+:10331000EC010E944619BE010E948907DF91CF91FE\r
+:103320000895CB010E94861908958091BE010895E9\r
+:103330008093BE0108951092BE0108950E94081C5A\r
+:103340002091BC013091BD018217930750F00E947B\r
+:10335000081C2091BC013091BD01821B930B9C0184\r
+:103360000AC00E94081C2091BC013091BD0120952B\r
+:103370003095280F391F81E0283B3B4008F480E05E\r
+:1033800008958091BB0185958595859508958091D7\r
+:10339000BB01877008950E94081C2091B9013091EB\r
+:1033A000BA018217930768F00E94081C2091B901A6\r
+:1033B0003091BA01821B930B883B9B4078F480E0EC\r
+:1033C00014C00E94081C2091B9013091BA012095C7\r
+:1033D0003095280F391F283B3B4088F38091BB0173\r
+:1033E00082FB882780F991E089278170089598E011\r
+:1033F000899F90011124622B6093BB010E94901859\r
+:103400000E94081C9093BA018093B901089510920C\r
+:10341000BB011092BA011092B90108954091BB010D\r
+:10342000809584238093BB01982F977089F450E096\r
+:10343000282F332727FD30954217530749F08595EC\r
+:10344000859585950E94B1181092BA011092B90124\r
+:1034500008959091BB01977081E009F480E0089590\r
+:1034600090910C019923D9F090910D019923B9F015\r
+:10347000982F9695969596959F3088F5E0910E0138\r
+:10348000F0910F01E90FF11D877021E030E001C0DC\r
+:10349000220F8A95EAF78181822B818308954091DA\r
+:1034A0000E0150910F0120E030E09FEFFA01E20F92\r
+:1034B000F31F6281681799F09F3F19F4611101C0F1\r
+:1034C000922F2F5F3F4F2E30310581F79F3F39F00C\r
+:1034D000FA01E90FF11D97FDFA9582830895089589\r
+:1034E00090910C019923E1F090910D019923C1F085\r
+:1034F000982F9695969596959F3020F5E0910E0120\r
+:10350000F0910F01E90FF11D877021E030E001C05B\r
+:10351000220F8A95EAF72095818128232183089537\r
+:1035200040910E0150910F0120E030E0FA01E20FCE\r
+:10353000F31F9281981301C012822F5F3F4F2E30EC\r
+:103540003105A1F7089581E090E0E0910E01F0913E\r
+:103550000F01E80FF91F1082019680319105A9F73C\r
+:1035600008958091D20108959091D201982B909363\r
+:10357000D201089580959091D20198239093D20121\r
+:1035800008951092D20108959091D101982B9093B3\r
+:10359000D101089580959091D10198239093D10104\r
+:1035A00008951092D10108959091D001982B909395\r
+:1035B000D001089580959091D00198239093D001E7\r
+:1035C00008951092D00108958093BF010E94081CB5\r
+:1035D0009093BD018093BC0108951092BF01109299\r
+:1035E000BD011092BC01089540910E0150910F0150\r
+:1035F00020E030E080E0FA01E20FF31F91819111A9\r
+:103600008F5F2F5F3F4F2F303105A9F70895E0916D\r
+:103610000E01F0910F018091D2018083E0910E01A3\r
+:10362000F0910F0180819091D101892B8083E091ED\r
+:103630000E01F0910F0180819091D001892B808340\r
+:103640008091BF01882399F00E949E1981110E94E8\r
+:10365000ED1AE0910E01F0910F0180819091BF0170\r
+:10366000892B80830E94F41A81110E94ED1A8091A7\r
+:103670000E0190910F010C94220FCF92DF92EF92E6\r
+:10368000FF920F931F936C01EE24FF24C114D10409\r
+:10369000E104F10421F46B017C0180E001C080E1D0\r
+:1036A00033272F2D1E2D0D2D011511052105310557\r
+:1036B00019F0885F6801790197018601A4E03695C9\r
+:1036C000279517950795AA95D1F70115110521059D\r
+:1036D000310519F08C5F6801790197018601F2E0EC\r
+:1036E0003695279517950795FA95D1F70115110588\r
+:1036F0002105310519F08E5F68017901B701A60136\r
+:103700007695679557954795452B462B472B09F09E\r
+:103710008F5F1F910F91FF90EF90DF90CF900895F2\r
+:103720008091E801843021F11092D40120E488E1F5\r
+:1037300090E00FB6F894A895809360000FBE209398\r
+:10374000600080E00E94240883B7817F846083BF8B\r
+:1037500083B7816083BF7894889583B78E7F83BF5A\r
+:1037600088E10FB6F89480936000109260000FBE5D\r
+:10377000089508950895CF930E94B91B0E944804AC\r
+:103780000E94BA1BC0E08C2F0E943505811105C034\r
+:10379000CF5FCE30C1F780E001C081E0CF910895C6\r
+:1037A0000E9419140E94160F0C9424081F920F9265\r
+:1037B0000FB60F9211248F939F93AF93BF93809175\r
+:1037C000D401811113C08091D5019091D601A091AF\r
+:1037D000D701B091D8014196A11DB11D8093D501AB\r
+:1037E0009093D601A093D701B093D801BF91AF9128\r
+:1037F0009F918F910F900FBE0F901F90189582E0B0\r
+:1038000084BD93E095BD9AEF97BD80936E000895B7\r
+:103810002FB7F8948091D5019091D601A091D7014E\r
+:10382000B091D8012FBF0895CF92DF92EF92FF920F\r
+:103830000F931F932FB7F8944091D5015091D60163\r
+:103840006091D7017091D8012FBF6A017B01EE24EE\r
+:10385000FF248C0120E030E0C016D106E206F3061A\r
+:1038600010F441505109481B590BCA011F910F9187\r
+:10387000FF90EF90DF90CF9008951F920F920FB6B8\r
+:103880000F9211248F939F93AF93BF938091D50193\r
+:103890009091D601A091D701B091D8010196A11DB8\r
+:1038A000B11D8093D5019093D601A093D701B09319\r
+:1038B000D801BF91AF919F918F910F900FBE0F9044\r
+:1038C0001F9018950E941C0CF8942FEF87EA91E640\r
+:1038D000215080409040E1F700C0000087E090EB6D\r
+:1038E000DC018093F2019093F301A093F401B09373\r
+:1038F000F5012CE088E190E00FB6F894A89580934C\r
+:1039000060000FBE20936000FFCFEF92FF920F93F5\r
+:103910001F93CF93DF93E82EF12C8F2D0E94350556\r
+:10392000C0E0D0E0082F10E098010C2E02C03595C1\r
+:1039300027950A94E2F720FD05C02196C630D105EF\r
+:1039400099F709C06C2F7F2D80E00E943D05E81299\r
+:10395000F4CF81E005C0F3948EE0F812DECF80E072\r
+:10396000DF91CF911F910F91FF90EF900895CF932A\r
+:10397000C82F8CE20E94851C882321F08C2FCF91C8\r
+:103980000C94851C80E0CF910895CF930E940A1E6D\r
+:10399000811102C00E94F01DC5E6C15049F00E948D\r
+:1039A00048048FE39CE90197F1F700C00000F5CFD0\r
+:1039B00089E20E94B71C811111C18AE20E94B71CE2\r
+:1039C00081110E94F01D85E00E94B71C81110E94A8\r
+:1039D000621C0E94151E8093D30187E00E94B71CD1\r
+:1039E000882399F18BE10E94B71C882351F09091B4\r
+:1039F000D30191FB882780F921E0822780FB91F990\r
+:103A000022C08EE00E94B71C882351F09091D30110\r
+:103A100092FB882780F921E0822780FB92F913C06E\r
+:103A200080E10E94B71C9091D301882341F093FB61\r
+:103A3000882780F921E0822780FB93F904C0892F31\r
+:103A4000809580FB90F99093D3018091D3010E94DF\r
+:103A5000191E0E94271E8093F10180EE0E94B71C60\r
+:103A6000882341F08091F101982F909590FB80F987\r
+:103A70008093F10189E30E94B71C882359F090914B\r
+:103A8000F10191FB882780F921E0822780FB91F9E1\r
+:103A90009093F10182EE0E94B71C882359F0909117\r
+:103AA000F10192FB882780F921E0822780FB92F9BF\r
+:103AB0009093F10186EE0E94B71C882359F09091F3\r
+:103AC000F10193FB882780F921E0822780FB93F99D\r
+:103AD0009093F10183EE0E94B71C882359F09091D6\r
+:103AE000F10194FB882780F921E0822780FB94F97B\r
+:103AF0009093F10185E30E94B71C882359F09091BF\r
+:103B0000F10195FB882780F921E0822780FB95F958\r
+:103B10009093F10181E30E94B71C882359F09091A2\r
+:103B2000F10196FB882780F921E0822780FB96F936\r
+:103B30009093F10181E10E94B71C882359F0909184\r
+:103B4000F10197FB882780F921E0822780FB97F914\r
+:103B50009093F1018091F1010E942B1E8091F1015F\r
+:103B600087FB882780F980930D0187E20E94B71CAC\r
+:103B7000C82F8EE10E94B71C8111C2608FE10E94A4\r
+:103B8000B71C8111C46080E20E94B71C8111C8601B\r
+:103B900081E20E94B71C8111C06182E20E94B71CC1\r
+:103BA0008111C06283E20E94B71C8111C06484E26B\r
+:103BB0000E94B71C882311F0C06802C0CC2329F0F2\r
+:103BC0008C2F0E94221E6C2F03C00E941E1E682F85\r
+:103BD00070E080E090E0CF910C941918CF91089597\r
+:103BE0006DEE7EEF80E090E00E94DD2360E082E0F9\r
+:103BF00090E00E94CB2360E083E090E00E94CB2322\r
+:103C000060E084E090E00E94CB2360E085E090E0FB\r
+:103C10000C94CB2380E090E00E94C52321E08D3EF0\r
+:103C20009E4F09F020E0822F089582E090E00C94EE\r
+:103C3000BD23682F82E090E00C94CB2383E090E0DA\r
+:103C40000C94BD23682F83E090E00C94CB2384E098\r
+:103C500090E00C94BD23682F84E090E00C94CB237B\r
+:103C60008091DB0180FF0BC06091130185E0689FAC\r
+:103C7000B001112475956795759567952AC081FFE8\r
+:103C800009C06091130185E0689FB001112475950A\r
+:103C900067951FC082FF07C06091130185E0689F90\r
+:103CA000B001112416C04091DC014423C9F0609199\r
+:103CB0001201461788F72091130185E0289F900193\r
+:103CC0001124429FC001439F900D112470E00E9477\r
+:103CD0008F236038710540F46115710539F002C019\r
+:103CE00065E070E0862F08958FE7089581E00895DC\r
+:103CF0008091DB0180FF08C06091110170E0759533\r
+:103D000067957595679521C081FF06C06091110187\r
+:103D100070E07595679519C082FF04C0609111012C\r
+:103D200070E010C08091DC018823C1F06091100127\r
+:103D30008617A0F790911101989FC001112470E09F\r
+:103D40000E948F236038710528F46115710521F0F8\r
+:103D5000862F08958FE7089581E0089561E070E06F\r
+:103D6000F4CF803F21F40E94301E819504C0813F32\r
+:103D700029F40E94301E8093DF010895823F21F4D0\r
+:103D80000E94301E819504C0833F29F40E94301E9A\r
+:103D90008093DE010895893F19F40E94781E05C0C2\r
+:103DA0008A3F31F40E94781E81958093E001089546\r
+:103DB0008B3F21F40E94781E819504C08C3F29F42A\r
+:103DC0000E94781E8093E1010895843F21F4809140\r
+:103DD000DD01816017C0853F21F48091DD018260A3\r
+:103DE00011C0863F21F48091DD0184600BC0873FC4\r
+:103DF00021F48091DD01886005C0883F31F4809115\r
+:103E0000DD0180618093DD0108958D3F21F4809173\r
+:103E1000DB0181600BC08E3F21F48091DB01826069\r
+:103E200005C08F3F29F48091DB0184608093DB0122\r
+:103E30000895803F39F48091DF0187FF6CC01092B4\r
+:103E4000DF0169C0813F29F48091DF011816BCF3BE\r
+:103E500062C09091DE01823F29F497FF5CC010920E\r
+:103E6000DE0159C0833F19F41916CCF354C0893FC1\r
+:103E700041F48091E00118160CF04DC01092E00161\r
+:103E80004AC08A3F29F48091E00187FF44C0F6CF01\r
+:103E90008B3F39F48091E10187FF3DC01092E10131\r
+:103EA0003AC08C3F29F48091E1011816BCF333C06D\r
+:103EB000843F21F48091DD018E7F17C0853F21F47E\r
+:103EC0008091DD018D7F11C0863F21F48091DD015D\r
+:103ED0008B7F0BC0873F21F48091DD01877F05C078\r
+:103EE000883F31F48091DD018F7E8093DD0113C026\r
+:103EF0008D3F21F48091DB018E7F0BC08E3F21F43A\r
+:103F00008091DB018D7F05C08F3F29F48091DB011B\r
+:103F10008B7F8093DB018091DE0181110EC0809147\r
+:103F2000DF0181110AC08091E001811106C08091FA\r
+:103F3000E101811102C01092DC0108958DED91E044\r
+:103F40000E942D0F0E94081C9093DA018093D901E2\r
+:103F500008951F93CF93DF938091D9019091DA0157\r
+:103F60000E94141C4091DC01442321F02091140193\r
+:103F700030E006C0209115015AE0259F90011124E0\r
+:103F80008217930708F482C08091DE011091DF014F\r
+:103F9000D091E001C091E101811107C0111105C06C\r
+:103FA000D11103C0CC2309F471C04F3F19F04F5F0A\r
+:103FB0004093DC01181624F40E94301E8093DE0129\r
+:103FC0008091DE0187FF05C00E94301E819580939D\r
+:103FD000DE01111624F40E94301E8093DF018091CF\r
+:103FE000DF0187FF05C00E94301E81958093DF01AD\r
+:103FF0006091DE01662339F11091DF01112319F17F\r
+:10400000772767FD7095872F972F0E94A02223E3C3\r
+:1040100033E343E35FE30E9404230E946D22609335\r
+:10402000DE01612F772767FD7095872F972F0E94FC\r
+:10403000A02223E333E343E35FE30E9404230E94CF\r
+:104040006D226093DF011D1624F40E94781E809378\r
+:10405000E0018091E00187FF05C00E94781E8195F4\r
+:104060008093E0011C1624F40E94781E8093E101E5\r
+:104070008091E10187FF05C00E94781E81958093A1\r
+:10408000E101DF91CF911F910C949E1FDF91CF91A1\r
+:104090001F910895EDEDF1E085E0DF011D928A9515\r
+:1040A000E9F71092DC011092DB010895833081F171\r
+:1040B00028F4813059F08230D1F00895853009F428\r
+:1040C00049C0B8F1863009F456C008952091150111\r
+:1040D000862F90E0820F911D8F3F910520F4620F93\r
+:1040E0006093150108958FEF809315010895209135\r
+:1040F0001401862F90E0820F911D8F3F910520F4CF\r
+:10410000620F6093140108958FEF80931401089556\r
+:1041100020911301862F90E0820F911D8F3F910512\r
+:1041200020F4620F6093130108958FEF80931301C1\r
+:10413000089520911201862F90E0820F911D8F3FEC\r
+:10414000910520F4620F6093120108958FEF809320\r
+:104150001201089520911101862F90E0820F911D88\r
+:104160008F3F910520F4620F6093110108958FEF46\r
+:1041700080931101089520911001862F90E0820F05\r
+:10418000911D8F3F910520F4620F609310010895F7\r
+:104190008FEF809310010895833011F128F481305E\r
+:1041A00049F0823091F00895853081F120F1863018\r
+:1041B000C1F1089580911501681720F4861B809342\r
+:1041C0001501089510921501089580911401681742\r
+:1041D00020F4861B80931401089510921401089511\r
+:1041E00080911301681720F4861B809313010895B2\r
+:1041F00010921301089580911201681720F4861B14\r
+:104200008093120108951092120108958091110176\r
+:10421000681720F4861B80931101089510921101F4\r
+:10422000089580911001681720F4861B8093100177\r
+:1042300008951092100108958B3109F46AC008F5B1\r
+:104240008E3009F470C070F4873009F452C018F44D\r
+:104250008630B9F134C0883009F4A1C08B3009F43C\r
+:104260009EC02DC0813109F479C020F4803109F459\r
+:1042700064C025C0863109F492C0893109F48FC029\r
+:104280001EC0853309F483C060F4873209F47FC00F\r
+:1042900020F48E3108F06DC012C0893209F477C065\r
+:1042A0000EC0833438F48A3308F061C0883309F4CF\r
+:1042B00076C005C0833409F46AC0883461F080E0B8\r
+:1042C00008958091D301817F8E7F8093D30181E017\r
+:1042D0008093E30108950E9419142FEF83ED90E37A\r
+:1042E000215080409040E1F700C000000E94621C15\r
+:1042F00056C09091D301892F8095817080FB90F9F1\r
+:1043000019F09660986027C0997F977F9093D301AA\r
+:1043100046C09091D30191FB882780F921E0822744\r
+:1043200080FB91F913C09091D30192FB882780F90B\r
+:1043300021E0822780FB92F909C09091D30193FB81\r
+:10434000882780F921E0822780FB93F99093D3019D\r
+:10435000882329F191609093D30108950E94191444\r
+:1043600080910D0191E0892780930D0118C027EC01\r
+:1043700001C023EE280F61E070E080E090E004C00F\r
+:10438000660F771F881F991F2A95D2F704C061E036\r
+:1043900070E080E090E00E9419180E94191481E0FA\r
+:1043A000089580E0089580E00895CF93C82F80910C\r
+:1043B000E301813079F018F08230D1F184C0A0910E\r
+:1043C0000E01B0910F018C91813169F0823209F0B8\r
+:1043D0007CC009C0A0910E01B0910F018C91813178\r
+:1043E00011F0823249F48C2F0E94D12181111DC01D\r
+:1043F0008C2F0E941C211AC08C2F0E94D321811166\r
+:1044000014C0C43179F048F4CB3079F0C03109F0F0\r
+:1044100060C082E08093E30108C0C93219F0C8335C\r
+:1044200021F057C01092E30154C081E0817053C065\r
+:10443000C93289F118F5C43171F1A8F4C73009F017\r
+:1044400046C08AE08093150194E19093140193E0B3\r
+:10445000909313018093120188E08093110188E208\r
+:104460008093100134C0CE51C63088F5EC2FF0E0B7\r
+:10447000E65DFE4F80818093E20129C0CE34E9F0F1\r
+:1044800020F4CB3421F56AE013C0C13579F0C23590\r
+:10449000F1F461E00DC08091E201882319F01092DF\r
+:1044A000E20115C081E08093E30115C061E006C020\r
+:1044B0008091E2010E9456200AC06AE08091E201E8\r
+:1044C0000E94CC2004C01092E30180E004C081E08F\r
+:1044D00002C080E0ABCFCF91089504D06894B111B1\r
+:1044E0008DC0089570D088F09F5790F0B92F99270C\r
+:1044F000B751A0F0D1F0660F771F881F991F1AF0EF\r
+:10450000BA95C9F712C0B13081F077D0B1E0089503\r
+:1045100074C0672F782F8827B85F39F0B93FCCF384\r
+:10452000869577956795B395D9F73EF490958095E4\r
+:10453000709561957F4F8F4F9F4F0895E89409C004\r
+:1045400097FB3EF490958095709561957F4F8F4FC6\r
+:104550009F4F9923A9F0F92F96E9BB279395F695DC\r
+:10456000879577956795B795F111F8CFFAF4BB0F5A\r
+:1045700011F460FF1BC06F5F7F4F8F4F9F4F16C0BE\r
+:10458000882311F096E911C0772321F09EE8872F48\r
+:10459000762F05C0662371F096E8862F70E060E004\r
+:1045A0002AF09A95660F771F881FDAF7880F96957D\r
+:1045B000879597F9089557FD9058440F551F59F066\r
+:1045C0005F3F71F04795880F97FB991F61F09F3F00\r
+:1045D00079F087950895121613061406551FF2CF29\r
+:1045E0004695F1DF08C0161617061806991FF1CF79\r
+:1045F00086957105610508940895E894BB276627A0\r
+:104600007727CB0197F908950BD078C069D028F0AF\r
+:104610006ED018F0952309F05AC05FC01124EECF78\r
+:10462000CADFA0F3959FD1F3950F50E0551F629F0D\r
+:10463000F001729FBB27F00DB11D639FAA27F00DFB\r
+:10464000B11DAA1F649F6627B00DA11D661F829F22\r
+:104650002227B00DA11D621F739FB00DA11D621F07\r
+:10466000839FA00D611D221F749F3327A00D611D24\r
+:10467000231F849F600D211D822F762F6A2F112406\r
+:104680009F5750408AF0E1F088234AF0EE0FFF1F59\r
+:10469000BB1F661F771F881F91505040A9F79E3F90\r
+:1046A000510570F014C0AACF5F3FECF3983EDCF3E5\r
+:1046B000869577956795B795F795E7959F5FC1F7CD\r
+:1046C000FE2B880F911D9695879597F9089597F978\r
+:1046D0009F6780E870E060E008959FEF80EC0895A8\r
+:1046E00000240A94161617061806090608950024D1\r
+:1046F0000A9412161306140605060895092E03944B\r
+:10470000000C11F4882352F0BB0F40F4BF2B11F4BE\r
+:1047100060FF04C06F5F7F4F8F4F9F4F089597FBDF\r
+:10472000072E16F4009407D077FD09D00E94A92324\r
+:1047300007FC05D03EF4909581959F4F08957095A4\r
+:1047400061957F4F0895EE0FFF1F0590F491E02DC6\r
+:104750000994AA1BBB1B51E107C0AA1FBB1FA617C8\r
+:10476000B70710F0A61BB70B881F991F5A95A9F71A\r
+:1047700080959095BC01CD010895F999FECF92BD29\r
+:1047800081BDF89A992780B50895A8E1B0E042E08C\r
+:1047900050E00C94E523262FF999FECF92BD81BD00\r
+:1047A000F89A019700B4021639F01FBA20BD0FB66F\r
+:1047B000F894FA9AF99A0FBE08950196272F0E944D\r
+:1047C000CC230C94CB23DC01CB01FC01F999FECF67\r
+:1047D00006C0F2BDE1BDF89A319600B40D92415089\r
+:0A47E0005040B8F70895F894FFCF99\r
+:1047EA0020022608B30890085C0829080101C001C4\r
+:1047FA0028080A03140A3F4D363979042C04F603B3\r
+:10480A00BD035003690382039B03010203040506E7\r
+:04481A000708090082\r
 :00000001FF\r
index bf5a974bfe484a0222e2d4a6d67b81c69f21a51e..f4e4f92e0133e0ea8db0c63b9392c7fbe46a11e4 100644 (file)
@@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * |--------+------+------+------+------+------| Hyper|           | Meh  |------+------+------+------+------+--------|
  * |LShift/(|Z/Ctrl|   X  |   C  |   V  |   B  |   [  |           |  ]   |   N  |   M  |   ,  |   .  |//Ctrl|RShift/)|
  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
- *   |Grv/L1|  '"  |AltShf| Left | Right|                                       |  Up  | Down |   [  |   ]  |   -  |
+ *   |Grv/L1|  '"  |AltShf| Left | Right|                                       |  Up  | Down |   [  |   ]  | -/L1  |
  *   `----------------------------------'                                       `----------------------------------'
  *                                        ,-------------.       ,-------------.
  *                                        | App  | LGui |       | Alt  |Ctrl/Esc|
@@ -49,7 +49,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
              TG(SYMB),      KC_Y,KC_U,       KC_I,   KC_O,   KC_P,            KC_BSLS,
                             KC_H,ALT_T(KC_J),KC_K,   KC_L,   LT(MDIA,KC_SCLN),GUI_T(KC_QUOT),
              MEH_T(KC_RBRC),KC_N,KC_M,       KC_COMM,KC_DOT, CTL_T(KC_SLSH),  RSFTC,
-                            KC_UP,           KC_DOWN,KC_LBRC,KC_RBRC,         KC_MINS,
+                            KC_UP,           KC_DOWN,KC_LBRC,KC_RBRC,         LT(SYMB,KC_MINS),
              KC_LALT,       CTL_T(KC_ESC),
              KC_PGUP,
              KC_PGDN,LT(SYMB, KC_TAB), KC_ENT
@@ -59,13 +59,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * ,--------------------------------------------------.           ,--------------------------------------------------.
  * |        |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
- * |        |   1  |   2  |   3  |   4  |      |      |           |      |      |   %  |   =  |   @  |      |   F12  |
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |   F12  |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |   5  |   6  |   7  |   8  |   9  |------|           |------|   &  |   _  |   -  |   ;  |   +  |        |
+ * |        |   1  |   2  |   3  |   4  |   5  |------|           |------|   &  |   _  |   -  |   ;  |   +  |        |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |   (  |   )  |   [  |   ]  |   0  |      |           |      |   |  |   (  |   )  |      |      |        |
+ * |        |   6  |   7  |   8  |   9  |   0  |      |           |      |   |  |   @  |   =  |   %  |      |        |
  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
- *   |      |      |      |      |      |                                       |      |      |      |      |      |
+ *   |      |      |      |NxtTab|PrvTab|                                       |      |      |      |      |      |
  *   `----------------------------------'                                       `----------------------------------'
  *                                        ,-------------.       ,-------------.
  *                                        |      |      |       |      |      |
@@ -79,19 +79,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, KC_1,   KC_2,   KC_3,          KC_4,         KC_TRNS, KC_TRNS,
-       KC_TRNS, KC_5,   KC_6,   KC_7,          KC_8,         KC_9,
-       KC_TRNS, KC_LPRN,KC_RPRN,KC_LBRC,       KC_RBRC,      KC_0,    KC_TRNS,
+       KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,       KC_TRNS,      KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_1,   KC_2,   KC_3,          KC_4,         KC_5,
+       KC_TRNS, KC_6,   KC_7,   KC_8,          KC_9,         KC_0,    KC_TRNS,
        KC_TRNS, KC_TRNS,KC_TRNS,LCTL(KC_PGUP), LCTL(KC_PGDN),
                                                                               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_TRNS, KC_PERC,KC_EQL,  KC_AT,   KC_TRNS, KC_F12,
-                KC_AMPR, KC_UNDS,KC_MINS, CM_SCLN, KC_PLUS, KC_TRNS,
-       KC_TRNS, KC_PIPE, KC_LPRN,KC_RPRN, KC_3,    KC_TRNS, KC_TRNS,
-                         KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12,
+                KC_AMPR, KC_UNDS, KC_MINS, CM_SCLN, KC_PLUS, KC_TRNS,
+       KC_TRNS, KC_PIPE, KC_AT,   KC_EQL,  KC_PERC,   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
@@ -101,13 +101,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * ,--------------------------------------------------.           ,--------------------------------------------------.
  * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
- * |        |      |      | MsUp |      |      |      |           |      |      |      |      |      |      |        |
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |      |MsLeft|MsDown|MsRght|      |------|           |------|      |      |      |      |      |  Play  |
+ * |        | PgUp | Home | End  | PgDn |      |------|           |------|      |      |      |      |      |  Play  |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
  * |        |      |      |      |      |      |      |           |      |      |      | Prev | Next |      |        |
  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
- *   |      |      |      | Lclk | Rclk |                                       |VolUp |VolDn | Mute |      |      |
+ *   |      |      |      |      |      |                                       |VolUp |VolDn | Mute |      |      |
  *   `----------------------------------'                                       `----------------------------------'
  *                                        ,-------------.       ,-------------.
  *                                        |      |      |       |      |      |
@@ -120,10 +120,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 // MEDIA AND MOUSE
 [MDIA] = KEYMAP(
        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
-       KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
-       KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
-       KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
+       KC_TRNS, KC_PGUP, KC_HOME, KC_END,  KC_PGDN, 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,
@@ -140,7 +140,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 };
 
 const uint16_t PROGMEM fn_actions[] = {
-    [1] = ACTION_LAYER_TAP_TOGGLE(SYMB)                // FN1 - Momentary Layer 1 (Symbols)
+    [1] = ACTION_LAYER_TAP_TOGGLE(SYMB),               // FN1 - Momentary Layer 1 (Symbols)
+    [2] = ACTION_MACRO_TAP(0),                         // Eric Tang's Famous Macro!
+    [3] = ACTION_MACRO_TAP(1)                          // Eric Tang's Famous Macro!
 };
 
 static uint16_t key_timer;
@@ -148,33 +150,46 @@ static uint16_t key_timer;
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 {
       switch(id) {
-        case 0: {
-            if (record->event.pressed) {
-                key_timer = timer_read(); // if the key is being pressed, we start the timer.
-                register_code(KC_LSFT); // we're now holding down Shift.
-            } else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down").
-                if (timer_elapsed(key_timer) < 70) { // the threshhold we pick for counting something as a tap. 
-                    register_code(KC_9); // sending 9 while Shift is held down gives us an opening paren
-                    unregister_code(KC_9); // now let's let go of that key
-                }
-                unregister_code(KC_LSFT); // let's release the Shift key now.
-            }
-            break;
-        }
-        case 1: {
-            if (record->event.pressed) {
-                key_timer = timer_read(); // Now we're doing the same thing, only for the right shift/close paren key
-                register_code(KC_RSFT); 
-            } else { 
-                if (timer_elapsed(key_timer) < 70) { 
-                    register_code(KC_0); 
-                    unregister_code(KC_0); 
-                }
-                unregister_code(KC_RSFT); 
-            }
-            break;
+        case 0:
+          if (record->event.pressed) {
+              register_mods(MOD_BIT(KC_LSFT));
+              if (record->tap.count && !record->tap.interrupted) {
+                  register_code(KC_9);
+              }
+              else {
+                  record->tap.count = 0;
+              }
+          }
+          else {
+              if (record->tap.count) {
+                  unregister_code(KC_9);
+              }
+              else {
+              }
+              unregister_mods(MOD_BIT(KC_LSFT));
+          }
+          break;
+
+        case 1:
+          if (record->event.pressed) {
+              register_mods(MOD_BIT(KC_LSFT));
+              if (record->tap.count && !record->tap.interrupted) {
+                  register_code(KC_0);
+              }
+              else {
+                  record->tap.count = 0;
+              }
+          }
+          else {
+              if (record->tap.count) {
+                  unregister_code(KC_0);
+              }
+              else {
+              }
+              unregister_mods(MOD_BIT(KC_LSFT));
+          }
+          break;
         }
-      }
     return MACRO_NONE;
 };
 
diff --git a/keyboard/ergodox_ez/keymaps/erez_experimental/makefile.mk b/keyboard/ergodox_ez/keymaps/erez_experimental/makefile.mk
new file mode 100644 (file)
index 0000000..4c3a314
--- /dev/null
@@ -0,0 +1,5 @@
+# Having a file like this allows you to override Makefile definitions
+# for your own particular keymap
+
+SLEEP_LED_ENABLE = no  # Breathing sleep LED during USB suspend
+
index 205280e290488a5adf4fb0747f83c0ed955d31d0..a9c572390aebc0260d8fa4e3b5b4c3c9fb8578d7 100644 (file)
@@ -4,6 +4,14 @@ This is my personal layout which I use to test out ideas which may or may not ma
 
 Changelog:
 
+## May 8, 2016:
+
+* Makes bottom-right key send minus/underscore when tapped, L1 temporary toggle when held
+* Tweaked the positions of the numbers on the symbol layer. Basically, 12345 are now directly under their number-row counterparts in layer 0. You can imagine pulling the number row down to the home row. And 67890 are directly under 12345 - so it's a matter of just adding 5 and going to the next row (1+5 = 6, 2+5 = 7 and so on).
+* Tweaks media/nav layer
+  * Removes mouse control, as I don't use it
+  * Makes left home row keys PgUp, Home, End, PgDn
+
 ## Apr 29, 2016:
 
 * Tweaks the Hyper and Meh key to send brackets when tapped
index efd67addd5ce7b0f5b8dcf065d910f12155c1ff6..18939b1923ac886741a33fa0351d4e33c1a9503b 100644 (file)
 #include "action_layer.h"
 #include "action_util.h"
 
-#define BASE    0 // default layer
-#define LOCK    1 // shift-lock layer
-#define SYMB_SH 2 // symbols shift layer
-#define SYMB_LK 3 // symbols lock layer
-#define SYMB_UN 4 // symbols unlock layer
-#define MDIA_SH 5 // media shift layer
-#define MDIA_LK 6 // media lock layer
-#define MDIA_UN 7 // media unlock layer
-#define UNLOCK  8 // clear to base layer
+#define BASE   0 // default layer
+#define SYMB   1 // symbols layer
+#define MDIA   2 // media layer
+#define SPEC   3 // special layer
+
+#define LCaps 10 // left caps-shift key
+#define LSymb 11 // left symbol-shift key
+#define LMdia 12 // left media-shift key
+#define LSpec 13 // left special-shift key
+#define RCaps 14 // right caps-shift key
+#define RSymb 15 // right symbol-shift key
+#define RMdia 16 // right media-shift key
+#define RSpec 17 // right special-shift key
+
+#define MUL   20 // mouse up left
+#define MUR   21 // mouse up right
+#define MDL   22 // mouse down left
+#define MDR   23 // mouse down right
 
 /*
- * The Ordinary Layout for the Ergodox EZ keyboard, v3.1
- * modifications from default by Nicholas Keene ergodoxez@nicholaskeene.com
+ * The Ordinary Layout for the Ergodox EZ keyboard, v4
+ * 
+ * Modifications from default by Nicholas Keene ergodoxez@nicholaskeene.com
+ *
+ * No rights reserved. This software is in the public domain.
+ * Credit me if you are friendly but if you're a jerk don't bother.
+ * 
  * Details: readme.md
  *          https://github.com/nrrkeene/qmk_firmware/tree/master/keyboard/ergodox_ez/keymaps/ordinary
  */
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
-/* Keymap 0: Base Layer
- *
- * ,-----------------------------------------------------.           ,-----------------------------------------------------.
- * | LOCK   `~ |   1  |   2  |   3  |   4  |   5  | ESC  |           |  -   |   6  |   7  |   8  |   9  |   0  | =    LOCK |
- * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
- * | Media Tab |   Q  |   W  |   E  |   R  |   T  |   [  |           |  ]   |   Y  |   U  |   I  |   O  |   P  | \   Media |
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
- * | Symbol    |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |  ;   | '  Symbol |
- * |-----------+------+------+------+------+------|Shift |           | Tab  |------+------+------+------+------+-----------|
- * | LShift    |   Z  |   X  |   C  |   V  |   B  | -Tab |           |      |   N  |   M  |   ,  |   .  |  /   |    RShift |
- * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
- *     | LCtrl | Meh  |Hyper | LAlt | LGui |                                       | RGui | RAlt | Hyper|  Meh | RCtrl |
- *     `-----------------------------------'                                       `-----------------------------------'
- *                                         ,-------------.           ,-------------.
- *                                         | Home | End  |           | Left | Right|
- *                                  ,------|------|------|           |------+------+------.
- *                                  |      |      | PgUp |           |  Up  |      |      |
- *                                  |Backsp| Del  |------|           |------| Enter| Space|
- *                                  |      |      | PgDn |           | Down |      |      |
- *                                  `--------------------'           `--------------------'
- */
-[BASE] = KEYMAP(
-// left hand
- LT(LOCK, KC_GRV)   ,KC_1        ,KC_2        ,KC_3   ,KC_4  ,KC_5  ,KC_ESC
-,LT(MDIA_SH, KC_TAB),KC_Q        ,KC_W        ,KC_E   ,KC_R  ,KC_T  ,KC_LBRC
-,MO(SYMB_SH)        ,KC_A        ,KC_S        ,KC_D   ,KC_F  ,KC_G
-,KC_LSFT            ,KC_Z        ,KC_X        ,KC_C   ,KC_V  ,KC_B  ,LSFT(KC_TAB)
-,KC_LCTL            ,MEH_T(KC_NO),ALL_T(KC_NO),KC_LALT,KC_LGUI
-
-                                                            ,KC_HOME,KC_END
-                                                                    ,KC_PGUP
-                                                    ,KC_BSPC,KC_DEL ,KC_PGDN
-
-                                                                // right hand
-                                                               ,KC_MINS ,KC_6   ,KC_7   ,KC_8   ,KC_9        ,KC_0        ,LT(LOCK, KC_EQL)
-                                                               ,KC_RBRC ,KC_Y   ,KC_U   ,KC_I   ,KC_O        ,KC_P        ,LT(MDIA_SH, KC_BSLS)
-                                                                        ,KC_H   ,KC_J   ,KC_K   ,KC_L        ,KC_SCLN     ,LT(SYMB_SH, KC_QUOT)
-                                                               ,KC_TAB  ,KC_N   ,KC_M   ,KC_COMM,KC_DOT      ,KC_SLSH     ,KC_RSFT
-                                                                                ,KC_RGUI,KC_RALT,ALL_T(KC_NO),MEH_T(KC_NO),KC_RCTL
-
-                                                               ,KC_LEFT ,KC_RGHT
-                                                               ,KC_UP
-                                                               ,KC_DOWN ,KC_ENT ,KC_SPC
-    ),
-
-/* Keymap 1: Layer Lock Keys
- *
- * ,-------------------------------------------------------.           ,-------------------------------------------------------.
- * |             |  Esc |      |      |      |      |      |           |      |      |      |      |      | Bspc |             |
- * |-------------+------+------+------+------+-------------|           |------+------+------+------+------+------+-------------|
- * | Media  LOCK |      |      |      |      |      |      |           |      |      |      |      |      |      | Media  LOCK |
- * |-------------+------+------+------+------+------|      |           |      |------+------+------+------+------+-------------|
- * | Symbol LOCK |      |      |      |      |      |------|           |------|      |      |      |      |      | Symbol LOCK |
- * |-------------+------+------+------+------+------|      |           |      |------+------+------+------+------+-------------|
- * | Caps   LOCK |      |      |      |      |      |      |           |      |      |      |      |      |      | Caps   LOCK |
- * `-------------+------+------+------+------+-------------'           `-------------+------+------+------+------+-------------'
- *      |        |      |      |      |      |                                       |      |      |      |      |        |
- *      `------------------------------------'                                       `------------------------------------'
- *                                           ,-------------.           ,-------------.
- *                                           |      |      |           |      |      |
- *                                    ,------|------|------|           |------+------+------.
- *                                    |      |      |      |           |      |      |      |
- *                                    |      |      |------|           |------|      |      |
- *                                    |      |      |      |           |      |      |      |
- *                                    `--------------------'           `--------------------'
- */
-[LOCK] = KEYMAP(
-// left hand
- KC_TRNS ,KC_ESC  ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
-,KC_FN3  ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
-,KC_FN2  ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
-,KC_CAPS ,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_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_BSPC ,KC_TRNS
-                                                               ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN3
-                                                                        ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN2
-                                                               ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_CAPS
-                                                                                 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
-
-                                                               ,KC_TRNS ,KC_TRNS
-                                                               ,KC_TRNS
-                                                               ,KC_TRNS ,KC_TRNS ,KC_TRNS
-    ),
-
-/* Keymap 2: Symbol Shift Layer
- *
- * ,-----------------------------------------------------.           ,-----------------------------------------------------.
- * | LOCK      |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |  -   |  F6  |  F7  |  F8  |  F9  |  F10 |      LOCK |
- * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
- * | Media     |   !  |   @  |   {  |   }  |   &  |  <   |           |  >   |   |  |   7  |   8  |   9  |   /  |     Media |
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
- * | Symbol    |   #  |   $  |   (  |   )  |   `  |------|           |------|   /  |   4  |   5  |   6  |   *  |    Symbol |
- * |-----------+------+------+------+------+------| Tab  |           | Shift|------+------+------+------+------+-----------|
- * | LShift    |   %  |   ^  |   [  |   ]  |   ~  |      |           |  -Tab|   \  |   1  |   2  |   3  |   -  |    RShift |
- * `-----------+------+------+------+------+-------------'           `------------+------+------+------+------+------------'
- *      |      |      |      |      |      |                                       |   0  |    . |   =  |   +  | Entr |
- *      `----------------------------------'                                       `----------------------------------'
- *                                         ,-------------.           ,-------------.
- *                                         | Left | Right|           | Home | End  |
- *                                  ,------|------|------|           |------+------+------.
- *                                  |      |      |  Up  |           | PgUp |      |      |
- *                                  |Space |Enter |------|           |------|BackSp| Del  |
- *                                  |      |      | Down |           | PgDn |      |      |
- *                                  `--------------------'           `--------------------'
- */
-[SYMB_SH] = KEYMAP(
-// left hand
- KC_FN2        ,KC_F1   ,KC_F2   ,KC_F3   ,KC_F4   ,KC_F5   ,KC_TRNS
-,MO(MDIA_SH)   ,KC_EXLM ,KC_AT   ,KC_LCBR ,KC_RCBR ,KC_AMPR ,LSFT(KC_COMM)
-,MO(SYMB_SH)   ,KC_HASH ,KC_DLR  ,KC_LPRN ,KC_RPRN ,KC_GRV 
-,KC_LSFT       ,KC_PERC ,KC_CIRC ,KC_LBRC ,KC_RBRC ,KC_TILD ,KC_TAB
-,KC_TRNS       ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
-                                                   ,KC_LEFT ,KC_RGHT
-                                                            ,KC_UP
-                                          ,KC_SPC  ,KC_ENT  ,KC_DOWN
-                                                                    // right hand
-                                                                    ,KC_MINS     ,KC_F6   ,KC_F7 ,KC_F8  ,KC_F9 ,KC_F10  ,KC_FN2
-                                                                    ,LSFT(KC_DOT),KC_PIPE ,KC_7  ,KC_8   ,KC_9  ,KC_SLSH ,MO(MDIA_SH)
-                                                                                 ,KC_SLSH ,KC_4  ,KC_5   ,KC_6  ,KC_ASTR ,MO(SYMB_SH)
-                                                                    ,LSFT(KC_TAB),KC_BSLS ,KC_1  ,KC_2   ,KC_3  ,KC_MINS ,KC_RSFT
-                                                                                          ,GUI_T(KC_0),ALT_T(KC_DOT),ALL_T(KC_EQL),MEH_T(KC_PLUS),CTL_T(KC_ENT)
-                                                                    ,KC_HOME     ,KC_END
-                                                                    ,KC_PGUP
-                                                                    ,KC_PGDN     ,KC_BSPC ,KC_DEL
-),
-
-/* Keymap 3: Symbol Lock Layer
- *
- * ,-----------------------------------------------------.           ,-----------------------------------------------------.
- * | LOCK      |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |  -   |  F6  |  F7  |  F8  |  F9  |  F10 |      LOCK |
- * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
- * | Media     |   !  |   @  |   {  |   }  |   &  |  <   |           |  >   |   |  |   7  |   8  |   9  |   /  |     Media |
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
- * | Symbol    |   #  |   $  |   (  |   )  |   `  |------|           |------|   /  |   4  |   5  |   6  |   *  |    Symbol |
- * |-----------+------+------+------+------+------| Tab  |           | Shift|------+------+------+------+------+-----------|
- * | LShift    |   %  |   ^  |   [  |   ]  |   ~  |      |           |  -Tab|   \  |   1  |   2  |   3  |   -  |    RShift |
- * `-----------+------+------+------+------+-------------'           `------------+------+------+------+------+------------'
- *      |      |      |      |      |      |                                       |   0  |    . |   =  |   +  | Entr |
- *      `----------------------------------'                                       `----------------------------------'
- *                                         ,-------------.           ,-------------.
- *                                         | Left | Right|           | Home | End  |
- *                                  ,------|------|------|           |------+------+------.
- *                                  |      |      |  Up  |           | PgUp |      |      |
- *                                  |Space |Enter |------|           |------|BackSp| Del  |
- *                                  |      |      | Down |           | PgDn |      |      |
- *                                  `--------------------'           `--------------------'
- */
-[SYMB_LK] = KEYMAP(
-// left hand
- MO(SYMB_UN)  ,KC_F1   ,KC_F2   ,KC_F3   ,KC_F4   ,KC_F5   ,KC_TRNS
-,MO(MDIA_SH) ,KC_EXLM ,KC_AT   ,KC_LCBR ,KC_RCBR ,KC_AMPR ,LSFT(KC_COMM)
-,MO(UNLOCK)  ,KC_HASH ,KC_DLR  ,KC_LPRN ,KC_RPRN ,KC_GRV
-,KC_LSFT     ,KC_PERC ,KC_CIRC ,KC_LBRC ,KC_RBRC ,KC_TILD ,KC_TAB
-,KC_TRNS     ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
-                                                 ,KC_LEFT ,KC_RGHT
-                                                          ,KC_UP
-                                        ,KC_SPC  ,KC_ENT  ,KC_DOWN
-                                                                    // right hand
-                                                                    ,KC_MINS     ,KC_F6   ,KC_F7 ,KC_F8  ,KC_F9 ,KC_F10  ,MO(SYMB_UN)
-                                                                    ,LSFT(KC_DOT),KC_PIPE ,KC_7  ,KC_8   ,KC_9  ,KC_SLSH ,MO(MDIA_SH)
-                                                                                 ,KC_SLSH ,KC_4  ,KC_5   ,KC_6  ,KC_ASTR ,MO(UNLOCK)
-                                                                    ,LSFT(KC_TAB),KC_BSLS ,KC_1  ,KC_2   ,KC_3  ,KC_MINS ,KC_RSFT
-                                                                                          ,GUI_T(KC_0),ALT_T(KC_DOT),ALL_T(KC_EQL),MEH_T(KC_PLUS),CTL_T(KC_ENT)
-                                                                    ,KC_HOME     ,KC_END
-                                                                    ,KC_PGUP
-                                                                    ,KC_PGDN     ,KC_BSPC ,KC_DEL
-    ),
-
-/* Keymap 4: Symbol Unlock Layer
+/******* Base Layer ********************************************************************************************************
  *
  * ,------------------------------------------------------.           ,------------------------------------------------------.
- * |            | Esc  |      |      |      |      |      |           |      |      |      |      |      | Bspc |            |
+ * | Special `~ |   1  |   2  |   3  |   4  |   5  | ESC  |           |  -   |   6  |   7  |   8  |   9  |   0  | =+ Special |
  * |------------+------+------+------+------+-------------|           |------+------+------+------+------+------+------------|
- * | Media LOCK |      |      |      |      |      |      |           |      |      |      |      |      |      | Media LOCK |
+ * | Media  Tab |   Q  |   W  |   E  |   R  |   T  |   [  |           |  ]   |   Y  |   U  |   I  |   O  |   P  | \|   Media |
  * |------------+------+------+------+------+------|      |           |      |------+------+------+------+------+------------|
- * |     UNLOCK |      |      |      |      |      |------|           |------|      |      |      |      |      |     UNLOCK |
- * |------------+------+------+------+------+------|      |           |      |------+------+------+------+------+------------|
- * | Caps  LOCK |      |      |      |      |      |      |           |      |      |      |      |      |      | Caps  LOCK |
+ * | Symbol     |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |  ;   | '"  Symbol |
+ * |------------+------+------+------+------+------|Shift |           | Tab  |------+------+------+------+------+------------|
+ * | Capitals   |   Z  |   X  |   C  |   V  |   B  | -Tab |           |      |   N  |   M  |   ,  |   .  |  /   |   Capitals |
  * `------------+------+------+------+------+-------------'           `-------------+------+------+------+------+------------'
- *       |      |      |      |      |      |                                       |      |      |      |      |      |
- *       `----------------------------------'                                       `----------------------------------'
+ *      | LCtrl | Meh  |Hyper | LAlt | LGui |                                       | RGui | RAlt | Hyper|  Meh | RCtrl |
+ *      `-----------------------------------'                                       `-----------------------------------'
  *                                          ,-------------.           ,-------------.
- *                                          |      |      |           |      |      |
+ *                                          | Home | End  |           | Left | Right|
  *                                   ,------|------|------|           |------+------+------.
- *                                   |      |      |      |           |      |      |      |
- *                                   |      |      |------|           |------|      |      |
- *                                   |      |      |      |           |      |      |      |
+ *                                   |      |      | PgUp |           |  Up  |      |      |
+ *                                   |Backsp| Del  |------|           |------| Enter| Space|
+ *                                   |      |      | PgDn |           | Down |      |      |
  *                                   `--------------------'           `--------------------'
  */
-[SYMB_UN] = KEYMAP(
+[BASE] = KEYMAP(
 // left hand
- KC_TRNS     ,KC_ESC  ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
-,TG(MDIA_LK) ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
-,KC_FN1      ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
-,KC_CAPS     ,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_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_BSPC ,KC_TRNS
-                                                                     ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,TG(MDIA_LK)
-                                                                              ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN1
-                                                                     ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_CAPS
-                                                                     ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
-                                                                     ,KC_TRNS ,KC_TRNS
-                                                                     ,KC_TRNS
-                                                                     ,KC_TRNS ,KC_TRNS ,KC_TRNS
-),
+ F(LSpec),KC_1,KC_2,KC_3   ,KC_4  ,KC_5  ,KC_ESC
+,F(LMdia)  ,KC_Q   ,KC_W   ,KC_E   ,KC_R  ,KC_T  ,KC_LBRC
+,M(LSymb)  ,KC_A   ,KC_S   ,KC_D   ,KC_F  ,KC_G
+,M(LCaps)  ,KC_Z   ,KC_X   ,KC_C   ,KC_V  ,KC_B  ,LSFT(KC_TAB)
+,KC_LCTL   ,KC_MEH ,KC_HYPR,KC_LALT,KC_LGUI
+                                         ,KC_HOME,KC_END
+                                                 ,KC_PGUP
+                                 ,KC_BSPC,KC_DEL ,KC_PGDN
+                                                                      // right hand
+                                                                     ,KC_MINS ,KC_6   ,KC_7   ,KC_8   ,KC_9    ,KC_0     ,F(RSpec)
+                                                                     ,KC_RBRC ,KC_Y   ,KC_U   ,KC_I   ,KC_O    ,KC_P     ,F(RMdia)
+                                                                              ,KC_H   ,KC_J   ,KC_K   ,KC_L    ,KC_SCLN  ,F(RSymb)
+                                                                     ,KC_TAB  ,KC_N   ,KC_M   ,KC_COMM,KC_DOT  ,KC_SLSH  ,M(RCaps)
+                                                                                      ,KC_RGUI,KC_RALT,KC_HYPR ,KC_MEH   ,KC_RCTL
+                                                                     ,KC_LEFT ,KC_RGHT
+                                                                     ,KC_UP
+                                                                     ,KC_DOWN ,KC_ENT ,KC_SPC
+    ),
 
-/* Keymap 5: Media Shift Layer
+/******* Symbols Layer *****************************************************************************************************
  *
  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
- * | LOCK      | F11  | F12  | F13  | F14  | F15  |      |           |      | F16  | F17  | F18  | F19  | F20  |      LOCK |
+ * |           |  F1  |  F2  |  F3  |  F4  |  F5  | Esc  |           |  -   |  F6  |  F7  |  F8  |  F9  |  F10 |           |
  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
- * | Media     |ShutDn|LClick| MsUp |RClick|Vol Up|ScrlUp|           |ScrlUp|PrtScr| Home |  Up  | PgUp | Mail |     Media |
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
- * | Symbol    | Sleep|MsLeft|MsDown|MsRght|Vol Dn|------|           |------|NumLok| Left | Down | Right|MyComp|    Symbol |
+ * |           |   !  |   @  |   {  |   }  |   &  |  <   |           |  >   |   |  |   7  |   8  |   9  |   /  |           |
  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
- * | LShift    |      |      |MsDown|      | Mute |ScrlDn|           |ScrlDn|      | End  | Down | PgDn |      |    RShift |
+ * |           |   #  |   $  |   (  |   )  |   `  |------|           |------|   /  |   4  |   5  |   6  |   *  |           |
+ * |-----------+------+------+------+------+------| Tab  |           | Shift|------+------+------+------+------+-----------|
+ * |           |   %  |   ^  |   [  |   ]  |   ~  |      |           |  -Tab|   \  |   1  |   2  |   3  |   -  |           |
  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
- *      | LCtrl| Meh  |Hyper | LAlt | LGui |                                       |Insert|Delete| Hyper| LAlt | LGui |
- *      `----------------------------------'                                       `----------------------------------'
+ *     | LCtrl | Meh  |Hyper | LAlt | LGui |                                       |RGui/0|RAlt/.|Hypr/=|Meh/+ |RCtrl/Ent|
+ *     `-----------------------------------'                                       `-------------------------------------'
  *                                         ,-------------.           ,-------------.
- *                                         | Stop |Refrsh|           | Prev | Next |
+ *                                         | Left | Right|           | Home | End  |
  *                                  ,------|------|------|           |------+------+------.
- *                                  |Brwser|Brwser|Search|           |VolUp |      |      |
- *                                  |Back  | Fwd  |------|           |------| Stop | Play-|
- *                                  |      |      | Home |           |VolDn |      | Pause|
+ *                                  |      |      |  Up  |           | PgUp |      |      |
+ *                                  |Space |Enter |------|           |------|BackSp| Del  |
+ *                                  |      |      | Down |           | PgDn |      |      |
  *                                  `--------------------'           `--------------------'
  */
-[MDIA_SH] = KEYMAP(
+[SYMB] = KEYMAP(
 // left hand
- KC_FN3        ,KC_F11      ,KC_F12  ,KC_F13  ,KC_F14  ,KC_F15  ,KC_NO
-,MO(MDIA_SH)   ,KC_POWER    ,KC_BTN1 ,KC_MS_U ,KC_BTN2 ,KC_VOLU ,KC_WH_U
-,MO(SYMB_SH)   ,KC_SLEP     ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_VOLD
-,KC_LSFT       ,KC_NO       ,KC_NO   ,KC_MS_D ,KC_NO   ,KC_MUTE ,KC_WH_D
-,KC_LCTL       ,MEH_T(KC_NO),ALL_T(KC_NO),KC_LALT,KC_LGUI
-                                                       ,KC_WSTP ,KC_WREF
-                                                                ,KC_WSCH
-                                              ,KC_WBAK ,KC_NO   ,KC_WHOM
+ KC_TRNS ,KC_F1   ,KC_F2   ,KC_F3   ,KC_F4   ,KC_F5   ,KC_ESC
+,KC_TRNS ,KC_EXLM ,KC_AT   ,KC_LCBR ,KC_RCBR ,KC_AMPR ,LSFT(KC_COMM)
+,KC_TRNS ,KC_HASH ,KC_DLR  ,KC_LPRN ,KC_RPRN ,KC_GRV 
+,KC_TRNS ,KC_PERC ,KC_CIRC ,KC_LBRC ,KC_RBRC ,KC_TILD ,KC_TAB
+,KC_LCTL   ,KC_MEH ,KC_HYPR,KC_LALT ,KC_LGUI
+                                             ,KC_LEFT ,KC_RGHT
+                                                      ,KC_UP
+                                    ,KC_SPC  ,KC_ENT  ,KC_DOWN
                                                                      // right hand
-                                                                     ,KC_NO    ,KC_F16  ,KC_F17 ,KC_F18  ,KC_F19  ,KC_F20  ,KC_FN3
-                                                                     ,KC_WH_U  ,KC_PSCR ,KC_HOME,KC_UP   ,KC_PGUP ,KC_MAIL ,MO(MDIA_SH)
-                                                                               ,KC_NLCK ,KC_LEFT,KC_DOWN ,KC_RIGHT,KC_MYCM ,MO(SYMB_SH)
-                                                                     ,KC_WH_D  ,KC_NO   ,KC_END ,KC_DOWN ,KC_PGDN ,KC_NO   ,KC_RSFT
-                                                                                        ,GUI_T(KC_INS),ALT_T(KC_DEL),ALL_T(KC_NO),MEH_T(KC_NO),KC_RCTL
-                                                                     ,KC_MPRV  ,KC_MNXT
-                                                                     ,KC_VOLU
-                                                                     ,KC_VOLD  ,KC_MSTP ,KC_MPLY
+                                                                     ,KC_MINS     ,KC_F6   ,KC_F7 ,KC_F8  ,KC_F9 ,KC_F10  ,KC_TRNS
+                                                                     ,LSFT(KC_DOT),KC_PIPE ,KC_7  ,KC_8   ,KC_9  ,KC_SLSH ,KC_TRNS
+                                                                                  ,KC_SLSH ,KC_4  ,KC_5   ,KC_6  ,KC_ASTR ,KC_TRNS
+                                                                     ,LSFT(KC_TAB),KC_BSLS ,KC_1  ,KC_2   ,KC_3  ,KC_MINS ,KC_TRNS
+                                                                                           ,GUI_T(KC_0),ALT_T(KC_DOT),ALL_T(KC_EQL),MEH_T(KC_PLUS),CTL_T(KC_ENT)
+                                                                     ,KC_HOME     ,KC_END
+                                                                     ,KC_PGUP
+                                                                     ,KC_PGDN     ,KC_BSPC ,KC_DEL
 ),
 
-/* Keymap 6: Media Lock Layer
+/******* Media Layer *******************************************************************************************************
  *
- * ,-----------------------------------------------------.           ,-----------------------------------------------------.
- * | LOCK      | F11  | F12  | F13  | F14  | F15  |      |           |      | F16  | F17  | F18  | F19  | F20  |      LOCK |
- * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
- * | Media     |ShutDn|LClick| MsUp |RClick|Vol Up|ScrlUp|           |ScrlUp|PrtScr| Home |  Up  | PgUp | Mail |     Media |
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
- * |           | Sleep|MsLeft|MsDown|MsRght|Vol Dn|------|           |------|NumLok| Left | Down | Right|MyComp|           |
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
- * | LShift    |      |      |MsDown|      | Mute |ScrlDn|           |ScrlDn|      | End  | Down | PgDn |      |    RShift |
- * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
- *      | LCtrl| Meh  |Hyper | LAlt | LGui |                                       |Insert|Delete| Hyper| LAlt | LGui |
- *      `----------------------------------'                                       `----------------------------------'
- *                                         ,-------------.           ,-------------.
- *                                         | Stop |Refrsh|           | Prev | Next |
- *                                  ,------|------|------|           |------+------+------.
- *                                  |Brwser|Brwser|Search|           |VolUp |      |      |
- *                                  |Back  | Fwd  |------|           |------| Stop | Play-|
- *                                  |      |      | Home |           |VolDn |      | Pause|
- *                                  `--------------------'           `--------------------'
+ * ,---------------------------------------------------------------.           ,---------------------------------------------------------------.
+ * |      |   F11   |   F12   |   F13   |   F14   |   F15   | Esc  |           |      |   F16   |   F17   |   F18   |   F19   |   F20   |      |
+ * |------+---------+---------+---------+---------+----------------|           |------+---------+---------+---------+---------+---------+------|
+ * |      |Shut Down|MouseUpLf|Mouse Up |MouseUpRg|Volume Up|Scroll|           |Scroll|PrintScrn|   Home  |    Up   |   PgUp  |   Mail  |      |
+ * |------+---------+---------+---------+---------+---------|  Up  |           |  Up  |---------+---------+---------+---------+---------+------|
+ * |      |  Sleep  |MouseLeft|MouseDown|MouseRght|Volume Dn|------|           |------| Num Lock|   Left  |   Down  |   Right | MyComp  |      |
+ * |------+---------+---------+---------+---------+---------|Scroll|           |Scroll|---------+---------+---------+---------+---------+------|
+ * |      |         |MouseDnLf|MouseDown|MouseDnRg|  Mute   | Down |           | Down |         |   End   |   Down  |   PgDn  |         |      |
+ * `------+---------+---------+---------+---------+----------------'           `----------------+---------+---------+---------+---------+------'
+ *  |LCtrl|   Meh   |  MClick | LClick  |  R Click|                                             |Cmd/Insrt|Optn/Del | Hyper   |  Meh    |RCtrl|
+ *  `---------------------------------------------'                                             `---------------------------------------------'
+ *                                                   ,-------------.           ,-------------.
+ *                                                   | Stop |Refrsh|           | Prev | Next |
+ *                                            ,------|------|------|           |------+------+------.
+ *                                            |Brwser|Brwser|Search|           |VolUp |      |      |
+ *                                            |Back  | Fwd  |------|           |------| Stop | Play-|
+ *                                            |      |      | Home |           |VolDn |      | Pause|
+ *                                            `--------------------'           `--------------------'
  */
-[MDIA_LK] = KEYMAP(
+[MDIA] = KEYMAP(
 // left hand
- MO(MDIA_UN),KC_F11      ,KC_F12  ,KC_F13  ,KC_F14  ,KC_F15  ,KC_NO
-,MO(UNLOCK) ,KC_POWER    ,KC_BTN1 ,KC_MS_U ,KC_BTN2 ,KC_VOLU ,KC_WH_U
-,KC_NO      ,KC_SLEP     ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_VOLD  
-,KC_LSFT    ,KC_NO       ,KC_NO   ,KC_MS_D ,KC_NO   ,KC_MUTE ,KC_WH_D
-,KC_LCTL    ,MEH_T(KC_NO),ALL_T(KC_NO),KC_LALT,KC_LGUI
-                                                    ,KC_WSTP ,KC_WREF
-                                                             ,KC_WSCH
-                                           ,KC_WBAK ,KC_NO   ,KC_WHOM
+ KC_TRNS ,KC_F11   ,KC_F12  ,KC_F13   ,KC_F14  ,KC_F15  ,KC_ESC
+,KC_TRNS ,KC_POWER ,M(MUL)  ,KC_MS_U  ,M(MUR)  ,KC_VOLU ,KC_WH_U
+,KC_TRNS ,KC_SLEP  ,KC_MS_L ,KC_MS_D  ,KC_MS_R ,KC_VOLD
+,KC_TRNS ,KC_NO    ,M(MDL)  ,KC_MS_D  ,M(MDR)  ,KC_MUTE ,KC_WH_D
+,KC_LCTL ,KC_MEH   ,KC_BTN3 ,KC_BTN1  ,KC_BTN2
+                                               ,KC_WSTP ,KC_WREF
+                                                        ,KC_WSCH
+                                      ,KC_WBAK ,KC_NO   ,KC_WHOM
                                                                      // right hand
-                                                                     ,KC_NO    ,KC_F16  ,KC_F17 ,KC_F18  ,KC_F19  ,KC_F20  ,MO(MDIA_UN)
-                                                                     ,KC_WH_U  ,KC_PSCR ,KC_HOME,KC_UP   ,KC_PGUP ,KC_MAIL ,MO(UNLOCK)
-                                                                               ,KC_NLCK ,KC_LEFT,KC_DOWN ,KC_RIGHT,KC_MYCM ,KC_NO
-                                                                     ,KC_WH_D  ,KC_NO   ,KC_END ,KC_DOWN ,KC_PGDN ,KC_NO   ,KC_RSFT
-                                                                                        ,GUI_T(KC_INS),ALT_T(KC_DEL),ALL_T(KC_NO),MEH_T(KC_NO),KC_RCTL
+                                                                     ,KC_NO    ,KC_F16  ,KC_F17       ,KC_F18       ,KC_F19  ,KC_F20  ,KC_TRNS
+                                                                     ,KC_WH_U  ,KC_PSCR ,KC_HOME      ,KC_UP        ,KC_PGUP ,KC_MAIL ,KC_TRNS
+                                                                               ,KC_NLCK ,KC_LEFT      ,KC_DOWN      ,KC_RIGHT,KC_MYCM ,KC_TRNS
+                                                                     ,KC_WH_D  ,KC_NO   ,KC_END       ,KC_DOWN      ,KC_PGDN ,KC_NO   ,KC_TRNS
+                                                                                        ,GUI_T(KC_INS),ALT_T(KC_DEL),KC_HYPR ,KC_MEH  ,KC_RCTL
                                                                      ,KC_MPRV  ,KC_MNXT
                                                                      ,KC_VOLU
                                                                      ,KC_VOLD  ,KC_MSTP ,KC_MPLY
-    ),
-
-/* Keymap 7: Media Unlock Layer
- *
- * ,-----------------------------------------------------.           ,-----------------------------------------------------.
- * |           | Esc  |      |      |      |      |      |           |      |      |      |      |      | Bspc |           |
- * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
- * |    UNLOCK |      |      |      |      |      |      |           |      |      |      |      |      |      |    UNLOCK |
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
- * |           |      |      |      |      |      |------|           |------|      |      |      |      |      |           |
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
- * | Caps LOCK |      |      |      |      |      |      |           |      |      |      |      |      |      | Caps LOCK |
- * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
- *      |      |      |      |      |      |                                       |      |      |      |      |      |
- *      `----------------------------------'                                       `----------------------------------'
- *                                         ,-------------.           ,-------------.
- *                                         |      |      |           |      |      |
- *                                  ,------|------|------|           |------+------+------.
- *                                  |      |      |      |           |      |      |      |
- *                                  |      |      |------|           |------|      |      |
- *                                  |      |      |      |           |      |      |      |
- *                                  `--------------------'           `--------------------'
- */
-[MDIA_UN] = KEYMAP(
-// left hand
- KC_TRNS ,KC_ESC  ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
-,KC_FN1  ,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_CAPS ,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_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_BSPC ,KC_TRNS
-                                                               ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN1
-                                                                        ,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_CAPS
-                                                                                 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
-
-                                                               ,KC_TRNS ,KC_TRNS
-                                                               ,KC_TRNS
-                                                               ,KC_TRNS ,KC_TRNS ,KC_TRNS
-    ),
+),
 
-/* Keymap 8: Unlock Layer
+/******* Special Layer *****************************************************************************************************
  *
  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
- * | UNLOCK    |      |      |      |      |      |      |           |      |      |      |      |      |      |    UNLOCK |
+ * |           |  Esc |      |      |      |      |      |           |      |      |      |      |      | Bspc |           |
  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
  * |           |      |      |      |      |      |------|           |------|      |      |      |      |      |           |
  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
- * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
+ * |           |      |      |      |      |      |      |           |      |      |      |      |      |      | RShift    |
  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
  *      |      |      |      |      |      |                                       |      |      |      |      |      |
  *      `----------------------------------'                                       `----------------------------------'
@@ -389,9 +184,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  *                                  |      |      |      |           |      |      |      |
  *                                  `--------------------'           `--------------------'
  */
-[UNLOCK] = KEYMAP(
+[SPEC] = KEYMAP(
 // left hand
- KC_FN1  ,KC_ESC  ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
+ KC_TRNS ,KC_ESC  ,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
@@ -399,39 +194,231 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
                                              ,KC_TRNS ,KC_TRNS
                                                       ,KC_TRNS
-                                    ,KC_TRNS ,KC_TRNS ,KC_TRNS
-
-                                                                // right hand
-                                                               ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_FN1
-                                                               ,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
+                                                                     ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_BSPC ,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_RSFT
+                                                                                       ,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_CLEAR(ON_PRESS)           // FN1 - clear to base layer
-    ,[2] = ACTION_LAYER_INVERT(SYMB_LK, ON_PRESS) // FN2 - toggle to Symbols on press
-    ,[3] = ACTION_LAYER_INVERT(MDIA_LK, ON_PRESS) // FN3 - toggle to Media on press
+     // the faux shift keys are implemented as macro taps
+     [LCaps] = ACTION_MACRO_TAP(LCaps)
+    ,[LSymb] = ACTION_MACRO_TAP(LSymb)
+    ,[LMdia] = ACTION_MACRO_TAP(LMdia)
+    ,[LSpec] = ACTION_MACRO_TAP(LSpec)
+    ,[RCaps] = ACTION_MACRO_TAP(RCaps)
+    ,[RSymb] = ACTION_MACRO_TAP(RSymb)
+    ,[RMdia] = ACTION_MACRO_TAP(RMdia)
+    ,[RSpec] = ACTION_MACRO_TAP(RSpec)
 };
 
+uint16_t caps_shift = 0;
+uint16_t symb_shift = 0;
+uint16_t mdia_shift = 0;
+
+bool symb_lock = false;
+bool mdia_lock = false;
+
 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:
+    switch(id) {
+        // There are two shift keys for each layer so we increment a layer_shift var when one
+        // is pressed and decrement when one is released. If both are pressed at the same time
+        // then the layer is locked (or unlocked). The shift counts are bound between 0 and 2
+        // only because sometimes rapid pressing led to irregular events; this way the states
+        // are self healing during use.
+
+        case LCaps: // both caps-shift keys trigger Left Shift
+        case RCaps: // so they don't interfere with the magic combo
+        if (record->event.pressed && !record->tap.count) {
+            if(++caps_shift > 2) caps_shift = 2;
+            if(caps_shift == 2)  {
+                register_code(KC_CAPS);
+                unregister_code(KC_CAPS);
+            } else if(caps_shift == 1) {
+                register_code(KC_LSFT);
+            }
+        } else {
+            if(--caps_shift < 0) caps_shift = 0;
+            if(caps_shift == 0) unregister_code(KC_LSFT);
+        }
+        break;
+
+        case LSymb:
+        if (record->event.pressed) {
+            if(++symb_shift > 2) symb_shift = 2;
+            if(symb_shift == 2)  {
+                symb_lock = !symb_lock;
+            } else if(symb_shift == 1) {
+                layer_on(SYMB);
+            }
+        } else {
+            if(--symb_shift < 0) symb_shift = 0;
+            if((symb_shift == 0) && (!symb_lock)) layer_off(SYMB);
+        }
+        break;
+
+        case LMdia:
+        if (record->event.pressed) {
+            if (record->tap.count && (!mdia_shift) && (!mdia_lock)) {
+                register_code(KC_TAB);
+            } else {
+                if(++mdia_shift > 2) mdia_shift = 2;
+                if(mdia_shift == 2)  {
+                    mdia_lock = !mdia_lock;
+                } else if(mdia_shift == 1) {
+                    layer_on(MDIA);
+                }
+            }
+        } else {
+            if(record->tap.count && (!mdia_shift) && (!mdia_lock)) {
+                unregister_code(KC_TAB);
+            } else {
+                if(--mdia_shift < 0) mdia_shift = 0;
+                if((!mdia_shift) && (!mdia_lock)) layer_off(MDIA);
+            }
+        }
+        break;
+
+        case LSpec:
+        if (record->event.pressed) {
+            if (record->tap.count && !record->tap.interrupted) {
+                register_code(KC_GRV);
+            } else {
+                layer_on(SPEC);
+            }
+        } else {
+            if(record->tap.count && !record->tap.interrupted) {
+                unregister_code(KC_GRV);
+            } else {
+                layer_off(SPEC);
+            }
+        }
+        break;
+
+        case RSymb:
+        if (record->event.pressed) {
+            if (record->tap.count && (!symb_shift) && (!symb_lock)) {
+                register_code(KC_QUOT);
+            } else {
+                if(++symb_shift > 2) symb_shift = 2;
+                if(symb_shift == 2)  {
+                    symb_lock = !symb_lock;
+                } else if(symb_shift == 1) {
+                    layer_on(SYMB);
+                }
+            }
+        } else {
+            if(record->tap.count && symb_shift == 0) {
+                unregister_code(KC_QUOT);
+            } else {
+                if(--symb_shift < 0) symb_shift = 0;
+                if((!symb_shift) && (!symb_lock)) layer_off(SYMB);
+            }
+        }
+        break;
+
+        case RMdia:
+        if (record->event.pressed) {
+            if (record->tap.count && (!mdia_shift) && (!mdia_lock)) {
+                register_code(KC_BSLS);
+            } else {
+                if(++mdia_shift > 2) mdia_shift = 2;
+                if(mdia_shift == 2)  {
+                    mdia_lock = !mdia_lock;
+                } else if(mdia_shift == 1) {
+                    layer_on(MDIA);
+                }
+            }
+        } else {
+            if(record->tap.count && (!mdia_shift) && (!mdia_lock)) {
+                unregister_code(KC_BSLS);
+            } else {
+                if(--mdia_shift < 0) mdia_shift = 0;
+                if((!mdia_shift) && (!mdia_lock)) layer_off(MDIA);
+            }
+        }
+        break;
+
+        case RSpec:
+        if (record->event.pressed) {
+            if (record->tap.count && !record->tap.interrupted) {
+                register_code(KC_EQL);
+            } else {
+                layer_on(SPEC);
+            }
+        } else {
+            if(record->tap.count && !record->tap.interrupted) {
+                unregister_code(KC_EQL);
+            } else {
+                layer_off(SPEC);
+            }
+        }
+        break;
+
+        // mouse diagonals
+
+        case MUL: // mouse up left
+        if (record->event.pressed) {
+            mousekey_on(KC_MS_UP);
+            mousekey_on(KC_MS_LEFT);
+            mousekey_send();
+        } else {
+            mousekey_off(KC_MS_UP);
+            mousekey_off(KC_MS_LEFT);
+            mousekey_send();
+        }
+        break;
+
+        case MUR: // mouse up right
+        if (record->event.pressed) {
+            mousekey_on(KC_MS_UP);
+            mousekey_on(KC_MS_RIGHT);
+            mousekey_send();
+        } else {
+            mousekey_off(KC_MS_UP);
+            mousekey_off(KC_MS_RIGHT);
+            mousekey_send();
+        }
+        break;
+
+        case MDL: // mouse down left
         if (record->event.pressed) {
-          register_code(KC_RSFT);
+            mousekey_on(KC_MS_DOWN);
+            mousekey_on(KC_MS_LEFT);
+            mousekey_send();
         } else {
-          unregister_code(KC_RSFT);
+            mousekey_off(KC_MS_DOWN);
+            mousekey_off(KC_MS_LEFT);
+            mousekey_send();
         }
         break;
-      }
+
+        case MDR: // mouse down right
+        if (record->event.pressed) {
+            mousekey_on(KC_MS_DOWN);
+            mousekey_on(KC_MS_RIGHT);
+            mousekey_send();
+        } else {
+            mousekey_off(KC_MS_DOWN);
+            mousekey_off(KC_MS_RIGHT);
+            mousekey_send();
+        }
+        break;
+
+        default:
+            // none
+            break;
+    }
+    
     return MACRO_NONE;
 };
 
@@ -442,31 +429,22 @@ void matrix_init_user(void) {
 
 // Runs constantly in the background, in a loop.
 void matrix_scan_user(void) {
-    uint8_t layer = biton32(layer_state);
-
     // shift or caps lock turns on red light
-    if((keyboard_report->mods & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT))) || (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) {
+    if(caps_shift || (keyboard_report->mods & MOD_BIT(KC_RSFT)) || (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) {
         ergodox_right_led_1_on();
     } else {
         ergodox_right_led_1_off();
     }
 
-    // do not change lights while locking and unlocking
-    if(layer == LOCK || layer == SYMB_UN || layer == MDIA_UN || layer == UNLOCK) {
-        return;
-    }
-
-    //ergodox_board_led_off();
-
-    // symbol turns on green light
-    if(layer == SYMB_SH || layer == SYMB_LK) {
+    // Symbol layer turns on green light
+    if(layer_state & (1UL<<SYMB)) {
         ergodox_right_led_2_on();
     } else {
         ergodox_right_led_2_off();
     }
 
-    // media turns on blue light
-    if(layer == MDIA_SH || layer == MDIA_LK) {
+    // Media layer turns on blue light
+    if(layer_state & (1UL<<MDIA)) {
         ergodox_right_led_3_on();
     } else {
         ergodox_right_led_3_off();
index 69af8df4e1db1a1b6ebc95ca8c15367500c60557..9c561a10aa2b67b19f682c6c9cdfc9eb0be566f6 100644 (file)
Binary files a/keyboard/ergodox_ez/keymaps/ordinary/ordinary-base.png and b/keyboard/ergodox_ez/keymaps/ordinary/ordinary-base.png differ
index 04792f2dfc535607e039db85dc24c933de995ff4..25731ea2e6b449b6bddb0025ba5854700735c927 100644 (file)
@@ -1,7 +1,7 @@
 [{x:3.5},"#\n3",{x:10.5},"*\n8"],
 [{y:-0.875,x:2.5},"@\n2",{x:1},"$\n4",{x:8.5},"&\n7",{x:1},"(\n9"],
 [{y:-0.875,x:5.5},"%\n5",{c:"#ff4444"},"Esc",{x:4.5,c:"#cccccc"},"_\n\n\n\n\n\n-","^\n6"],
-[{y:-0.875,c:"#2277ff",w:1.5},"Shift\n\n~\n\n\n\nLock\n`",{c:"#cccccc"},"!\n1",{x:14.5},")\n0",{c:"#2277ff",w:1.5},"+\n\nShift\n\n\n\n=\nLock"],
+[{y:-0.875,c:"#2277ff",w:1.5},"Special\n\n~\n\n\n\nShift\n`",{c:"#cccccc"},"!\n1",{x:14.5},")\n0",{c:"#2277ff",w:1.5},"+\n\nSpecial\n\n\n\n=\nShift"],
 [{y:-0.375,x:3.5,c:"#cccccc"},"E",{x:10.5},"I"],
 [{y:-0.875,x:2.5},"W",{x:1},"R",{x:8.5},"U",{x:1},"O"],
 [{y:-0.875,x:5.5},"T",{h:1.5},"{\n\n\n\n\n\n[",{x:4.5,h:1.5},"}\n\n\n\n\n\n]","Y"],
@@ -14,7 +14,7 @@
 [{y:-0.75,x:3.5,c:"#cccccc"},"C",{x:10.5},"<\n,"],
 [{y:-0.875,x:2.5},"X",{x:1},"V",{x:8.5},"M",{x:1},">\n."],
 [{y:-0.875,x:5.5},"B",{x:6.5},"N"],
-[{y:-0.875,c:"#2277ff",fa:[0,1,0,1,0,0,0],w:1.5},"Capitals\nShift\n\n\n\n\nShift",{c:"#cccccc"},"Z",{x:14.5,f:3},"?\n/",{c:"#2277ff",w:1.5},"\n\nCapitals\nShift\n\n\n\nShift"],
+[{y:-0.875,c:"#2277ff",w:1.5},"Capitals\n\n\n\n\n\nShift",{c:"#cccccc"},"Z",{x:14.5},"?\n/",{c:"#2277ff",w:1.5},"\n\nCapitals\n\n\n\n\nShift"],
 [{y:-0.375,x:3.5,c:"#77aaff"},"Option\n\n\nLAlt",{x:10.5},"Option\n\n\nRAlt"],
 [{y:-0.875,x:2.5},"Hyper",{x:1},"Cmd\n\n\nSuper",{x:8.5},"Cmd\n\n\nSuper",{x:1},"Hyper"],
 [{y:-0.75,x:0.5},"Ctrl\n\n\nLCtrl","Meh",{x:14.5},"Meh","Ctrl\n\n\nRCtrl"],
index 0ae162431d3a2d9706fac1f73fb87400a10ad58f..99e5ed80b14d45f145f8e7e6cca897c65241140c 100644 (file)
Binary files a/keyboard/ergodox_ez/keymaps/ordinary/ordinary-media.png and b/keyboard/ergodox_ez/keymaps/ordinary/ordinary-media.png differ
index cc4c877ebdc8da43c2c661b06c8b3ea7fc1b0eb6..4eccc9f350eeeafa89edef214429a64daf10683a 100644 (file)
@@ -1,22 +1,22 @@
 [{x:3.5,c:"#99de2a"},"F13",{x:10.5},"F18"],
 [{y:-0.875,x:2.5},"F12",{x:1},"F14",{x:8.5},"F17",{x:1},"F19"],
-[{y:-0.875,x:5.5},"F15",{c:"#ff4444"},"Esc",{x:4.5,c:"#cccccc",a:7},"",{c:"#99de2a",a:4},"F16"],
-[{y:-0.875,c:"#2277ff",w:1.5},"Shift\n\n\n\n\n\nLock",{c:"#99de2a"},"F11",{x:14.5},"F20",{c:"#2277ff",w:1.5},"\n\nShift\n\n\n\n\nLock"],
+[{y:-0.875,x:5.5},"F15",{c:"#ff4444"},"Esc",{x:4.5,c:"#737373",a:7},"",{c:"#99de2a",a:4},"F16"],
+[{y:-0.875,c:"#2277ff",w:1.5},"Special\n\n\n\n\n\nShift",{c:"#99de2a"},"F11",{x:14.5},"F20",{c:"#2277ff",w:1.5},"\n\nSpecial\n\n\n\n\nShift"],
 [{y:-0.375,x:3.5,c:"#ff8500"},"Mouse\n\n\n\n\n\nUp",{x:10.5},"Cursor\n\n\n\n\n\nUp"],
-[{y:-0.875,x:2.5},"Left\n\n\n\n\n\nClick",{x:1},"Right\n\n\n\n\n\nClick",{x:8.5,c:"#ffb063"},"Home",{x:1},"Page\n\n\n\n\n\nUp"],
+[{y:-0.875,x:2.5},"Mouse\n\n\n\n\n\nUpLeft",{x:1},"Mouse\n\n\n\n\n\nUpRgt",{x:8.5,c:"#ffb063"},"Home",{x:1},"Page\n\n\n\n\n\nUp"],
 [{y:-0.875,x:5.5,c:"#e6e067"},"Vol\n\n\n\n\n\nUp",{c:"#ffb063",h:1.5},"Scroll\n\n\n\n\n\nUp",{x:4.5,h:1.5},"Scroll\n\n\n\n\n\nUp",{c:"#e6e067"},"Print\n\n\n\n\n\nScreen"],
 [{y:-0.875,c:"#000000",t:"#ff0000",w:1.5},"Media\n\n\n\n\n\nShift",{c:"#e6e067",t:"#000000"},"Shut\n\n\n\n\n\nDown",{x:14.5},"Mail",{c:"#000000",t:"#ff0000",w:1.5},"\n\nMedia\n\n\n\n\nShift"],
 [{y:-0.375,x:3.5,c:"#ff8500",t:"#000000"},"Mouse\n\n\n\n\n\nDown",{x:10.5},"Cursor\n\n\n\n\n\nDown"],
 [{y:-0.875,x:2.5},"Mouse\n\n\n\n\n\nLeft",{x:1},"Mouse\n\n\n\n\n\nRight",{x:8.5},"Cursor\n\n\n\n\n\nLeft",{x:1},"Cursor\n\n\n\n\n\nRight"],
 [{y:-0.875,x:5.5,c:"#e6e067"},"Vol\n\n\n\n\n\nDown",{x:6.5},"Num\n\n\n\n\n\nLock"],
-[{y:-0.875,c:"#cccccc",a:7,w:1.5},"",{c:"#e6e067",a:4},"Sleep",{x:14.5},"My\n\n\n\n\n\nComp",{c:"#cccccc",a:7,w:1.5},""],
-[{y:-0.625,x:6.5,c:"#ffb063",a:4,h:1.5},"Scroll\n\n\n\n\n\nDown",{x:4.5,h:1.5},"Scroll\n\n\n\n\n\nDown"],
+[{y:-0.875,c:"#2277ff",w:1.5},"Symbols\n\n\n\n\n\nShift",{c:"#e6e067"},"Sleep",{x:14.5},"My\n\n\n\n\n\nComp",{c:"#2277ff",w:1.5},"\n\nSymbols\n\n\n\n\nShift"],
+[{y:-0.625,x:6.5,c:"#ffb063",h:1.5},"Scroll\n\n\n\n\n\nDown",{x:4.5,h:1.5},"Scroll\n\n\n\n\n\nDown"],
 [{y:-0.75,x:3.5,c:"#ff8500"},"Mouse\n\n\n\n\n\nDown",{x:10.5},"Cursor\n\n\n\n\n\nDown"],
-[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1},"",{x:8.5,c:"#ffb063",a:4},"End",{x:1},"Page\n\n\n\n\n\nDown"],
-[{y:-0.875,x:5.5,c:"#e6e067"},"Mute",{x:6.5,c:"#cccccc",a:7},""],
-[{y:-0.875,c:"#2277ff",a:4,f2:1,w:1.5},"Capitals\nShift\n\n\n\n\nShift",{c:"#cccccc",a:7},"",{x:14.5},"",{c:"#2277ff",a:4,fa:[0,1,0,1],w:1.5},"\n\nCapitals\nShift\n\n\n\nShift"],
-[{y:-0.375,x:3.5,c:"#77aaff"},"Option\n\n\nLAlt",{x:10.5,c:"#ffb063"},"Delete\n\n\nOption"],
-[{y:-0.875,x:2.5,c:"#77aaff"},"Hyper",{x:1},"Cmd\n\n\nSuper",{x:8.5,c:"#ffb063"},"Insert\n\n\nCmd",{x:1,c:"#77aaff"},"Hyper"],
+[{y:-0.875,x:2.5},"Mouse\n\n\n\n\n\nDnLeft",{x:1},"Mouse\n\n\n\n\n\nDnRgt",{x:8.5,c:"#ffb063"},"End",{x:1},"Page\n\n\n\n\n\nDown"],
+[{y:-0.875,x:5.5,c:"#e6e067"},"Mute",{x:6.5,c:"#737373",a:7},""],
+[{y:-0.875,c:"#2277ff",a:4,w:1.5},"Capitals\n\n\n\n\n\nShift",{c:"#737373",a:7},"",{x:14.5},"",{c:"#2277ff",a:4,w:1.5},"\n\nCapitals\n\n\n\n\nShift"],
+[{y:-0.375,x:3.5,c:"#ff8500"},"Middle\n\n\n\n\n\nClick",{x:10.5,c:"#ffb063",fa:[0,0,0,1]},"Delete\n\n\nOption"],
+[{y:-0.875,x:2.5,c:"#ff8500"},"Left\n\n\n\n\n\nClick",{x:1},"Right\n\n\n\n\n\nClick",{x:8.5,c:"#ffb063"},"Insert\n\n\nCmd",{x:1,c:"#77aaff"},"Hyper"],
 [{y:-0.75,x:0.5},"Ctrl\n\n\nLCtrl","Meh",{x:14.5},"Meh","Crtl\n\n\nRCtrl"],
 [{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#ccbb00"},"Stop\n\n\nBrowser","Reload\n\n\nBrowser"],
 [{h:2},"< Web\n\n\nBrowser",{h:2},"Web >\n\n\nBrowser","Search\n\n\nBrowser"],
diff --git a/keyboard/ergodox_ez/keymaps/ordinary/ordinary-special.png b/keyboard/ergodox_ez/keymaps/ordinary/ordinary-special.png
new file mode 100644 (file)
index 0000000..6eecf44
Binary files /dev/null and b/keyboard/ergodox_ez/keymaps/ordinary/ordinary-special.png differ
diff --git a/keyboard/ergodox_ez/keymaps/ordinary/ordinary-special.txt b/keyboard/ergodox_ez/keymaps/ordinary/ordinary-special.txt
new file mode 100644 (file)
index 0000000..a08827c
--- /dev/null
@@ -0,0 +1,27 @@
+[{x:3.5,a:7},"",{x:10.5},""],
+[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
+[{y:-0.875,x:5.5},"",{c:"#ff4444",a:4},"Esc",{x:4.5,c:"#cccccc",a:7},"",""],
+[{y:-0.875,c:"#000000",t:"#ff0000",a:4,w:1.5},"Special\n\n\n\n\n\nShift",{c:"#ff4444",t:"#000000"},"Esc",{x:14.5,c:"#54d6de"},"Back\n\n\n\n\n\nspace",{c:"#000000",t:"#ff0000",w:1.5},"\n\nSpecial\n\n\n\n\nShift"],
+[{y:-0.375,x:3.5,c:"#cccccc",t:"#000000",a:7},"",{x:10.5},""],
+[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
+[{y:-0.875,x:5.5},"",{h:1.5},"",{x:4.5,h:1.5},"",""],
+[{y:-0.875,w:1.5},"","",{x:14.5},"",{w:1.5},""],
+[{y:-0.375,x:3.5},"",{x:10.5},""],
+[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
+[{y:-0.875,x:5.5},"",{x:6.5},""],
+[{y:-0.875,w:1.5},"","",{x:14.5},"",{w:1.5},""],
+[{y:-0.625,x:6.5,h:1.5},"",{x:4.5,h:1.5},""],
+[{y:-0.75,x:3.5},"",{x:10.5},""],
+[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
+[{y:-0.875,x:5.5},"",{x:6.5},""],
+[{y:-0.875,w:1.5},"","",{x:14.5},"",{c:"#2277ff",w:1.5},"RShift"],
+[{y:-0.375,x:3.5,c:"#cccccc"},"",{x:10.5},""],
+[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
+[{y:-0.75,x:0.5},"","",{x:14.5},"",""],
+[{r:30,rx:6.5,ry:4.25,y:-1,x:1},"",""],
+[{h:2},"",{h:2},"",""],
+[{x:2},""],
+[{r:-30,rx:13,y:-1,x:-3},"",""],
+[{x:-3},"",{h:2},"",{h:2},""],
+[{x:-3},""]
+
index b3101e5c0496fa090535e2bd4519311bf3398d21..e4de64a96f1a4445bedfd0dd9a0330fc08580cd6 100644 (file)
Binary files a/keyboard/ergodox_ez/keymaps/ordinary/ordinary-symbol.png and b/keyboard/ergodox_ez/keymaps/ordinary/ordinary-symbol.png differ
index 35efdba7d6a83c246bf0a90d5cbe7f40f8e58b8d..e199f5c59f4486d0d7e148d5fa9444bd73cb3c79 100644 (file)
@@ -1,7 +1,7 @@
 [{x:3.5,c:"#99de2a"},"F3",{x:10.5},"F8"],
 [{y:-0.875,x:2.5},"F2",{x:1},"F4",{x:8.5},"F7",{x:1},"F9"],
 [{y:-0.875,x:5.5},"F5",{c:"#ff4444"},"Esc",{x:4.5,c:"#bbddbb"},"_\n\n\n\n\n\n-",{c:"#99de2a"},"F6"],
-[{y:-0.875,c:"#2277ff",w:1.5},"Shift\n\n\n\n\n\nLock",{c:"#99de2a"},"F1",{x:14.5},"F10",{c:"#2277ff",w:1.5},"\n\nShift\n\n\n\n\nLock"],
+[{y:-0.875,c:"#2277ff",w:1.5},"Special\n\n\n\n\n\nShift",{c:"#99de2a"},"F1",{x:14.5},"F10",{c:"#2277ff",w:1.5},"\n\nSpecial\n\n\n\n\nShift"],
 [{y:-0.375,x:3.5,c:"#bbddbb"},"{",{x:10.5,c:"#89b087"},"8"],
 [{y:-0.875,x:2.5,c:"#bbddbb"},"@",{x:1},"}",{x:8.5,c:"#89b087"},"7",{x:1},"9"],
 [{y:-0.875,x:5.5,c:"#bbddbb"},"&",{h:1.5},"<",{x:4.5,h:1.5},">","|"],
@@ -14,7 +14,7 @@
 [{y:-0.75,x:3.5,c:"#bbddbb"},"[",{x:10.5,c:"#89b087"},"2"],
 [{y:-0.875,x:2.5,c:"#bbddbb"},"^",{x:1},"]",{x:8.5,c:"#89b087"},"1",{x:1},"3"],
 [{y:-0.875,x:5.5,c:"#bbddbb"},"~",{x:6.5},"\\"],
-[{y:-0.875,c:"#2277ff",fa:[0,1,0,1,0,0,1],w:1.5},"Capitals\nShift\n\n\n\n\nShift",{c:"#bbddbb"},"%",{x:14.5,c:"#89b087"},"-",{c:"#2277ff",w:1.5},"\n\nCapitals\nShift\n\n\n\nShift"],
+[{y:-0.875,c:"#2277ff",w:1.5},"Capitals\n\n\n\n\n\nShift",{c:"#bbddbb"},"%",{x:14.5,c:"#89b087"},"-",{c:"#2277ff",w:1.5},"\n\nCapitals\n\n\n\n\nShift"],
 [{y:-0.375,x:3.5,c:"#77aaff"},"Option\n\n\nLAlt",{x:10.5,c:"#89b087"},".\n\n\nOption"],
 [{y:-0.875,x:2.5,c:"#77aaff"},"Hyper",{x:1},"Cmd\n\n\nSuper",{x:8.5,c:"#89b087"},"0\n\n\nCmd",{x:1},"=\n\n\nHyper"],
 [{y:-0.75,x:0.5,c:"#77aaff"},"Ctrl\n\n\nLCtrl","Meh",{x:14.5,c:"#89b087"},"+\n\n\nMeh","Enter\n\n\nCtrl"],
@@ -22,6 +22,6 @@
 [{h:2},"Space",{h:2},"Enter","Up"],
 [{x:2},"Down"],
 [{r:-30,rx:13,y:-1,x:-3},"Home","End"],
-[{x:-3,f:3},"Page\n\n\n\n\n\nUp",{h:2},"< Del\n\n\nBackspace",{h:2},"Del >\n\n\nDelete"],
-[{x:-3,f:3},"Page\n\n\n\n\n\nDown"]
+[{x:-3},"Page\n\n\n\n\n\nUp",{h:2},"< Del\n\n\nBackspace",{h:2},"Del >\n\n\nDelete"],
+[{x:-3},"Page\n\n\n\n\n\nDown"]
 
index 8e2d5ce26d49e38420ef462fc2058f8b378e777f..1e740e4f39f3d23d4fb783c54992dbf77b23cb42 100644 (file)
-:100000000C945F040C94A3040C94A3040C94A30418\r
-:100010000C94A3040C94A3040C94A3040C94A304C4\r
-:100020000C94A3040C94A3040C94C40D0C94960E8D\r
-:100030000C94A3040C94A3040C94A3040C94A304A4\r
-:100040000C94A3040C9441230C94A3040C94A304D7\r
-:100050000C94A3040C94E31C0C94A3040C94A3042C\r
-:100060000C94A3040C94A3040C94A3040C94A30474\r
-:100070000C94A3040C94A3040C94A3040C94A30464\r
-:100080000C94A3040C94A3040C94A3040C94A30454\r
-:100090000C94A3040C94A3040C94A3040C94A30444\r
-:1000A0000C94A3040C94A3040C94A304FB0E1D0F46\r
-:1000B00008101D0F08105F0F820F0810D70FEA0FEE\r
-:1000C000DE12DE120C130C134E138A138A158A15D6\r
-:1000D000A2138A159914991464158A158A1578152E\r
-:1000E000000000810889248935812B850252E100B6\r
-:1000F000E00000001E00140004001D0000774E0008\r
-:100100001F001A0016001B00007F4C002000080092\r
-:1001100007000600E2002A0021001500090019006E\r
-:10012000E3004B00220017000A00050000004A000F\r
-:1001300029002F0000002B0200004D002D00300090\r
-:1001400000002B000000500023001C000B001100D9\r
-:1001500000004F00240018000D001000E7005200BE\r
-:1001600025000C000E003600E6002C0026001200D0\r
-:100170000F003700007F28002700130033003800ED\r
-:10018000007751002E8131853482E500E4000000C3\r
-:100190000100C300C2003900010000002900010075\r
-:1001A0000100010001000100010001000100010047\r
-:1001B0000100010001000100010001000100010037\r
-:1001C0000100010001000100010001000100010027\r
-:1001D0000100010000000100010001000000010019\r
-:1001E000000001000100010000000100000001000A\r
-:1001F00001000100010001000000010001000100F8\r
-:1002000001000100010001000100010001000100E6\r
-:1002100001000100010001000100010001000100D6\r
-:100220002A00010001000100010001000100C300DB\r
-:10023000C200390001000000C20005520252E10074\r
-:10024000010000003A001E022002220201005100BB\r
-:100250003B001F0221022302010028003C002F0264\r
-:1002600026022F0001002C003D0030022702300042\r
-:10027000010052003E00240235003502000050000B\r
-:100280000100360200002B0000004F002D00370255\r
-:1002900000002B0200004A003F003102380031000C\r
-:1002A00000004D004000240021001E0027784B0074\r
-:1002B0004100250022001F0037744C004200260038\r
-:1002C000230020002E7F2A004300380025022D0045\r
-:1002D0002E774E00C20005520252E5002871000040\r
-:1002E000045205520852E100010000003A001E02CB\r
-:1002F00020022202010051003B001F0221022302C2\r
-:10030000010028003C002F0226022F0001002C00D3\r
-:100310003D00300227023000010052003E0024025E\r
-:1003200035003502000050000100360200002B00AD\r
-:1003300000004F002D00370200002B0200004A0091\r
-:100340003F0031023800310000004D004000240021\r
-:1003500021001E0027784B004100250022001F00CD\r
-:1003600037744C0042002600230020002E7F2A0014\r
-:100370004300380025022D002E774E00045205520E\r
-:100380000852E5002871000001000654C100390040\r
-:10039000010000002900010001000100010001002E\r
-:1003A0000100010001000100010001000100010045\r
-:1003B0000100010001000100010001000100010035\r
-:1003C0000100010001000100010001000000010026\r
-:1003D0000100010000000100000001000100010017\r
-:1003E0000000010000000100010001000100010007\r
-:1003F00000000100010001000100010001000100F6\r
-:1004000001000100010001000100010001000100E4\r
-:1004100001000100010001002A00010001000100AB\r
-:100420000100010001000654C10039000100000074\r
-:10043000C30005520252E100E000000044006600E3\r
-:10044000A60000000077B5004500F400F2000000AF\r
-:10045000007F00006800F000F100F100E200B6004B\r
-:100460006900F500F3000000E300B4006A00A90091\r
-:10047000AA00A8000000B8000000F9000000FA007F\r
-:100480000000B9000000F9000000FA000000AC0014\r
-:100490006B004600530000000000AB006C004A00F7\r
-:1004A00050004D004978A9006D00520051005100E4\r
-:1004B0004C74AE006E004B004F004E00007FAD004C\r
-:1004C0006F00B100B30000000077AA00C30005521E\r
-:1004D0000252E500E4000000075208520000E1006B\r
-:1004E000E000000044006600A60000000077B500B0\r
-:1004F0004500F400F2000000007F00006800F000FA\r
-:10050000F100F100E200B6006900F500F300000020\r
-:10051000E300B4006A00A900AA00A8000000B80027\r
-:100520000000F9000000FA000000B9000000F90026\r
-:100530000000FA000000AC006B0046005300000011\r
-:100540000000AB006C004A0050004D004978A90043\r
-:100550006D005200510051004C74AE006E004B0013\r
-:100560004F004E00007FAD006F00B100B3000000EF\r
-:100570000077AA00075208520000E500E4000000DE\r
-:100580000100C10001003900010000002900010044\r
-:100590000100010001000100010001000100010053\r
-:1005A0000100010001000100010001000100010043\r
-:1005B0000100010001000100010001000100010033\r
-:1005C0000100010000000100010001000000010025\r
-:1005D0000000010001000100000001000000010016\r
-:1005E0000100010001000100000001000100010004\r
-:1005F00001000100010001000100010001000100F3\r
-:1006000001000100010001000100010001000100E2\r
-:100610002A00010001000100010001000100C100E9\r
-:100620000100390001000000C100010001000100CB\r
-:10063000010000002900010001000100010001008B\r
-:1006400001000100010001000100010001000100A2\r
-:100650000100010001000100010001000100010092\r
-:100660000100010001000100010001000000010083\r
-:100670000100010000000100000001000100010074\r
-:100680000000010000000100010001000100010064\r
-:100690000000010001000100010001000100010053\r
-:1006A0000100010001000100010001000100010042\r
-:1006B0000100010001000100010001000100010032\r
-:1006C00001000100C1000100010001000100000063\r
-:1006D00016034500720067006F0044006F00780049\r
-:1006E000200045005A000000160345007200670014\r
-:1006F0006F0044006F007800200045005A000000A1\r
-:100700000403090409026D00040100A0FA090400B1\r
-:10071000000103010100092111010001223F00072E\r
-:1007200005810308000A0904010001030102000910\r
-:100730002111010001224D000705820308000A096A\r
-:10074000040200010300000009211101000122360A\r
-:10075000000705830308000A0904030001030000E1\r
-:10076000000921110100012239000705840310004E\r
-:10077000011201100100000008EDFE071301000145\r
-:1007800002000105010906A101050719E029E71585\r
-:1007900000250195087501810205081901290595B3\r
-:1007A000057501910295017503910105071900294D\r
-:1007B0007715002501957875018102C00501098032\r
-:1007C000A101850216010026B7001A01002AB70010\r
-:1007D000751095018100C0050C0901A10185031662\r
-:1007E0000100269C021A01002A9C027510950181C5\r
-:1007F00000C005010902A1010901A10005091901B3\r
-:1008000029051500250195057501810295017503DE\r
-:1008100081010501093009311581257F950275088F\r
-:10082000810609381581257F950175088106050C1B\r
-:100830000A38021581257F950175088106C0C0051B\r
-:10084000010906A101050719E029E7150025019511\r
-:1008500008750181029501750881010508190129B2\r
-:10086000059505750191029501750391010507191B\r
-:100870000029FF150025FF950675088100C00000BE\r
-:10088000000000000000000000010204060A0F172B\r
-:10089000202C3A4A5D71879DB3C7DAE9F5FCFFFC6D\r
-:1008A000F5E9DAC7B39D87715D4A3A2C20170F0A24\r
-:1008B00006040201000000000000000000001124F6\r
-:1008C0001FBECFEFDAE0DEBFCDBF04B603FE24C00B\r
-:1008D0008091EF019091F001A091F101B091F201AE\r
-:1008E0008730904BA740B04BB9F41092EF011092B3\r
-:1008F000F0011092F1011092F20114BE84B7877FCB\r
-:1009000084BF88E10FB6F894809360001092600075\r
-:100910000FBEE0E0FFE3099511E0A0E0B1E0E6E002\r
-:10092000FAE402C005900D92A433B107D9F721E093\r
-:10093000A4E3B1E001C01D92AF3EB207E1F70E940F\r
-:100940000A0B0C9401250C94000061110BC0FC01F2\r
-:100950008281882321F085EE0E946B1103C085EE11\r
-:100960000E94331280E090E008950895CF93609143\r
-:10097000B1017091B2018091B3019091B4010E94D4\r
-:100980000F1CC82FE0910E01F0910F01808182723F\r
-:1009900019F0259A2D9A06C00E94431081FDF9CFC7\r
-:1009A00025982D98C130B9F0C430A9F089EF8C0F8B\r
-:1009B000823088F08EEF8C0F823018F4269A2E9AAF\r
-:1009C00002C026982E98C550C23018F4279A2F9A44\r
-:1009D00002C027982F98CF9108950C94B60456988A\r
-:1009E0005E9825982D9826982E9827982F988FEF07\r
-:1009F00090E0909389008093880090938B0080937F\r
-:100A00008A0090938D0080938C00259A2D9A2FEF69\r
-:100A100080E792E0215080409040E1F700C0000064\r
-:100A2000269A2E9A2FEF80E792E021508040904046\r
-:100A3000E1F700C00000279A2F9A2FEF80E792E09D\r
-:100A4000215080409040E1F700C0000025982D988B\r
-:100A50002FEF80E792E0215080409040E1F700C006\r
-:100A6000000026982E982FEF80E792E021508040DA\r
-:100A70009040E1F700C0000027982F9856985E98A4\r
-:100A800025982D9826982E9827982F98089589EACA\r
-:100A90008093800089E08093810024982C983F986F\r
-:100AA0008AB18F748AB96E98479A8BB1806B8BB973\r
-:100AB000769A0E94EF040C94B50480E280930001C2\r
-:100AC0008091340181110EC00E94AC0581E08093B9\r
-:100AD00034012FEF83ED90E3215080409040E1F707\r
-:100AE00000C0000080E40E94B205809300018111E3\r
-:100AF0002EC00E94DC0580930001811128C00E9455\r
-:100B0000DC0580930001811122C08FE30E94DC0587\r
-:100B10008093000181111BC00E94D40580E40E94D3\r
-:100B2000B20580930001811112C08CE00E94DC05A7\r
-:100B30008093000181110BC00E94DC0580930001AD\r
-:100B4000811105C08FE30E94DC05809300010E94A3\r
-:100B5000D4058091000108951092B9008AE0809335\r
-:100B6000B800089594EA9093BC009091BC0097FF60\r
-:100B7000FCCF9091B900987F983021F0903111F01E\r
-:100B800081E008958093BB0084E88093BC0080914D\r
-:100B9000BC0087FFFCCF8091B900887F883111F0BD\r
-:100BA000803471F780E0089584E98093BC008091DF\r
-:100BB000BC0084FDFCCF08958093BB0084E8809343\r
-:100BC000BC008091BC0087FFFCCF9091B900987F5A\r
-:100BD00081E0983209F480E0089584E88093BC00B5\r
-:100BE0008091BC0087FFFCCF8091BB00089580916D\r
-:100BF0000001811115C080E40E94B20580930001BC\r
-:100C000081110CC082E10E94DC05809300018111FA\r
-:100C100005C08FEF0E94DC05809300010E94D4057F\r
-:100C200084B1807F84B985B1807F85B98AB1837FA3\r
-:100C30008AB98BB1837F8BB93E98469808950E94FC\r
-:100C40005D05809300010E94F70580B38C7080BB26\r
-:100C500081B3836F81BBE4E4F1E0A6E3B1E01192DC\r
-:100C60001D9281E0E235F807D1F70C944705BF9259\r
-:100C7000CF92DF92EF92FF920F931F93CF93DF9368\r
-:100C800080910001882379F0809135018F5F8093F6\r
-:100C90003501811108C00E945D058093000181111A\r
-:100CA00002C00E94EF0406E311E0C0E0D0E0DD24C2\r
-:100CB000D39482E0C82EEE24E394F12CC73000F5E3\r
-:100CC00080910001811162C080E40E94B20580938E\r
-:100CD0000001811112C082E10E94DC0580930001B5\r
-:100CE00081110BC0C7010C2E01C0880F0A94EAF7CE\r
-:100CF00080950E94DC05809300010E94D40546C0C7\r
-:100D0000CA30A1F028F4C83059F0C93061F005C0EC\r
-:100D1000CC3089F070F0CD3089F0209A289810C03E\r
-:100D2000219A29980DC0229A2A980AC0239A2B98B2\r
-:100D300007C0529A01C0539A5B9802C03E9A4698E7\r
-:100D4000E0EAEA95F1F78FB179995AC092E08170A3\r
-:100D50008D25892B7C9B02C090E001C094E0892BFB\r
-:100D60007D9B02C090E001C098E0892B7E9B02C071\r
-:100D700090E001C090E1892B9FB19095991F992730\r
-:100D8000991F9295990F907E892B0FC08091000139\r
-:100D900081114BC080E40E94B2058093000188233A\r
-:100DA00089F1B12C0E94D4058B2DF8019081981700\r
-:100DB00019F08083C09201010E94F70521960F5F10\r
-:100DC0001F4FCE30D10509F079CF809101018823E2\r
-:100DD00071F1815080930101882339F08FE99FE000\r
-:100DE0000197F1F700C0000022C0A4E4B1E0E6E3FF\r
-:100DF000F1E081918D9391E0E434F907D1F717C0C8\r
-:100E000090E0A5CF83E10E94DC0580930001811171\r
-:100E1000C8CF81E40E94B205809300018111C1CF47\r
-:100E20000E94ED05B82EB094BDCF80E0BECF0E94E9\r
-:100E3000ED0481E0DF91CF911F910F91FF90EF9032\r
-:100E4000DF90CF90BF900895E82FF0E0EC5BFE4F6D\r
-:100E50008081089508958B3B910578F4883A910537\r
-:100E600040F5853A9105D0F48430910508F0B1C081\r
-:100E70008130910509F4ADC06BC0803E910508F446\r
-:100E800067C0883E910508F4A4C09C01205F310929\r
-:100E90002031310508F05CC090650895853A9105D0\r
-:100EA00009F459C0863A910509F458C083E890E4E2\r
-:100EB0000895883A910509F454C0893A910509F4D6\r
-:100EC00053C08A3A910509F452C08B3A910509F44E\r
-:100ED00051C08C3A910509F450C08D3A910509F43E\r
-:100EE0004FC0803B910509F44EC08E3A910509F43C\r
-:100EF0004DC08F3A910509F44CC0813B910509F42E\r
-:100F00004BC0823B910509F44AC0833B910509F42B\r
-:100F100049C0843B910509F448C0853B910509F41B\r
-:100F200047C0863B910509F446C0873B910509F40B\r
-:100F300045C0883B910509F444C0893B910509F4FB\r
-:100F400043C08A3B910509F042C08AE296E40895C5\r
-:100F500080E090E0089581E890E4089582E890E4CC\r
-:100F6000089582EE94E4089589EE94E408958AEE5B\r
-:100F700094E4089585EB94E4089586EB94E4089551\r
-:100F800087EB94E408958CEC94E408958DEC94E45C\r
-:100F9000089583E895E408958AE895E4089582E940\r
-:100FA00095E4089584E995E4089581E296E408952E\r
-:100FB00083E296E4089584E296E4089585E296E457\r
-:100FC000089586E296E4089587E296E4089580E025\r
-:100FD00094E40895089596E0799FF001112494E532\r
-:100FE000899FE00DF11D1124E60FF11DEE0FFF1F8B\r
-:100FF000E851FF4F859194910895880F991F805A69\r
-:101000009040FC01859194910895880F991F80521A\r
-:101010009F4FFC0185919491089526E0729FF00105\r
-:10102000112444E5849FE00DF11D1124E60FF11D0C\r
-:10103000EE0FFF1FE851FF4F25913491C9019A959A\r
-:1010400081159F4110F4C9010895C901905281157D\r
-:10105000904128F4C9019F700E9405080895C901B4\r
-:1010600090538115904120F4C9019927906C0895FF\r
-:10107000211580E5380769F40E94AD159FEF24E340\r
-:101080004CE0915020404040E1F700C000000C943B\r
-:10109000081D213080E5380731F48091CD01816051\r
-:1010A0008093CD010895C90190558115904108F0B4\r
-:1010B00050C0832F99278F70992781309105D9F4DB\r
-:1010C000A9014370552702C0880F991F4A95E2F77E\r
-:1010D0009C68A90164E0440F551F6A95E1F7442715\r
-:1010E0005370842B952B73E0220F331F7A95E1F711\r
-:1010F000207633271DC08230910529F4922F88274E\r
-:10110000816F906A089583309105A9F4A901437015\r
-:10111000552781E090E002C0880F991F4A95E2F7B9\r
-:101120009C6843E0220F331F4A95E1F7207E377019\r
-:10113000822B932B08950497F1F4A901437055274E\r
-:1011400081E090E002C0880F991F4A95E2F79A6803\r
-:10115000E8CFC90190578115904120F4C9019F70D3\r
-:1011600090620895C90190588115904120F4C901F9\r
-:101170009F70906A0895203E3105E0F4203C3105CF\r
-:1011800058F52133310509F470C048F4293231058E\r
-:1011900009F464C02A32310509F46EC074C02933E1\r
-:1011A0003105F1F022383105D9F02533310509F444\r
-:1011B0004EC069C0233E310589F138F4203E310527\r
-:1011C000C1F0223E3105E1F05EC0263E310569F1F5\r
-:1011D000273E3105A9F157C0C9010E94FD070895B6\r
-:1011E0008091E00180FD02C081FF4DC080EE90E063\r
-:1011F0004BC08091E00180FFF9CF89E390E044C0CB\r
-:101200008091E00182FF0EC08091E00184FF03C065\r
-:1012100080E090E039C083EE90E036C08091E0013C\r
-:1012200082FFF2CF82EE90E02FC08091E00183FF39\r
-:101230000BC08091E00184FDEBCF87EE90E024C0ED\r
-:101240008091E00183FFF5CF86EE90E01DC0809194\r
-:10125000E00185FF07C089E290E016C08091E001BF\r
-:1012600085FFF9CF85E390E00FC08091E00186FF14\r
-:1012700007C08AE290E008C08091E00186FFF9CFC4\r
-:1012800081E390E001C0C9010E942B0708950895F1\r
-:101290000C944709809162010895CF93DF9300D0A9\r
-:1012A0001F92CDB7DEB72091E601243019F523E077\r
-:1012B00029839B838A832093E9008FEF9091E80034\r
-:1012C000815095FD06C095ED9A95F1F700008111CA\r
-:1012D000F5CF8091E80085FF0DC040E050E063E06D\r
-:1012E00070E0CE0101960E94B70B8091E8008E77E6\r
-:1012F0008093E8000F900F900F90DF91CF910895A9\r
-:10130000CF93DF9300D01F92CDB7DEB72091E601D7\r
-:10131000243021F522E029839B838A8383E0809314\r
-:10132000E9008FEF9091E800815095FD06C095EDA2\r
-:101330009A95F1F700008111F5CF8091E80085FFC3\r
-:101340000DC040E050E063E070E0CE0101960E94E5\r
-:10135000B70B8091E8008E778093E8000F900F9094\r
-:101360000F90DF91CF9108952091E6012430F1F4A0\r
-:1013700022E02093E9002FEF3091E800215035FD65\r
-:1013800006C035ED3A95F1F700002111F5CF209117\r
-:10139000E80025FF0BC040E050E065E070E00E94EF\r
-:1013A000B70B8091E8008E778093E8000895CF9383\r
-:1013B000DF93EC018091E601843009F046C0909102\r
-:1013C0000C019923D9F090910D019923B9F08093E4\r
-:1013D000E9008FEF9091E800815095FD06C095E1FE\r
+:100000000C94D7020C941B030C941B030C941B033D\r
+:100010000C941B030C941B030C941B030C941B03E8\r
+:100020000C941B030C941B030C94500E0C94220F85\r
+:100030000C941B030C941B030C941B030C941B03C8\r
+:100040000C941B030C94A1230C941B030C941B0312\r
+:100050000C941B030C94451D0C941B030C941B0364\r
+:100060000C941B030C941B030C941B030C941B0398\r
+:100070000C941B030C941B030C941B030C941B0388\r
+:100080000C941B030C941B030C941B030C941B0378\r
+:100090000C941B030C941B030C941B030C941B0368\r
+:1000A0000C941B030C941B030C941B032B035F0386\r
+:1000B0008403C2032B036803A603D00391049104B5\r
+:1000C00054045E0468047A04870FA90F9410A90FE2\r
+:1000D0009410EB0F0E1094106310761070137013C1\r
+:1000E000B113B113F3132F142F162F1647142F1615\r
+:1000F0003E153E1509162F162F161D16000000007E\r
+:1001000000000000000000000000000000000000EF\r
+:100110000AC80BC80CC80DC80EC80FC810C811C833\r
+:100120000D200C200B300A30E00000001E001400EF\r
+:1001300004001D0000074E001F001A0016001B00DF\r
+:10014000000F4C002000080007000600E2002A0013\r
+:100150002100150009001900E3004B0022001700E0\r
+:100160000A00050000004A0029002F0000002B02B1\r
+:1001700000004D002D00300000002B00000050005A\r
+:1001800023001C000B00110000004F002400180089\r
+:100190000D001000E700520025000C000E00360094\r
+:1001A000E6002C00260012000F003700000F280088\r
+:1001B00027001300330038000007510011201020E1\r
+:1001C0000F200E30E40000000100010001000100DA\r
+:1001D000E00000003A001E02200222020007510047\r
+:1001E0003B001F0221022302000F28003C002F02C7\r
+:1001F00026022F00E2002C003D00300227023000D2\r
+:10020000E30052003E002402350035020000500099\r
+:100210002900360200002B0000004F002D0037029D\r
+:1002200000002B0200004A003F003102380031007C\r
+:1002300000004D004000240021001E0027784B00E4\r
+:100240004100250022001F0037744C0042002600A8\r
+:10025000230020002E7F2A004300380025022D00B5\r
+:100260002E774E00010001000100010028710000FE\r
+:100270000100010001000100E000000044006600F0\r
+:10028000A60000000007B50045001430F20016304B\r
+:10029000F60000006800F000F100F100F400B60084\r
+:1002A00069001530F3001730F500B4006A00A900AA\r
+:1002B000AA00A8000000B8002900F9000000FA0018\r
+:1002C0000000B9000000F9000000FA000000AC00D6\r
+:1002D0006B004600530000000000AB006C004A00B9\r
+:1002E00050004D004978A9006D00520051005100A6\r
+:1002F0004C74AE006E004B004F004E00000FAD007E\r
+:100300006F00B100B30000000007AA000100010067\r
+:1003100001000100E40000000100010001000100F3\r
+:10032000010000002900010001000100010001009E\r
+:1003300001000100010001000100010001000100B5\r
+:1003400001000100010001000100010001000100A5\r
+:100350000100010001000100010001000000010096\r
+:100360000100010000000100000001000100010087\r
+:100370000000010000000100010001000100010077\r
+:100380000000010001000100010001000100010066\r
+:100390000100010001000100010001000100010055\r
+:1003A00001000100010001002A000100010001001C\r
+:1003B00001000100010001000100E5000100000052\r
+:1003C00016034500720067006F0044006F0078005C\r
+:1003D000200045005A000000160345007200670027\r
+:1003E0006F0044006F007800200045005A000000B4\r
+:1003F0000403090409026D00040100A0FA090400C5\r
+:10040000000103010100092111010001223F000741\r
+:1004100005810308000A0904010001030102000923\r
+:100420002111010001224D000705820308000A097D\r
+:10043000040200010300000009211101000122361D\r
+:10044000000705830308000A0904030001030000F4\r
+:100450000009211101000122390007058403100061\r
+:10046000011201100100000008EDFE071301000158\r
+:1004700002000105010906A101050719E029E71598\r
+:1004800000250195087501810205081901290595C6\r
+:100490000575019102950175039101050719002960\r
+:1004A0007715002501957875018102C00501098045\r
+:1004B000A101850216010026B7001A01002AB70023\r
+:1004C000751095018100C0050C0901A10185031675\r
+:1004D0000100269C021A01002A9C027510950181D8\r
+:1004E00000C005010902A1010901A10005091901C6\r
+:1004F00029051500250195057501810295017503F2\r
+:1005000081010501093009311581257F95027508A2\r
+:10051000810609381581257F950175088106050C2E\r
+:100520000A38021581257F950175088106C0C0052E\r
+:10053000010906A101050719E029E7150025019524\r
+:1005400008750181029501750881010508190129C5\r
+:10055000059505750191029501750391010507192E\r
+:100560000029FF150025FF950675088100C00000D1\r
+:10057000000000000000000000010204060A0F173E\r
+:10058000202C3A4A5D71879DB3C7DAE9F5FCFFFC80\r
+:10059000F5E9DAC7B39D87715D4A3A2C20170F0A37\r
+:1005A0000604020100000000000000000000112409\r
+:1005B0001FBECFEFDAE0DEBFCDBF04B603FE24C01E\r
+:1005C0008091F6019091F701A091F801B091F901A5\r
+:1005D0008730904BA740B04BB9F41092F6011092BF\r
+:1005E000F7011092F8011092F90114BE84B7877FC9\r
+:1005F00084BF88E10FB6F894809360001092600089\r
+:100600000FBEE0E0FFE3099511E0A0E0B1E0E0ED0E\r
+:10061000FAE402C005900D92A433B107D9F721E0A6\r
+:10062000A4E3B1E001C01D92A63FB207E1F70E942A\r
+:10063000960B0C9466250C940000DC01462F50E0CC\r
+:100640004A5051094E30510508F06BC14A5A5F4F6C\r
+:10065000FA010C94162512962C91129780913A016A\r
+:1006600090913B012223F9F015962C91207FD9F42B\r
+:1006700001968330910510F082E090E090933B0169\r
+:1006800080933A0180913A0190913B01823091052B\r
+:1006900029F489E30E94F81189E30EC0019709F05B\r
+:1006A00040C181EEFAC0019790933B0180933A01DB\r
+:1006B000892B09F036C181EE0E94C01232C1129618\r
+:1006C0002C918091380190913901222379F090C0CA\r
+:1006D00012963C91129715962C9180913801909129\r
+:1006E0003901207F31117AC009F09FC001979093A2\r
+:1006F000390180933801892B09F013C180913501AC\r
+:1007000081110FC181E067C012963C911297159636\r
+:100710002C918091360190913701207F332361F035\r
+:10072000222309F491C0009709F08EC02091340172\r
+:1007300021118AC08BE2B1C02223B1F00097A1F44D\r
+:1007400020913401211110C08BE2B6CF12963C915A\r
+:10075000129715962C918091360190913701207F48\r
+:10076000311168C009F08DC00197909337018093D3\r
+:100770003601892B09F0D5C0809134018111D1C097\r
+:1007800082E029C012969C91129715968C9199231C\r
+:10079000B1F0982F907F79F080FD0DC085E37DC08A\r
+:1007A00012969C91129715968C91992379F0982F17\r
+:1007B000907F09F06FC083E00E94C31AB2C0982FE7\r
+:1007C000907F41F080FD06C085E376CF982F907F23\r
+:1007D00009F066C083E00E94E41AA3C0222341F01E\r
+:1007E000009731F420913501211102C084E355C0F6\r
+:1007F00001968330910510F082E090E090933901EA\r
+:1008000080933801809138019091390182309105AF\r
+:1008100029F0019709F085C081E0CECF80913501A4\r
+:1008200091E08927809335017CC0009709F05ECF65\r
+:1008300084E342CF222341F0009731F42091340128\r
+:10084000211102C081E329C001968330910510F087\r
+:1008500082E090E0909337018093360180913601D9\r
+:10086000909137018230910529F0019709F059C024\r
+:1008700082E0A2CF8091340191E0892780933401F6\r
+:1008800050C0009709F070CF2091340121116CCF36\r
+:1008900081E312CF80FD8FCF8EE20E94F81141C01C\r
+:1008A00080FD98CF8EE208CF12968C91882319F0A4\r
+:1008B00080EF90E013C080EF90E017C012968C910B\r
+:1008C000882319F080EF90E01BC080EF90E021C0FA\r
+:1008D00012968C91882339F081EF90E00E94B91F25\r
+:1008E00082EF90E011C081EF90E00E94212082EF22\r
+:1008F00090E013C012968C91882349F081EF90E02C\r
+:100900000E94B91F83EF90E00E94B91F08C081EFD9\r
+:1009100090E00E94212083EF90E00E9421200E941D\r
+:10092000A62080E090E00895089580913A0190918A\r
+:100930003B01892B19F0259A2D9A0DC0E0910E01EB\r
+:10094000F0910F01808185FDF6CF0E94CF1081FDCF\r
+:10095000F2CF25982D988091B90181FF03C0269A86\r
+:100960002E9A02C026982E988091B90182FF03C06A\r
+:10097000279A2F9A089527982F9808950C949504F4\r
+:1009800056985E9825982D9826982E9827982F98F7\r
+:100990008FEF90E0909389008093880090938B0074\r
+:1009A00080938A0090938D0080938C00259A2D9AD5\r
+:1009B0002FEF80E792E0215080409040E1F700C0A7\r
+:1009C0000000269A2E9A2FEF80E792E02150804077\r
+:1009D0009040E1F700C00000279A2F9A2FEF80E7A0\r
+:1009E00092E0215080409040E1F700C0000025983F\r
+:1009F0002D982FEF80E792E0215080409040E1F762\r
+:100A000000C0000026982E982FEF80E792E021503A\r
+:100A100080409040E1F700C0000027982F9856983A\r
+:100A20005E9825982D9826982E9827982F980895A7\r
+:100A300089EA8093800089E08093810024982C9833\r
+:100A40003F988AB18F748AB96E98479A8BB1806B40\r
+:100A50008BB9769A0E94C0040C94940480E280932F\r
+:100A6000000180913C0181110EC00E947D0581E052\r
+:100A700080933C012FEF83ED90E321508040904024\r
+:100A8000E1F700C0000080E40E948305809300012C\r
+:100A900081112EC00E94AD0580930001811128C0F4\r
+:100AA0000E94AD0580930001811122C08FE30E9456\r
+:100AB000AD058093000181111BC00E94A50580E453\r
+:100AC0000E94830580930001811112C08CE00E9476\r
+:100AD000AD058093000181110BC00E94AD0580938C\r
+:100AE0000001811105C08FE30E94AD0580930001D4\r
+:100AF0000E94A5058091000108951092B9008AE036\r
+:100B00008093B800089594EA9093BC009091BC0043\r
+:100B100097FFFCCF9091B900987F983021F09031E9\r
+:100B200011F081E008958093BB0084E88093BC00BD\r
+:100B30008091BC0087FFFCCF8091B900887F88310D\r
+:100B400011F0803471F780E0089584E98093BC004F\r
+:100B50008091BC0084FDFCCF08958093BB0084E8A5\r
+:100B60008093BC008091BC0087FFFCCF9091B900BE\r
+:100B7000987F81E0983209F480E0089584E88093BA\r
+:100B8000BC008091BC0087FFFCCF8091BB00089522\r
+:100B900080910001811115C080E40E94830580933B\r
+:100BA000000181110CC082E10E94AD05809300011B\r
+:100BB000811105C08FEF0E94AD05809300010E9456\r
+:100BC000A50584B1807F84B985B1807F85B98AB15C\r
+:100BD000837F8AB98BB1837F8BB93E9846980895FD\r
+:100BE0000E942E05809300010E94C80580B38C707E\r
+:100BF00080BB81B3836F81BBECE4F1E0AEE3B1E095\r
+:100C000011921D9281E0EA35F807D1F70C9418058E\r
+:100C1000BF92CF92DF92EF92FF920F931F93CF93E9\r
+:100C2000DF9380910001882379F080913D018F5FEF\r
+:100C300080933D01811108C00E942E058093000120\r
+:100C4000811102C00E94C0040EE311E0C0E0D0E0B8\r
+:100C5000DD24D39482E0C82EEE24E394F12CC73037\r
+:100C600000F580910001811162C080E40E9483053B\r
+:100C700080930001811112C082E10E94AD05809332\r
+:100C8000000181110BC0C7010C2E01C0880F0A940E\r
+:100C9000EAF780950E94AD05809300010E94A505AA\r
+:100CA00046C0CA30A1F028F4C83059F0C93061F00C\r
+:100CB00005C0CC3089F070F0CD3089F0209A2898AA\r
+:100CC00010C0219A29980DC0229A2A980AC0239A06\r
+:100CD0002B9807C0529A01C0539A5B9802C03E9A63\r
+:100CE0004698E0EAEA95F1F78FB179995AC092E017\r
+:100CF00081708D25892B7C9B02C090E001C094E01F\r
+:100D0000892B7D9B02C090E001C098E0892B7E9BDF\r
+:100D100002C090E001C090E1892B9FB19095991F8E\r
+:100D20009927991F9295990F907E892B0FC08091DA\r
+:100D3000000181114BC080E40E9483058093000173\r
+:100D4000882389F1B12C0E94A5058B2DF801908193\r
+:100D5000981719F08083C09201010E94C80521965E\r
+:100D60000F5F1F4FCE30D10509F079CF809101017F\r
+:100D7000882371F1815080930101882339F08FE934\r
+:100D80009FE00197F1F700C0000022C0ACE4B1E0A1\r
+:100D9000EEE3F1E081918D9391E0EC34F907D1F726\r
+:100DA00017C090E0A5CF83E10E94AD0580930001BC\r
+:100DB0008111C8CF81E40E948305809300018111D5\r
+:100DC000C1CF0E94BE05B82EB094BDCF80E0BECF8B\r
+:100DD0000E94BE0481E0DF91CF911F910F91FF909F\r
+:100DE000EF90DF90CF90BF900895E82FF0E0E45BA4\r
+:100DF000FE4F808108950895089596E0799FF0014F\r
+:100E0000112494E5899FE00DF11D1124E60FF11DD9\r
+:100E1000EE0FFF1FE05EFE4F859194910895880FBD\r
+:100E2000991F84589040FC01859194910895880FF2\r
+:100E3000991F84509F4FFC018591949108950F93C1\r
+:100E40001F93CF93DF93EC01811520E3920730F5D8\r
+:100E5000811530E2930708F0B1C08B3B910588F40F\r
+:100E6000883A910508F058C0853A910508F049C0C4\r
+:100E70008430910508F043C08130910509F4B2C176\r
+:100E8000AEC18F3F910509F0D0F5803F910508F084\r
+:100E900092C0805E9109089790F1A1C1C11581E5CA\r
+:100EA000D807A8F4C23090E5D90708F09FC0C11553\r
+:100EB00020E5D20709F486C008F092C0C11580E48D\r
+:100EC000D80708F08CC18E011127106CCCC1C11558\r
+:100ED00090E8D90758F4C11520E7D20708F07BC184\r
+:100EE000C11530E6D30708F423C179C1C11580E9E3\r
+:100EF000D80708F074C18E011F70106AB4C18E014A\r
+:100F0000B2C1853A910509F470C1863A910509F498\r
+:100F10006FC103E810E4A7C1883A910509F46BC1D9\r
+:100F2000893A910509F46AC18A3A910509F469C1BF\r
+:100F30008B3A910509F468C18C3A910509F467C1AF\r
+:100F40008D3A910509F466C1803B910509F465C1AC\r
+:100F50008E3A910509F464C18F3A910509F463C191\r
+:100F6000813B910509F462C1823B910509F461C19D\r
+:100F7000833B910509F460C1843B910509F45FC18D\r
+:100F8000853B910509F45EC1863B910509F45DC17D\r
+:100F9000873B910509F45CC1883B910509F45BC16D\r
+:100FA000893B910509F45AC18A3B910509F059C161\r
+:100FB0000AE216E458C18C01106555C19F700E9469\r
+:100FC000170752C10E9452169FEF24E33CE0915054\r
+:100FD00020403040E1F700C000000E946A1D43C17C\r
+:100FE0008091D50181608093D5013DC10E94121F7F\r
+:100FF000811102C00E94F81E0E942F1F90E0909362\r
+:10100000F6018093F501C23080E5D80721F4809184\r
+:10101000F501816086C0C43090E5D90721F4809144\r
+:10102000F50182607EC0C63020E5D20721F48091B0\r
+:10103000F501846076C0C83030E5D30719F480919B\r
+:10104000F50127C0CA3080E5D80721F48091F50169\r
+:10105000806167C0CC3090E5D90721F48091F5011B\r
+:1010600080625FC0CE3020E5D20721F48091F50187\r
+:10107000806457C0C03130E5D30721F48091F50179\r
+:1010800080684FC0C23180E5D80729F48091F5010E\r
+:101090008460886046C0C33090E5D90721F4809110\r
+:1010A000F5018E7F3EC0C53020E5D20721F4809146\r
+:1010B000F5018D7F36C0C73030E5D30721F480912C\r
+:1010C000F5018B7F2EC0C93080E5D80719F48091D7\r
+:1010D000F50126C0CB3090E5D90721F48091F501C8\r
+:1010E0008F7E1FC0CD3020E5D20721F48091F5011D\r
+:1010F0008F7D17C0CF3030E5D30721F48091F50103\r
+:101100008F7B0FC0C13180E5D80721F48091F501B4\r
+:101110008F7707C0C331D04531F48091F5018B7FC3\r
+:10112000877F8093F5018091F5010E94331F9BC05A\r
+:101130008D2F99278F70992781309105E9F48E01C1\r
+:10114000037011279C0102C0220F331F0A95E2F79A\r
+:1011500089011C68CE0164E0880F991F6A95E1F748\r
+:1011600088279370082B192B73E0CC0FDD1F7A951D\r
+:10117000E1F7C076DD272CC08230910529F41C2FC1\r
+:101180000027016F106A6FC08330910561F4CE01B2\r
+:101190008370992701E010E002C0000F111F8A95AB\r
+:1011A000E2F71C680EC0049709F05DC0CE018370A1\r
+:1011B000992701E010E002C0000F111F8A95E2F7A5\r
+:1011C0001A6843E0CC0FDD1F4A95E1F7C07ED77067\r
+:1011D0000C2B1D2B48C08E011F70106244C000E014\r
+:1011E00010E041C001E010E03EC001E810E43BC067\r
+:1011F00002E810E438C002EE14E435C009EE14E44D\r
+:1012000032C00AEE14E42FC005EB14E42CC006EB48\r
+:1012100014E429C007EB14E426C00CEC14E423C04A\r
+:101220000DEC14E420C003E815E41DC00AE815E441\r
+:101230001AC002E915E417C004E915E414C001E27C\r
+:1012400016E411C003E216E40EC004E216E40BC07B\r
+:1012500005E216E408C006E216E405C007E216E45B\r
+:1012600002C000E014E4C801DF91CF911F910F91FB\r
+:10127000089596E0799FF001112494E5899FE00D8F\r
+:10128000F11D1124E60FF11DEE0FFF1FE05EFE4F72\r
+:1012900085919491803E9105E0F4803C910558F54C\r
+:1012A0008133910509F46FC048F48932910509F43E\r
+:1012B00063C08A32910509F46DC072C0893391050B\r
+:1012C000E9F082389105D1F08533910509F44DC0DC\r
+:1012D00067C0833E910581F138F4803E9105B9F0F5\r
+:1012E000823E9105D9F05CC0863E910561F1873E52\r
+:1012F0009105A1F155C00E940F0708952091F501B5\r
+:1013000020FD02C021FF4CC080EE90E049C08091DA\r
+:10131000F50180FFF9CF89E390E042C08091F501AB\r
+:1013200082FF0EC08091F50184FF03C080E090E051\r
+:1013300037C083EE90E034C08091F50182FFF2CF98\r
+:1013400082EE90E02DC08091F50183FF0BC080916B\r
+:10135000F50184FDEBCF87EE90E022C08091F5018E\r
+:1013600083FFF5CF86EE90E01BC08091F50185FFED\r
+:1013700007C089E290E014C08091F50185FFF9CFA4\r
+:1013800085E390E00DC08091F50186FF07C08AE2F9\r
+:1013900090E006C08091F50186FFF9CF81E390E0EF\r
+:1013A0000E941F07089508950C94D30980916A0143\r
+:1013B0000895CF93DF9300D01F92CDB7DEB7209171\r
+:1013C000EC01243019F523E029839B838A83209341\r
+:1013D000E9008FEF9091E800815095FD06C095EDF2\r
 :1013E0009A95F1F700008111F5CF8091E80085FF13\r
-:1013F0002CC040E050E060E170E017C081E08093D5\r
-:10140000E9008FEF9091E800815095FD06C095EDC1\r
-:101410009A95F1F700008111F5CF8091E80085FFE2\r
-:1014200014C040E050E068E070E0CE010E94B70BCD\r
-:101430008091E8008E778093E80080E1FE01A2E5CC\r
-:10144000B1E001900D928A95E1F7DF91CF91089577\r
-:101450008091E501811109C00E94490D0E94A60DED\r
-:101460008091E20084608093E20008951092E5018B\r
-:10147000089508950C942E230E949F1C0E943423EB\r
-:101480000E9443100C94480942E061EC81E00E9404\r
-:10149000C30C42E061EC82E00E94C30C42E061ECCC\r
-:1014A00083E00E94C30C42E161EC84E00C94C30C25\r
-:1014B0008091E801833009F455C030F4813071F037\r
-:1014C000823009F48EC008958A3009F47AC08B30D6\r
-:1014D00009F460C0893009F09CC020C08091E70108\r
-:1014E000813A09F096C08091E800877F8093E800F8\r
-:1014F0008091EB019091EC01892B21F060E080E07C\r
-:1015000090E003C060E182E591E070E00E94000C91\r
-:101510008091E8008B778093E80008958091E7013F\r
-:10152000813209F076C08091EB019091EC01009737\r
-:1015300019F0039709F06DC08091E800877F8093D0\r
-:10154000E8008091E80082FD05C08091E6018111EC\r
-:10155000F8CF5FC08091F100809362018091E80034\r
-:101560008B7753C08091E701813A09F052C0809196\r
-:10157000EB019091EC01892B09F04BC08091E800C0\r
-:10158000877F8093E8008091E80080FFFCCF809106\r
-:101590000C0136C08091E7018132D9F58091EB01D1\r
-:1015A0009091EC01892BA9F58091E800877F8093C9\r
-:1015B000E8000E94F80C8091E90180930C010C94E2\r
-:1015C000AD158091E701813221F58091E800877F98\r
-:1015D0008093E8000E94F80C8091EA0180936301F7\r
-:1015E00008958091E701813AA1F48091E800877F16\r
-:1015F0008093E8008091E80080FFFCCF8091630138\r
-:101600008093F1008091E8008E778093E8000C943D\r
-:10161000F80C089584B7877F84BF88E10FB6F894EB\r
-:1016200080936000109260000FBE90E080E80FB6DB\r
-:10163000F89480936100909361000FBE0E94921015\r
-:101640000E94490D0E94A60D8091E2008460809363\r
-:10165000E20078940E9421100E94941082E091E0B0\r
-:101660000E943E100E941C238091E601853069F49F\r
-:101670000E94621C8091E4018823B1F30E948A1CBD\r
-:10168000882391F30E94A10BEFCF0E949A10ECCF18\r
-:10169000292F332723303105A9F06CF4213031058F\r
-:1016A00009F442C02230310509F043C08DE690E0D4\r
-:1016B00024E037E042C021323105C9F02232310541\r
-:1016C00019F137C099278130910541F08230910599\r
-:1016D00041F0892B71F5E0E0F7E005C0E8EEF6E0B7\r
-:1016E00002C0E0EDF6E0849190E09F0126C06430F6\r
-:1016F00000F5E62FF0E0EE0FFF1FEE5DFE4F2081BC\r
-:10170000318189E090E019C0643098F4E62FF0E070\r
-:10171000DF01AA0FBB1FA65EBE4F2D913C91EA5E72\r
-:10172000FE4F808190E009C082E190E021E737E040\r
-:1017300004C080E090E020E030E0FA0131832083B3\r
-:10174000089580E189BD82E189BD09B400FEFDCF25\r
-:101750008091D8008F7D8093D8008091E0008260D6\r
-:101760008093E0008091E00081FDFCCF0895CF924E\r
-:10177000DF92EF92FF920F931F93CF93DF937C0141\r
-:101780008B01EA010E94190D811131C0209731F0BF\r
-:1017900088819981081B190BE80EF91EC12CD12CE8\r
-:1017A0000115110519F18091E80085FD14C08091A3\r
-:1017B000E8008E778093E800209741F08881998136\r
-:1017C0008C0D9D1D9983888385E011C00E94190DA1\r
-:1017D000882331F30CC0F70181917F018093F100E0\r
-:1017E00001501109FFEFCF1ADF0ADACF80E0DF9155\r
-:1017F000CF911F910F91FF90EF90DF90CF900895C0\r
-:101800002091ED013091EE012617370748F0611560\r
-:10181000710539F42091E8002E772093E80001C08B\r
-:10182000B901FC0120E061157105B9F18091E60173\r
-:10183000882309F440C0853009F43FC08091E80056\r
-:1018400083FD3DC08091E80082FF06C08091E800E2\r
-:1018500082FF26C080E008958091E80080FFE3CFFA\r
-:101860002091F3008091F20090E0922B61157105B8\r
-:1018700051F08830910538F421912093F1006150A6\r
-:1018800071090196F3CF21E0089709F020E08091DB\r
-:10189000E8008E778093E800C6CF2111C7CFD6CF5E\r
-:1018A0008091E601882339F0853039F08091E80095\r
-:1018B00083FFCCCF04C082E0089583E0089581E0E7\r
-:1018C00008952091ED013091EE012617370748F079\r
-:1018D0006115710539F42091E8002E772093E80016\r
-:1018E00001C0B901FC0120E061157105C1F18091D1\r
-:1018F000E601882309F441C0853009F440C0809195\r
-:10190000E80083FD3EC08091E80082FF06C0809120\r
-:10191000E80082FF27C080E008958091E80080FF02\r
-:10192000E3CF2091F3008091F20090E0922B6115BB\r
-:10193000710559F08830910540F424912093F1000D\r
-:101940003196615071090196F2CF21E0089709F0B4\r
-:1019500020E08091E8008E778093E800C5CF2111C8\r
-:10196000C6CFD5CF8091E601882339F0853039F094\r
-:101970008091E80083FFCBCF04C082E0089583E02C\r
-:10198000089581E00895982F973058F59093E900D5\r
-:10199000981739F07091EC002091ED005091F00013\r
-:1019A00003C0242F762F50E021FF19C03091EB00A7\r
-:1019B0003E7F3093EB003091ED003D7F3093ED00A2\r
-:1019C0003091EB0031603093EB007093EC0020938A\r
-:1019D000ED005093F0002091EE0027FF07C09F5FBD\r
-:1019E000D3CF8F708093E90081E0089580E008955F\r
-:1019F0008091E70187FD05C08091E80080FF0EC05F\r
-:101A000012C08091E80082FD05C08091E60181113D\r
-:101A1000F8CF08958091E8008B7708C08091E601A7\r
-:101A20008111EACF08958091E8008E778093E800D5\r
-:101A300008958091E4009091E50045E62091EC0046\r
-:101A400020FF21C02091E80020FD21C02091E60167\r
-:101A5000222389F0253089F02091EB0025FD0FC06D\r
-:101A60002091E4003091E5002817390739F34150FF\r
-:101A700041F0C901E3CF82E0089583E0089581E059\r
-:101A8000089584E008952091E80022FFDFCF80E0F0\r
-:101A900008950E94B70D0E94BF0DE0EEF0E0808136\r
-:101AA00081608083E8EDF0E080818F77808319BCCE\r
-:101AB000A7EDB0E08C918E7F8C9380818F7E8083A8\r
-:101AC0001092E50108950F931F93CF93DF930E9427\r
-:101AD000B70D0E94BF0DC8EDD0E088818F77888355\r
-:101AE00088818068888388818F7D888319BC109263\r
-:101AF000E6011092E2011092E4011092E30100EE7F\r
-:101B000010E0F80180818B7F8083888181608883E9\r
-:101B100042E060E080E00E94C30CE1EEF0E08081F2\r
-:101B20008E7F8083E2EEF0E080818160808380811F\r
-:101B300088608083F80180818E7F808388818061C6\r
-:101B40008883DF91CF911F910F910895E8EDF0E028\r
-:101B500080818F7E8083E7EDF0E0808181608083EB\r
-:101B600084E082BF81E08093E5010C94630DE8ED91\r
-:101B7000F0E080818E7F80831092E20008951092C1\r
-:101B8000DA001092E10008951F920F920FB60F92A3\r
-:101B900011242F933F934F935F936F937F938F9372\r
-:101BA0009F93AF93BF93EF93FF938091E10082FFE8\r
-:101BB0000BC08091E20082FF07C08091E1008B7F23\r
-:101BC0008093E1000E9420108091DA0080FF1FC006\r
-:101BD0008091D80080FF1BC08091DA008E7F8093B7\r
-:101BE000DA008091D90080FF0DC080E189BD82E1DB\r
-:101BF00089BD09B400FEFDCF81E08093E6010E941B\r
-:101C0000280A05C019BC1092E6010E94360A80918C\r
-:101C1000E10080FF19C08091E20080FF15C0809133\r
-:101C2000E2008E7F8093E2008091E20080618093E9\r
-:101C3000E2008091D80080628093D80019BC85E0D2\r
-:101C40008093E6010E943A0A8091E10084FF30C04F\r
-:101C50008091E20084FF2CC080E189BD82E189BDD2\r
-:101C600009B400FEFDCF8091D8008F7D8093D8000D\r
-:101C70008091E1008F7E8093E1008091E2008F7E71\r
-:101C80008093E2008091E20081608093E200809185\r
-:101C9000E201882311F084E007C08091E30087FF10\r
-:101CA00002C083E001C081E08093E6010E943C0A0B\r
-:101CB0008091E10083FF29C08091E20083FF25C06D\r
-:101CC0008091E100877F8093E10082E08093E601CC\r
-:101CD0001092E2018091E1008E7F8093E10080917B\r
-:101CE000E2008E7F8093E2008091E2008061809329\r
-:101CF000E20042E060E080E00E94C30C8091F000CE\r
-:101D000088608093F0000E94390AFF91EF91BF91A3\r
-:101D1000AF919F918F917F916F915F914F913F9183\r
-:101D20002F910F900FBE0F901F9018951F920F923A\r
-:101D30000FB60F9211242F933F934F935F936F939E\r
-:101D40007F938F939F93AF93BF93CF93EF93FF9323\r
-:101D5000C091E900CF708091EC001092E900809171\r
-:101D6000F000877F8093F00078940E94D20E10924A\r
-:101D7000E9008091F00088608093F000C093E90052\r
-:101D8000FF91EF91CF91BF91AF919F918F917F91F3\r
-:101D90006F915F914F913F912F910F900FBE0F90D8\r
-:101DA0001F9018951F93CF93DF93CDB7DEB7AA97F7\r
-:101DB0000FB6F894DEBF0FBECDBFE7EEF1E0809125\r
-:101DC000F100819321E0EF3EF207C9F70E94580A23\r
-:101DD0008091E80083FF1CC12091E7013091E80168\r
-:101DE000832F90E08A30910508F012C1FC01EA5A75\r
-:101DF000FF4F0C94B624203881F0223809F008C136\r
-:101E00008091EB018F708093E9008091EB0085FB5E\r
-:101E1000882780F91092E90006C08091E301909133\r
-:101E2000E401911182609091E800977F9093E8001F\r
-:101E30008093F1001092F100C5C0822F8D7F09F0D0\r
-:101E4000E7C0222319F0223061F0E2C08091E9015D\r
-:101E5000813009F0DDC0333009F080E08093E40187\r
-:101E600028C08091E901811124C02091EB012F70DD\r
-:101E700009F4CEC02093E9008091EB0080FF19C0E7\r
-:101E80008091EB00333011F4806211C08061809347\r
-:101E9000EB0081E090E0022E01C0880F0A94EAF77F\r
-:101EA0008093EA001092EA008091EB0088608093B2\r
-:101EB000EB001092E9008091E800877F86C0211135\r
-:101EC000A7C01091E9011F778091E3008078812BF2\r
-:101ED0008093E3008091E800877F8093E8000E9470\r
-:101EE000F80C8091E80080FFFCCF8091E3008068CF\r
-:101EF0008093E300112311F083E001C082E080931E\r
-:101F0000E60186C02058223008F082C08091E901A5\r
-:101F10009091EA018C3D23E0920779F583E08A8372\r
-:101F20008AE289834FB7F894DE01139620E03EE001\r
-:101F300051E2E32FF0E050935700E49120FF03C0FB\r
-:101F4000E295EF703F5FEF708E2F90E0EA3010F077\r
-:101F5000C79601C0C0968D939D932F5F243149F79A\r
-:101F60004FBF8091E800877F8093E8006AE270E0CD\r
-:101F7000CE0101960E94000C14C0AE014F5F5F4F6E\r
-:101F80006091EB010E94480B009709F441C0209139\r
-:101F9000E800277F2093E800BC0189819A810E9494\r
-:101FA000610C8091E8008B778093E80031C0203885\r
-:101FB00079F58091E800877F8093E8008091E201C5\r
-:101FC0008093F1008091E8008E778093E8000E9472\r
-:101FD000F80C1EC021111CC09091E9019230C0F490\r
-:101FE0008091E800877F8093E8009093E2010E944F\r
-:101FF000F80C8091E201811104C08091E30087FF19\r
-:1020000002C084E001C081E08093E6010E94440A9E\r
-:102010008091E80083FF0AC08091E800877F809369\r
-:10202000E8008091EB0080628093EB00AA960FB6E7\r
-:10203000F894DEBF0FBECDBFDF91CF911F91089501\r
-:102040000895CF938091E6018823B1F08091E90053\r
-:102050008F709091EC0090FF02C090E801C090E07A\r
-:10206000C92FC82B1092E9008091E80083FD0E94DF\r
-:10207000D20ECF70C093E900CF910895909369017B\r
-:10208000809368010895E0916801F09169013097AB\r
-:1020900021F00190F081E02D099480E00895E09115\r
-:1020A0006801F0916901309721F00280F381E02D01\r
-:1020B00009940895E0916801F0916901309721F049\r
-:1020C0000480F581E02D09940895209166013091F6\r
-:1020D00067018217930771F09093670180936601FF\r
-:1020E000E0916801F0916901309721F00680F78155\r
-:1020F000E02D0994089520916401309165018217C3\r
-:10210000930771F09093650180936401E0916801F9\r
-:10211000F0916901309721F00084F185E02D099458\r
-:10212000089508950C9491100E94A51C0E941F060A\r
-:102130000C946B1DCF92DF92EF92FF920F931F933F\r
-:10214000CF93DF93CDB7DEB72B970FB6F894DEBFF2\r
-:102150000FBECDBF0E9437063BE6E32E31E0F32EE3\r
-:1021600000E010E0C02E802F0E942407F701D190DC\r
-:102170007F01D826B1F40F5F1F4F0E30110591F784\r
-:102180008FEF89838A831B820E94AE1C8160782F27\r
-:102190009D838C8349815A816B818D810E943D1181\r
-:1021A00041C09091CD0191FF04C08B870E942A0706\r
-:1021B0008B8520E030E04D2D50E0922FBA01022EA9\r
-:1021C00002C0759567950A94E2F760FF25C02E83DB\r
-:1021D000CF82EE24E394F12C02C0EE0CFF1C9A9502\r
-:1021E000E2F790E08E219F2121E0892B09F420E085\r
-:1021F00028870E94AE1C8160782F9A8789874E813C\r
-:102200005F8168858A850E943D11F801E559FE4F7E\r
-:1022100080818E25808306C02F5F3F4F2630310599\r
-:1022200061F6A9CF0E944F2010916A010E944310CD\r
-:102230001817A1F00E94431080936A012B960FB6E5\r
-:10224000F894DEBF0FBECDBFDF91CF911F910F91EC\r
-:10225000FF90EF90DF90CF900C9448092B960FB62B\r
-:10226000F894DEBF0FBECDBFDF91CF911F910F91CC\r
-:10227000FF90EF90DF90CF900895CF93DF93CDB78D\r
-:10228000DEB72B970FB6F894DEBF0FBECDBF4F83DE\r
-:10229000588769877A878B87DE01119686E0FD0172\r
-:1022A00011928A95E9F785E0FE01379601900D922B\r
-:1022B0008A95E1F749815A816B817C818D819E816C\r
-:1022C0000E9479182B960FB6F894DEBF0FBECDBFD3\r
-:1022D000DF91CF910895CF93C82F882309F4C1C00F\r
-:1022E000823859F40E94431081FDBBC089E30E94EB\r
-:1022F000161B0E94E01B89E30CC0833879F40E940E\r
-:10230000431080FDAEC083E50E94161B0E94E01BB7\r
-:1023100083E50E94561BCF910C94E01B843859F43E\r
-:102320000E94431082FD9DC087E40E94161B0E94FC\r
-:10233000E01B87E4EECF8CEF8C0F813A48F48C2FB2\r
-:102340000E94842281118DC08C2F0E94161BE3CF26\r
-:1023500080E28C0F883048F4C77081E001C0880F9C\r
-:10236000CA95EAF70E94971BD6CF8BE58C0F833076\r
-:1023700078F4C53A29F0C63A31F482E890E005C015\r
-:1023800081E890E002C083E890E0CF910C94651062\r
-:1023900088E58C0F833108F064C0C83A39F1C93A36\r
-:1023A00041F1CA3A49F1CB3A51F1CC3A59F1CD3A1F\r
-:1023B00061F1C03B69F1CE3A71F1CF3A79F1C13B9D\r
-:1023C00081F1C23B89F1C33B91F1C43B99F1C53B1B\r
-:1023D000A1F1C63BA9F1C73BB1F1C83BB9F1C93B7B\r
-:1023E000C1F1CA3BC9F58AE292E038C082EE90E0C2\r
-:1023F00035C089EE90E032C08AEE90E02FC085EBC8\r
-:1024000090E02CC086EB90E029C087EB90E026C0DE\r
-:102410008CEC90E023C08DEC90E020C083E891E04C\r
-:102420001DC08AE891E01AC082E991E017C084E9F2\r
-:1024300091E014C081E292E011C083E292E00EC00C\r
-:1024400084E292E00BC085E292E008C086E292E06E\r
-:1024500005C087E292E002C080E090E0CF910C944A\r
-:102460007B10CF910895882309F44BC0823859F42A\r
-:102470000E94431081FF45C089E30E94161B0E9401\r
-:10248000E01B89E30CC0833871F40E94431080FF85\r
-:1024900038C083E50E94161B0E94E01B83E50E9462\r
-:1024A000561B0C94E01B843859F40E94431082FFA1\r
-:1024B00028C087E40E94161B0E94E01B87E4EFCF30\r
-:1024C0009CEF980F913A58F390E2980F983050F49F\r
-:1024D000877091E001C0990F8A95EAF7892F0E94D1\r
-:1024E0009D1BDFCF9BE5980F933020F480E090E0B8\r
-:1024F0000C946510885A833120F480E090E00C94AD\r
-:102500007B100895882321F00E94971B0C94E01BF8\r
-:102510000895882321F00E949D1B0C94E01B0895D0\r
-:10252000CF92DF92EF92FF920F931F93CF93DF939F\r
-:10253000CDB7DEB728970FB6F894DEBF0FBECDBF7C\r
-:102540008C0185E0F801DE01119601900D928A95CB\r
-:10255000E1F7F80140813181F280258122952F70C9\r
-:1025600083819481892B31F03F3F31F481E04F3FEB\r
-:1025700019F403C081E001C080E080FDCBC2498333\r
-:102580003A8389819A812F830E94D41A9E838887F7\r
-:102590000E94D31A0E94A6192F814E816885FF20C0\r
-:1025A00029F00E94B41B68854E812F81E42FE295AB\r
-:1025B000EF70F0E0E05AFF4F0C94B624842F807F38\r
-:1025C000142F1F70882311F01295107FFF2059F0EF\r
-:1025D000112309F454C2812F68870E94A71B0E940F\r
-:1025E000E01B68854CC2862F0E943312112309F428\r
-:1025F00091C2812F0E94AD1B28960FB6F894DEBFC2\r
-:102600000FBECDBFDF91CF911F910F91FF90EF9043\r
-:10261000DF90CF900C94E01B342F307F842F8F708D\r
-:10262000303211F08295807F662319F0613019F104\r
-:102630002BC0FF20B1F0222309F493C1213009F00F\r
-:1026400090C128960FB6F894DEBF0FBECDBFDF91C4\r
-:10265000CF911F910F91FF90EF90DF90CF900C944E\r
-:10266000C71B222319F0213009F454C28E830E9423\r
-:10267000CA1B8E8189C1FF2021F0223008F04AC296\r
-:1026800070C1211147C280C1FF2021F0222309F42B\r
-:1026900068C1F5C1222309F477C105C2242F26950C\r
-:1026A0002695237030E02115310521F021303105C8\r
-:1026B000C9F030C2FF2021F0862F942F937002C002\r
-:1026C00080E090E028960FB6F894DEBF0FBECDBF35\r
-:1026D000DF91CF911F910F91FF90EF90DF90CF90FE\r
-:1026E0000C946510FF2021F0862F942F937002C068\r
-:1026F00080E090E028960FB6F894DEBF0FBECDBF05\r
-:10270000DF91CF911F910F91FF90EF90DF90CF90CD\r
-:102710000C947B10862FFF2019F00E94571F02C0D7\r
-:102720000E94BF1F28960FB6F894DEBF0FBECDBF24\r
-:10273000DF91CF911F910F91FF90EF90DF90CF909D\r
-:102740000C944420842F837009F076C0F110E2C10C\r
-:10275000262F229526952770220F220F862F8F7005\r
-:10276000C82ED12CE12CF12C022E04C0CC0CDD1C87\r
-:10277000EE1CFF1C0A94D2F764FF10C06FE070E0FB\r
-:1027800080E090E004C0660F771F881F991F2A958C\r
-:10279000D2F7609570958095909503C060E070E0E9\r
-:1027A000CB01242F269526952370422F50E04230EE\r
-:1027B0005105D1F04330510559F16C297D298E29FD\r
-:1027C0009F294130510541F128960FB6F894DEBF9C\r
-:1027D0000FBECDBFDF91CF911F910F91FF90EF9072\r
-:1027E000DF90CF900C94CB196C297D298E299F29DD\r
-:1027F00028960FB6F894DEBF0FBECDBFDF91CF9104\r
-:102800001F910F91FF90EF90DF90CF900C94E519FE\r
-:102810000E94CB19C701B60128960FB6F894DEBF07\r
-:102820000FBECDBFDF91CF911F910F91FF90EF9021\r
-:10283000DF90CF900C94B119FF2019F0842F817094\r
-:1028400001C08695882309F465C1262F2295269517\r
-:102850002770220F220F862F8F70C82ED12CE12CCB\r
-:10286000F12C022E04C0CC0CDD1CEE1CFF1C0A94C3\r
-:10287000D2F764FF10C06FE070E080E090E004C029\r
-:10288000660F771F881F991F2A95D2F7609570955C\r
-:102890008095909503C060E070E0CB01242F2695D1\r
-:1028A00026952370422F50E042305105D1F043303D\r
-:1028B000510559F16C297D298E299F2941305105F7\r
-:1028C00041F128960FB6F894DEBF0FBECDBFDF9161\r
-:1028D000CF911F910F91FF90EF90DF90CF900C94CC\r
-:1028E0009F1A6C297D298E299F2928960FB6F89466\r
-:1028F000DEBF0FBECDBFDF91CF911F910F91FF9033\r
-:10290000EF90DF90CF900C94B91A0E949F1AC701E4\r
-:10291000B60128960FB6F894DEBF0FBECDBFDF918B\r
+:1013F0000DC040E050E063E070E0CE0101960E9435\r
+:10140000430C8091E8008E778093E8000F900F9056\r
+:101410000F90DF91CF910895CF93DF9300D01F926B\r
+:10142000CDB7DEB72091EC01243021F522E02983ED\r
+:101430009B838A8383E08093E9008FEF9091E8009B\r
+:10144000815095FD06C095ED9A95F1F70000811148\r
+:10145000F5CF8091E80085FF0DC040E050E063E0EB\r
+:1014600070E0CE0101960E94430C8091E8008E77D7\r
+:101470008093E8000F900F900F90DF91CF91089527\r
+:101480002091EC012430F1F422E02093E9002FEFC9\r
+:101490003091E800215035FD06C035ED3A95F1F761\r
+:1014A00000002111F5CF2091E80025FF0BC040E09E\r
+:1014B00050E065E070E00E94430C8091E8008E7778\r
+:1014C0008093E8000895CF93DF93EC018091EC01C5\r
+:1014D000843009F046C090910C019923D9F0909185\r
+:1014E0000D019923B9F08093E9008FEF9091E80006\r
+:1014F000815095FD06C095E19A95F1F700008111A4\r
+:10150000F5CF8091E80085FF2CC040E050E060E11D\r
+:1015100070E017C081E08093E9008FEF9091E800C0\r
+:10152000815095FD06C095ED9A95F1F70000811167\r
+:10153000F5CF8091E80085FF14C040E050E068E0FE\r
+:1015400070E0CE010E94430C8091E8008E7780937A\r
+:10155000E80080E1FE01AAE5B1E001900D928A95D4\r
+:10156000E1F7DF91CF9108958091EB01811109C0DE\r
+:101570000E94D50D0E94320E8091E200846080931B\r
+:10158000E20008951092EB01089508950C948E23C3\r
+:101590000E94011D0E9494230E94CF100C94D40934\r
+:1015A00042E061EC81E00E944F0D42E061EC82E09C\r
+:1015B0000E944F0D42E061EC83E00E944F0D42E13A\r
+:1015C00061EC84E00C944F0D8091EE01833009F4BE\r
+:1015D00055C030F4813071F0823009F48EC0089526\r
+:1015E0008A3009F47AC08B3009F460C0893009F080\r
+:1015F0009CC020C08091ED01813A09F096C0809195\r
+:10160000E800877F8093E8008091F1019091F201DA\r
+:10161000892B21F060E080E090E003C060E18AE582\r
+:1016200091E070E00E948C0C8091E8008B778093B1\r
+:10163000E80008958091ED01813209F076C0809133\r
+:10164000F1019091F201009719F0039709F06DC034\r
+:101650008091E800877F8093E8008091E80082FD18\r
+:1016600005C08091EC018111F8CF5FC08091F1003D\r
+:1016700080936A018091E8008B7753C08091ED01DF\r
+:10168000813A09F052C08091F1019091F201892BC9\r
+:1016900009F04BC08091E800877F8093E80080913B\r
+:1016A000E80080FFFCCF80910C0136C08091ED01F5\r
+:1016B0008132D9F58091F1019091F201892BA9F540\r
+:1016C0008091E800877F8093E8000E94840D8091DC\r
+:1016D000EF0180930C010C9452168091ED01813240\r
+:1016E00021F58091E800877F8093E8000E94840DB7\r
+:1016F0008091F00180936B0108958091ED01813A12\r
+:10170000A1F48091E800877F8093E8008091E80051\r
+:1017100080FFFCCF80916B018093F1008091E80005\r
+:101720008E778093E8000C94840D089584B7877FAA\r
+:1017300084BF88E10FB6F894809360001092600037\r
+:101740000FBE90E080E80FB6F8948093610090930C\r
+:1017500061000FBE0E941E110E94D50D0E94320E24\r
+:101760008091E20084608093E20078940E94AD1042\r
+:101770000E94201182E091E00E94CA100E947C2306\r
+:101780008091EC01853069F40E94C11C8091EA01CE\r
+:101790008823B1F30E94EC1C882391F30E942D0C46\r
+:1017A000EFCF0E942611ECCF292F332723303105AC\r
+:1017B000A9F06CF42130310509F442C02230310522\r
+:1017C00009F043C08DE690E024EF33E042C02132BF\r
+:1017D0003105C9F02232310519F137C0992781301E\r
+:1017E000910541F08230910541F0892B71F5E0EFD0\r
+:1017F000F3E005C0E8EDF3E002C0E0ECF3E0849133\r
+:1018000090E09F0126C0643000F5E62FF0E0EE0F77\r
+:10181000FF1FEE5DFE4F2081318189E090E019C00D\r
+:10182000643098F4E62FF0E0DF01AA0FBB1FA65E3C\r
+:10183000BE4F2D913C91EA5EFE4F808190E009C041\r
+:1018400082E190E021E634E004C080E090E020E016\r
+:1018500030E0FA0131832083089580E189BD82E17F\r
+:1018600089BD09B400FEFDCF8091D8008F7D8093A3\r
+:10187000D8008091E00082608093E0008091E000D9\r
+:1018800081FDFCCF0895CF92DF92EF92FF920F93EC\r
+:101890001F93CF93DF937C018B01EA010E94A50D7A\r
+:1018A000811131C0209731F088819981081B190B73\r
+:1018B000E80EF91EC12CD12C0115110519F18091EA\r
+:1018C000E80085FD14C08091E8008E778093E800E1\r
+:1018D000209741F0888199818C0D9D1D9983888383\r
+:1018E00085E011C00E94A50D882331F30CC0F701DB\r
+:1018F00081917F018093F10001501109FFEFCF1A10\r
+:10190000DF0ADACF80E0DF91CF911F910F91FF9036\r
+:10191000EF90DF90CF9008952091F3013091F40182\r
+:101920002617370748F06115710539F42091E80052\r
+:101930002E772093E80001C0B901FC0120E0611579\r
+:101940007105B9F18091EC01882309F440C085301C\r
+:1019500009F43FC08091E80083FD3DC08091E8001C\r
+:1019600082FF06C08091E80082FF26C080E00895D3\r
+:101970008091E80080FFE3CF2091F3008091F20096\r
+:1019800090E0922B6115710551F08830910538F483\r
+:1019900021912093F100615071090196F3CF21E06C\r
+:1019A000089709F020E08091E8008E778093E800A6\r
+:1019B000C6CF2111C7CFD6CF8091EC01882339F053\r
+:1019C000853039F08091E80083FFCCCF04C082E0FD\r
+:1019D000089583E0089581E008952091F301309106\r
+:1019E000F4012617370748F06115710539F4209185\r
+:1019F000E8002E772093E80001C0B901FC0120E047\r
+:101A000061157105C1F18091EC01882309F441C091\r
+:101A1000853009F440C08091E80083FD3EC080918C\r
+:101A2000E80082FF06C08091E80082FF27C080E0C6\r
+:101A300008958091E80080FFE3CF2091F30080912A\r
+:101A4000F20090E0922B6115710559F088309105F4\r
+:101A500040F424912093F100319661507109019670\r
+:101A6000F2CF21E0089709F020E08091E8008E771E\r
+:101A70008093E800C5CF2111C6CFD5CF8091EC016E\r
+:101A8000882339F0853039F08091E80083FFCBCF8F\r
+:101A900004C082E0089583E0089581E00895982FBE\r
+:101AA000973058F59093E900981739F07091EC0051\r
+:101AB0002091ED005091F00003C0242F762F50E0CC\r
+:101AC00021FF19C03091EB003E7F3093EB00309145\r
+:101AD000ED003D7F3093ED003091EB0031603093AD\r
+:101AE000EB007093EC002093ED005093F0002091F8\r
+:101AF000EE0027FF07C09F5FD3CF8F708093E90070\r
+:101B000081E0089580E008958091ED0187FD05C092\r
+:101B10008091E80080FF0EC012C08091E80082FD35\r
+:101B200005C08091EC018111F8CF08958091E80003\r
+:101B30008B7708C08091EC018111EACF08958091E4\r
+:101B4000E8008E778093E80008958091E4009091FA\r
+:101B5000E50045E62091EC0020FF21C02091E8003F\r
+:101B600020FD21C02091EC01222389F0253089F04D\r
+:101B70002091EB0025FD0FC02091E4003091E5009D\r
+:101B80002817390739F3415041F0C901E3CF82E00A\r
+:101B9000089583E0089581E0089584E008952091F8\r
+:101BA000E80022FFDFCF80E008950E94430E0E94EC\r
+:101BB0004B0EE0EEF0E0808181608083E8EDF0E0A4\r
+:101BC00080818F77808319BCA7EDB0E08C918E7FE8\r
+:101BD0008C9380818F7E80831092EB0108950F9308\r
+:101BE0001F93CF93DF930E94430E0E944B0EC8EDCC\r
+:101BF000D0E088818F778883888180688883888116\r
+:101C00008F7D888319BC1092EC011092E80110922C\r
+:101C1000EA011092E90100EE10E0F80180818B7F6B\r
+:101C2000808388818160888342E060E080E00E9458\r
+:101C30004F0DE1EEF0E080818E7F8083E2EEF0E0F8\r
+:101C4000808181608083808188608083F8018081C9\r
+:101C50008E7F8083888180618883DF91CF911F91FF\r
+:101C60000F910895E8EDF0E080818F7E8083E7EDAD\r
+:101C7000F0E080818160808384E082BF81E0809396\r
+:101C8000EB010C94EF0DE8EDF0E080818E7F808316\r
+:101C90001092E20008951092DA001092E100089587\r
+:101CA0001F920F920FB60F9211242F933F934F93D1\r
+:101CB0005F936F937F938F939F93AF93BF93EF93B4\r
+:101CC000FF938091E10082FF0BC08091E20082FFD0\r
+:101CD00007C08091E1008B7F8093E1000E94AC10EF\r
+:101CE0008091DA0080FF1FC08091D80080FF1BC068\r
+:101CF0008091DA008E7F8093DA008091D90080FF96\r
+:101D00000DC080E189BD82E189BD09B400FEFDCF2F\r
+:101D100081E08093EC010E94B40A05C019BC1092C6\r
+:101D2000EC010E94C20A8091E10080FF19C08091FD\r
+:101D3000E20080FF15C08091E2008E7F8093E20078\r
+:101D40008091E20080618093E2008091D8008062FF\r
+:101D50008093D80019BC85E08093EC010E94C60AEC\r
+:101D60008091E10084FF30C08091E20084FF2CC0AC\r
+:101D700080E189BD82E189BD09B400FEFDCF80917B\r
+:101D8000D8008F7D8093D8008091E1008F7E809372\r
+:101D9000E1008091E2008F7E8093E2008091E2007A\r
+:101DA00081608093E2008091E801882311F084E053\r
+:101DB00007C08091E30087FF02C083E001C081E09B\r
+:101DC0008093EC010E94C80A8091E10083FF29C042\r
+:101DD0008091E20083FF25C08091E100877F80939E\r
+:101DE000E10082E08093EC011092E8018091E10033\r
+:101DF0008E7F8093E1008091E2008E7F8093E200ED\r
+:101E00008091E20080618093E20042E060E080E047\r
+:101E10000E944F0D8091F00088608093F0000E9436\r
+:101E2000C50AFF91EF91BF91AF919F918F917F91E3\r
+:101E30006F915F914F913F912F910F900FBE0F9037\r
+:101E40001F9018951F920F920FB60F9211242F9387\r
+:101E50003F934F935F936F937F938F939F93AF9332\r
+:101E6000BF93CF93EF93FF93C091E900CF70809120\r
+:101E7000EC001092E9008091F000877F8093F000E1\r
+:101E800078940E945E0F1092E9008091F0008860C3\r
+:101E90008093F000C093E900FF91EF91CF91BF9143\r
+:101EA000AF919F918F917F916F915F914F913F91F2\r
+:101EB0002F910F900FBE0F901F9018951F93CF93E7\r
+:101EC000DF93CDB7DEB7AA970FB6F894DEBF0FBE8B\r
+:101ED000CDBFEDEEF1E08091F100819321E0E53F8F\r
+:101EE000F207C9F70E94E40A8091E80083FF1CC151\r
+:101EF0002091ED013091EE01832F90E08A30910521\r
+:101F000008F012C1FC01EC59FF4F0C941625203843\r
+:101F100081F0223809F008C18091F1018F7080931F\r
+:101F2000E9008091EB0085FB882780F91092E90099\r
+:101F300006C08091E9019091EA019111826090912F\r
+:101F4000E800977F9093E8008093F1001092F100F1\r
+:101F5000C5C0822F8D7F09F0E7C0222319F02230FF\r
+:101F600061F0E2C08091EF01813009F0DDC03330D3\r
+:101F700009F080E08093EA0128C08091EF0181118F\r
+:101F800024C02091F1012F7009F4CEC02093E90004\r
+:101F90008091EB0080FF19C08091EB00333011F489\r
+:101FA000806211C080618093EB0081E090E0022E9E\r
+:101FB00001C0880F0A94EAF78093EA001092EA00C1\r
+:101FC0008091EB0088608093EB001092E900809193\r
+:101FD000E800877F86C02111A7C01091EF011F770D\r
+:101FE0008091E3008078812B8093E3008091E8006A\r
+:101FF000877F8093E8000E94840D8091E80080FF35\r
+:10200000FCCF8091E30080688093E300112311F0FE\r
+:1020100083E001C082E08093EC0186C0205822302A\r
+:1020200008F082C08091EF019091F0018C3D23E097\r
+:10203000920779F583E08A838AE289834FB7F8941F\r
+:10204000DE01139620E03EE051E2E32FF0E05093F2\r
+:102050005700E49120FF03C0E295EF703F5FEF70FF\r
+:102060008E2F90E0EA3010F0C79601C0C0968D9395\r
+:102070009D932F5F243149F74FBF8091E800877F00\r
+:102080008093E8006AE270E0CE0101960E948C0C19\r
+:1020900014C0AE014F5F5F4F6091F1010E94D40BFD\r
+:1020A000009709F441C02091E800277F2093E800C1\r
+:1020B000BC0189819A810E94ED0C8091E8008B77A8\r
+:1020C0008093E80031C0203879F58091E800877F5F\r
+:1020D0008093E8008091E8018093F1008091E8000E\r
+:1020E0008E778093E8000E94840D1EC021111CC0D1\r
+:1020F0009091EF019230C0F48091E800877F809347\r
+:10210000E8009093E8010E94840D8091E80181111C\r
+:1021100004C08091E30087FF02C084E001C081E039\r
+:102120008093EC010E94D00A8091E80083FF0AC0EE\r
+:102130008091E800877F8093E8008091EB008062C7\r
+:102140008093EB00AA960FB6F894DEBF0FBECDBF0A\r
+:10215000DF91CF911F9108950895CF938091EC0165\r
+:102160008823B1F08091E9008F709091EC0090FF8E\r
+:1021700002C090E801C090E0C92FC82B1092E9007E\r
+:102180008091E80083FD0E945E0FCF70C093E9004C\r
+:10219000CF91089590937101809370010895E0911B\r
+:1021A0007001F0917101309721F00190F081E02DE4\r
+:1021B000099480E00895E0917001F09171013097E9\r
+:1021C00021F00280F381E02D09940895E0917001DF\r
+:1021D000F0917101309721F00480F581E02D099490\r
+:1021E000089520916E0130916F018217930771F06D\r
+:1021F00090936F0180936E01E0917001F0917101F5\r
+:10220000309721F00680F781E02D09940895209100\r
+:102210006C0130916D018217930771F090936D01FD\r
+:1022200080936C01E0917001F0917101309721F081\r
+:102230000084F185E02D0994089508950C941D11F2\r
+:102240000E94071D0E94F0050C94CD1DCF92DF92D5\r
+:10225000EF92FF920F931F93CF93DF93CDB7DEB72B\r
+:102260002B970FB6F894DEBF0FBECDBF0E940806B5\r
+:1022700033E7E32E31E0F32E00E010E0C02E802F94\r
+:102280000E94F506F701D1907F01D826B1F40F5FC7\r
+:102290001F4F0E30110591F78FEF89838A831B82C0\r
+:1022A0000E94101D8160782F9D838C8349815A8103\r
+:1022B0006B818D810E94C91141C09091D50191FF20\r
+:1022C00004C08B870E94FB068B8520E030E04D2DFB\r
+:1022D00050E0922FBA01022E02C0759567950A94BC\r
+:1022E000E2F760FF25C02E83CF82EE24E394F12C29\r
+:1022F00002C0EE0CFF1C9A95E2F790E08E219F2120\r
+:1023000021E0892B09F420E028870E94101D8160BC\r
+:10231000782F9A8789874E815F8168858A850E9498\r
+:10232000C911F801ED58FE4F80818E25808306C0CB\r
+:102330002F5F3F4F2630310561F6A9CF0E94B120B3\r
+:10234000109172010E94CF101817A1F00E94CF10B7\r
+:10235000809372012B960FB6F894DEBF0FBECDBFEF\r
+:10236000DF91CF911F910F91FF90EF90DF90CF9071\r
+:102370000C94D4092B960FB6F894DEBF0FBECDBFD8\r
+:10238000DF91CF911F910F91FF90EF90DF90CF9051\r
+:102390000895CF93DF93CDB7DEB72B970FB6F894A0\r
+:1023A000DEBF0FBECDBF4F83588769877A878B8783\r
+:1023B000DE01119686E0FD0111928A95E9F785E02C\r
+:1023C000FE01379601900D928A95E1F749815A8175\r
+:1023D0006B817C818D819E810E941E192B960FB688\r
+:1023E000F894DEBF0FBECDBFDF91CF910895089561\r
+:1023F000CF93C82F882309F4C1C0823859F40E94B2\r
+:10240000CF1081FDBBC089E30E94C81B0E94921CB3\r
+:1024100089E30CC0833879F40E94CF1080FDAEC0F0\r
+:1024200083E50E94C81B0E94921C83E50E94081C41\r
+:10243000CF910C94921C843859F40E94CF1082FDE5\r
+:102440009DC087E40E94C81B0E94921C87E4EECFC7\r
+:102450008CEF8C0F813A48F48C2F0E94E42281117A\r
+:102460008DC08C2F0E94C81BE3CF80E28C0F883078\r
+:1024700048F4C77081E001C0880FCA95EAF70E944E\r
+:10248000491CD6CF8BE58C0F833078F4C53A29F000\r
+:10249000C63A31F482E890E005C081E890E002C0DD\r
+:1024A00083E890E0CF910C94F11088E58C0F833194\r
+:1024B00008F064C0C83A39F1C93A41F1CA3A49F161\r
+:1024C000CB3A51F1CC3A59F1CD3A61F1C03B69F1C7\r
+:1024D000CE3A71F1CF3A79F1C13B81F1C23B89F13A\r
+:1024E000C33B91F1C43B99F1C53BA1F1C63BA9F1B6\r
+:1024F000C73BB1F1C83BB9F1C93BC1F1CA3BC9F512\r
+:102500008AE292E038C082EE90E035C089EE90E039\r
+:1025100032C08AEE90E02FC085EB90E02CC086EBB5\r
+:1025200090E029C087EB90E026C08CEC90E023C0BF\r
+:102530008DEC90E020C083E891E01DC08AE891E036\r
+:102540001AC082E991E017C084E991E014C081E2E9\r
+:1025500092E011C083E292E00EC084E292E00BC0F0\r
+:1025600085E292E008C086E292E005C087E292E050\r
+:1025700002C080E090E0CF910C940711CF910895B4\r
+:10258000882309F44BC0823859F40E94CF1081FF90\r
+:1025900045C089E30E94C81B0E94921C89E30CC0BD\r
+:1025A000833871F40E94CF1080FF38C083E50E9409\r
+:1025B000C81B0E94921C83E50E94081C0C94921C6C\r
+:1025C000843859F40E94CF1082FF28C087E40E940B\r
+:1025D000C81B0E94921C87E4EFCF9CEF980F913AA2\r
+:1025E00058F390E2980F983050F4877091E001C052\r
+:1025F000990F8A95EAF7892F0E944F1CDFCF9BE540\r
+:10260000980F933020F480E090E00C94F110885AF9\r
+:10261000833120F480E090E00C9407110895882322\r
+:1026200021F00E94491C0C94921C0895882321F0EB\r
+:102630000E944F1C0C94921C0895CF92DF92EF924F\r
+:10264000FF920F931F93CF93DF93CDB7DEB72897F9\r
+:102650000FB6F894DEBF0FBECDBF8C0185E0F80148\r
+:10266000DE01119601900D928A95E1F7F801D08074\r
+:10267000E180F280558152955F7023813481232B54\r
+:1026800039F0FFEFEF1206C081E0DF1203C003C094\r
+:1026900081E001C080E080FDE2C2C8015F830E944A\r
+:1026A000F711D982EA8269817A818F2D0E94C41B39\r
+:1026B0009E8388870E94781B0E944B1A4E815F81FF\r
+:1026C0006885FF2029F00E94661C68855F814E8125\r
+:1026D000E42FE295EF70F0E0E259FF4F0C941625DD\r
+:1026E000842F807F142F1F70882311F01295107F84\r
+:1026F000FF20B1F0112309F467C280E2860F883011\r
+:1027000028F4812F68870E94491C04C0812F6887A4\r
+:102710000E94591C688568870E94921C688554C273\r
+:10272000862F68870E94C0126885112309F497C21A\r
+:10273000605E812F683018F40E944F1C02C00E9416\r
+:102740005F1C28960FB6F894DEBF0FBECDBFDF9199\r
+:10275000CF911F910F91FF90EF90DF90CF900C944D\r
+:10276000921C242F207F842F8F70203211F08295AD\r
+:10277000807F662319F0613019F12BC0FF20B1F082\r
+:10278000552309F493C1513009F090C128960FB632\r
+:10279000F894DEBF0FBECDBFDF91CF911F910F9197\r
+:1027A000FF90EF90DF90CF900C94791C552319F097\r
+:1027B000513009F454C28E830E947C1C8E8189C1E1\r
+:1027C000FF2021F0523008F04AC270C1511147C2B7\r
+:1027D00080C1FF2021F0552309F468C1F5C15523BC\r
+:1027E00009F477C105C2242F26952695237030E081\r
+:1027F0002115310521F021303105C9F030C2FF200B\r
+:1028000021F0862F942F937002C080E090E02896EC\r
+:102810000FB6F894DEBF0FBECDBFDF91CF911F91F1\r
+:102820000F91FF90EF90DF90CF900C94F110FF206C\r
+:1028300021F0862F942F937002C080E090E02896BC\r
+:102840000FB6F894DEBF0FBECDBFDF91CF911F91C1\r
+:102850000F91FF90EF90DF90CF900C940711862F8F\r
+:10286000FF2019F00E94B91F02C00E942120289663\r
+:102870000FB6F894DEBF0FBECDBFDF91CF911F9191\r
+:102880000F91FF90EF90DF90CF900C94A620842FB3\r
+:10289000837009F076C0F110E2C1262F22952695AB\r
+:1028A0002770220F220F862F8F70C82ED12CE12C7B\r
+:1028B000F12C022E04C0CC0CDD1CEE1CFF1C0A9473\r
+:1028C000D2F764FF10C06FE070E080E090E004C0D9\r
+:1028D000660F771F881F991F2A95D2F7609570950C\r
+:1028E0008095909503C060E070E0CB01242F269581\r
+:1028F00026952370422F50E042305105D1F04330ED\r
+:10290000510559F16C297D298E299F2941305105A6\r
+:1029100041F128960FB6F894DEBF0FBECDBFDF9110\r
 :10292000CF911F910F91FF90EF90DF90CF900C947B\r
-:10293000851A603FC9F118F4603E50F49BC0623FB5\r
-:1029400009F460C008F44AC0633F09F46FC092C044\r
-:10295000162F1F70842F8F71FF2099F00E941E1A6E\r
-:10296000812F28960FB6F894DEBF0FBECDBFDF9142\r
+:10293000701A6C297D298E299F2928960FB6F89444\r
+:10294000DEBF0FBECDBFDF91CF911F910F91FF90E2\r
+:10295000EF90DF90CF900C948A1A0E94701AC701F2\r
+:10296000B60128960FB6F894DEBF0FBECDBFDF913B\r
 :10297000CF911F910F91FF90EF90DF90CF900C942B\r
-:1029800082120E943F1A812F28960FB6F894DEBF5C\r
-:102990000FBECDBFDF91CF911F910F91FF90EF90B0\r
-:1029A000DF90CF900C948912FF20A1F02111B2C0CA\r
-:1029B000842F8F7128960FB6F894DEBF0FBECDBF5F\r
-:1029C000DF91CF911F910F91FF90EF90DF90CF900B\r
-:1029D0000C94641A223008F09DC0EACFFF20A1F0C9\r
-:1029E000842F8F7128960FB6F894DEBF0FBECDBF2F\r
-:1029F000DF91CF911F910F91FF90EF90DF90CF90DB\r
-:102A00000C941E1AFF2061F3842F8F7128960FB645\r
+:10298000561AFF2019F0842F817001C08695882384\r
+:1029900009F465C1262F229526952770220F220F54\r
+:1029A000862F8F70C82ED12CE12CF12C022E04C062\r
+:1029B000CC0CDD1CEE1CFF1C0A94D2F764FF10C087\r
+:1029C0006FE070E080E090E004C0660F771F881F22\r
+:1029D000991F2A95D2F7609570958095909503C0C0\r
+:1029E00060E070E0CB01242F269526952370422FBE\r
+:1029F00050E042305105D1F04330510559F16C2976\r
+:102A00007D298E299F294130510541F128960FB625\r
 :102A1000F894DEBF0FBECDBFDF91CF911F910F9114\r
-:102A2000FF90EF90DF90CF900C943F1AFF2091F031\r
-:102A3000842F8F7128960FB6F894DEBF0FBECDBFDE\r
+:102A2000FF90EF90DF90CF900C94441B6C297D2990\r
+:102A30008E299F2928960FB6F894DEBF0FBECDBF12\r
 :102A4000DF91CF911F910F91FF90EF90DF90CF908A\r
-:102A50000C94091A28960FB6F894DEBF0FBECDBFAE\r
-:102A6000DF91CF911F910F91FF90EF90DF90CF906A\r
-:102A70000C94FF19FF20A1F0222309F4B1CF862F77\r
-:102A800028960FB6F894DEBF0FBECDBFDF91CF9171\r
-:102A90001F910F91FF90EF90DF90CF900C946B11EE\r
-:102AA000222309F4B1CF862F28960FB6F894DEBF03\r
-:102AB0000FBECDBFDF91CF911F910F91FF90EF908F\r
-:102AC000DF90CF900C9433124F70C8010E94A50480\r
-:102AD00028960FB6F894DEBF0FBECDBFDF91CF9121\r
-:102AE0001F910F91FF90EF90DF90CF900C942619DB\r
-:102AF0004F70C80128960FB6F894DEBF0FBECDBF49\r
-:102B0000DF91CF911F910F91FF90EF90DF90CF90C9\r
-:102B10000C94EA0728960FB6F894DEBF0FBECDBF1F\r
-:102B2000DF91CF911F910F91FF90EF90DF90CF90A9\r
-:102B300008950E94B41B0E94C41B0E94891B0E941E\r
-:102B4000E01B0E94F0200E94442080E090E00E9460\r
-:102B5000651080E090E00C947B100E94A41B0C9404\r
-:102B600099150E94D41A292F22952F7030E02C300D\r
-:102B700031054CF42A3031056CF4225031092230F1\r
-:102B8000310590F407C02C30310551F02F3031055C\r
-:102B900039F00AC0803E10F0803F31F481E00895A2\r
-:102BA00093FB882780F9089580E00895CF93DF9301\r
-:102BB00000D000D01F92CDB7DEB70F900F900F90CE\r
-:102BC0000F900F90DF91CF910895CF93DF9300D0B6\r
-:102BD00000D000D0CDB7DEB726960FB6F894DEBF92\r
-:102BE0000FBECDBFDF91CF9108951F93CF93DF9399\r
-:102BF000C091790116E080917A01C81799F0D0E070\r
-:102C00001C9FF0011D9FF00D1124E558FE4F4081DF\r
-:102C1000518162817381848195810E94E51521969D\r
-:102C2000C770E9CFDF91CF911F9108954091AB011B\r
-:102C30005091AC016091AD017091AE018091AF01F6\r
-:102C40009091B0010C94E515CF938091B0018295DD\r
-:102C50008F7009F05FC08091AD01882309F45AC0DC\r
-:102C600020917901A0917A016091AB017091AC0142\r
-:102C70008091AE019091AF0131E06F3F09F030E0FB\r
-:102C8000B32FC6E02A1709F445C0009721F07F3F13\r
-:102C900021F44B2F03C041E001C040E030E040FD93\r
-:102CA00035C0C29FF001C39FF00D1124E558FE4FBF\r
-:102CB000418174132BC04081641328C042814111AB\r
-:102CC00025C0438154814817590710F441505109D8\r
-:102CD000481B590B483C5105C8F48091B0018F70D6\r
-:102CE00080618093B00186E0829FF001839FF00DA8\r
-:102CF0001124E058FE4F80818F70806180838BEAC1\r
-:102D000091E00E949012CF910C94F5152F5F3F4FE8\r
-:102D10002770B8CFCF910895CF92DF92EF92FF92B4\r
-:102D20000F931F93CF93DF93CDB7DEB762970FB6A4\r
-:102D3000F894DEBF0FBECDBF8C0185E0F801DE0147\r
-:102D40001D9601900D928A95E1F7D8014C9111964C\r
-:102D50005C91119712966C9112971396ED90FC90DE\r
-:102D600014977091AB01E091AC012091AE013091CC\r
-:102D7000AF012115310531F0EF3F31F481E07F3FA4\r
-:102D800019F403C081E001C080E0B82FB170CB2EF0\r
-:102D900080FD6CC1D090AD01DD2009F4F5C0F0914B\r
-:102DA000B001E216F30638F0C701821B930B883C92\r
-:102DB000910548F09BC0209530952E0D3F1D283C75\r
-:102DC000310508F093C08F2F807F09F052C0E513C2\r
-:102DD00014C0741312C0D62E61110FC0FF70F061C1\r
-:102DE000F093B0010E9416168BEA91E00E949012B7\r
-:102DF0008091B001F80185836CC1EF2831F05F3F0D\r
-:102E000031F481E04F3F19F403C081E001C080E05C\r
-:102E100080FD03C081E0862701C080E0F82FF170BB\r
-:102E2000FF2E80FF1CC08091790120917A0136E04D\r
-:102E3000821709F428C190E0389FF001399FF00D06\r
-:102E40001124E558FE4F7181571306C07081471356\r
-:102E500003C07281671303C001968770E9CFD62E35\r
-:102E6000662309F436C18091B00181608093B0017E\r
-:102E700053C0E51308C0741306C0611104C0D80123\r
-:102E80001596FC93AEC04D875E878D859E856A8BB7\r
-:102E90000E94B1156A89882329F1D62E662311F183\r
-:102EA0002091B001822F82958F7090E002970CF4F0\r
-:102EB00060C08091AB019091AC0198878F83198697\r
-:102EC000FB86EA862C87CE01079651C0E51731F1C3\r
-:102ED0004D875E878D859E856A8B0E94B1156A89B4\r
-:102EE00081112EC0C8010E949012A4C08F2F807F34\r
-:102EF00069F77E2DF98AE88A89890E94D6158BEABE\r
-:102F000091E00E949012EBEAF1E086E0DF011D9271\r
-:102F10008A95E9F70E941616D12CDBC07413D8CF1E\r
-:102F20006111D6CFD8011596FC93C8010E9490126A\r
-:102F3000EBEAF1E086E0DF011D928A95E9F7C9C06E\r
-:102F4000D62E662379F22091B001822F82958F7060\r
-:102F500090E0029774F08091AB019091AC019A835C\r
-:102F600089831B82FD82EC822E83CE0101960E9412\r
-:102F7000901286E0F801ABEAB1E001900D928A95DB\r
-:102F8000E1F70E9424166FC0E216F30628F0C7018D\r
-:102F9000821B930B9C0104C0209530952E0D3F1D84\r
-:102FA000283C310508F052C0D62E662309F49ACF8A\r
-:102FB000E5132CC074132AC08091B00180FD1DC0A0\r
-:102FC000982F92959F70C9F0D80115968C931597FC\r
-:102FD0009F3039F09F5F9295907F8F70892B159667\r
-:102FE0008C93C8010E94901286E0F801ABEAB1E030\r
-:102FF00001900D928A95E1F736C086E0F801ABEAC0\r
-:10300000B1E001900D928A95E1F763C04D875E872C\r
-:103010008D859E850E94B115882379F086E0F801A0\r
-:10302000ABEAB1E001900D928A95E1F70E94241677\r
-:103030000E941616DD24D3944CC08091B0018160AB\r
-:103040008093B001C8010E94901243C07E2DF98A7E\r
-:10305000E88A89890E94D615EBEAF1E086E0DF0173\r
-:103060001D928A95E9F70E94161633C0662309F46B\r
-:1030700039CF4D875E878D859E850E94B115882347\r
-:1030800009F430CFCBCF4D875E878D859E850E941A\r
-:10309000D41A292F22952F7030E0223031052CF4DC\r
-:1030A0009F7041F0811106C00CC0243031052CF412\r
-:1030B0009F7049F4805E883020F0C8010E94901211\r
-:1030C000CF2CDC2C06C0D80115969C91907F91F7EF\r
-:1030D000F8CF8D2D62960FB6F894DEBF0FBECDBF30\r
-:1030E000DF91CF911F910F91FF90EF90DF90CF90E4\r
-:1030F00008951F93CF93DF93CDB7DEB72C970FB60C\r
-:10310000F894DEBF0FBECDBF4F83588769877A879B\r
-:103110008B879C87CE0107960E948C168823C1F06E\r
-:103120002F8138858A859B85892B31F03F3F11F0AF\r
-:1031300080E003C02F3FE1F781E0811147C04F815C\r
-:10314000588569857A858B859C850E94E5153EC0EA\r
-:1031500086E0FE013796DE01119601900D928A9568\r
-:10316000E1F7FF81E8854A855B854115510531F01E\r
-:10317000EF3F31F481E0FF3F19F403C081E001C06B\r
-:1031800080E080FD23C020917A0130E0C9010196E2\r
-:10319000877099276091790170E086179707F1F1A0\r
-:1031A000F983EA835D834C8396E0929FD001939FDD\r
-:1031B000B00D1124A558BE4FFE01319601900D921D\r
-:1031C0009A95E1F780937A010E94F51516E08091B7\r
-:1031D000790190917A01891779F1189FC001112422\r
-:1031E00085589E4F0E948C16882331F1E091790119\r
-:1031F0001E9FF0011124E558FE4F408151816281EC\r
-:103200007381848195810E94E5158091790190E018\r
-:1032100001968770992780937901D9CF0E94AD15C7\r
-:1032200010927A0110927901EBEAF1E086E0DF0179\r
-:103230001D928A95E9F7CACF2C960FB6F894DEBF97\r
-:103240000FBECDBFDF91CF911F910895EF92FF92F6\r
-:103250000F931F93CF93DF93FC01009709F46FC086\r
-:10326000F12CEE24E394EF0121968491843740F40D\r
-:10327000843008F055C0813081F0823021F15FC088\r
-:10328000853709F447C0C0F19CE7980F903708F0E4\r
-:1032900056C08F770E94331245C08F010E5F1F4FBB\r
-:1032A000FE01849190E2980F983050F48770FE2DC3\r
-:1032B00001C0FF0F8A95EAF78F2F0E94B71B15C038\r
-:1032C0000E946B1114C08F010E5F1F4FFE0184918D\r
-:1032D00090E2980F983068F48770FE2D01C0FF0FC0\r
-:1032E0008A95EAF78F2F0E94BD1B0E94E01BE80120\r
-:1032F00019C00E943312FBCFCF010296FE01C49188\r
-:10330000CC2361F0EFE9FFE03197F1F700C0000056\r
-:10331000C150F6CFCF010296FE01F490EC0102C03D\r
-:103320000E946B118F2D882341F0EFE9FFE0319768\r
-:10333000F1F700C000008150F6CFFE0194CFDF917D\r
-:10334000CF911F910F91FF90EF9008950895609392\r
-:10335000B5017093B6018093B7019093B8010C94B6\r
-:1033600099150F931F930091B5011091B60120910B\r
-:10337000B7013091B801062B172B282B392B00935E\r
-:10338000B5011093B6012093B7013093B8011F9196\r
-:103390000F910C9499150F931F930091B501109103\r
-:1033A000B6012091B7013091B801062317232823D5\r
-:1033B00039230093B5011093B6012093B7013093E0\r
-:1033C000B8011F910F910C9499150F931F930091C1\r
-:1033D000B5011091B6012091B7013091B8010627CF\r
-:1033E0001727282739270093B5011093B60120939A\r
-:1033F000B7013093B8011F910F910C949915109259\r
-:10340000B1011092B2011092B3011092B4010C9468\r
-:10341000991541E050E060E070E004C0440F551F92\r
-:10342000661F771F8A95D2F74093B1015093B2017E\r
-:103430006093B3017093B4010C94991541E050E08E\r
-:1034400060E070E004C0440F551F661F771F8A9527\r
-:10345000D2F78091B1019091B201A091B301B091E6\r
-:10346000B401842B952BA62BB72B8093B10190939D\r
-:10347000B201A093B301B093B4010C94991541E04B\r
-:1034800050E060E070E004C0440F551F661F771FD6\r
-:103490008A95D2F740955095609570958091B101CD\r
-:1034A0009091B201A091B301B091B401842395230E\r
-:1034B000A623B7238093B1019093B201A093B301E7\r
-:1034C000B093B4010C94991541E050E060E070E0D5\r
-:1034D00004C0440F551F661F771F8A95D2F780914D\r
-:1034E000B1019091B201A091B301B091B4018427D0\r
-:1034F0009527A627B7278093B1019093B201A09397\r
-:10350000B301B093B4010C9499150F931F930091DC\r
-:10351000B1011091B2012091B3013091B401062B99\r
-:10352000172B282B392B0093B1011093B201209354\r
-:10353000B3013093B4011F910F910C9499150F931F\r
-:103540001F930091B1011091B2012091B30130910C\r
-:10355000B40106231723282339230093B1011093C4\r
-:10356000B2012093B3013093B4011F910F910C94D9\r
-:1035700099150F931F930091B1011091B201209101\r
-:10358000B3013091B4010627172728273927009364\r
-:10359000B1011093B2012093B3013093B4011F9194\r
-:1035A0000F910C9499150895CF92DF92EF92FF92AC\r
-:1035B0000F931F93CF93DF93EC01C090B501D09090\r
-:1035C000B601E090B701F090B8018091B1019091FF\r
-:1035D000B201A091B301B091B401C82AD92AEA2A54\r
-:1035E000FB2A0FE110E0B701A601002E04C076957A\r
-:1035F0006795579547950A94D2F740FF07C0BE01DB\r
-:10360000802F0E940D088130910539F40150110975\r
-:1036100050F7BE0180E00E940D08DF91CF911F910D\r
-:103620000F91FF90EF90DF90CF90089590910C0153\r
-:103630009923D9F090910D019923B9F0982F96957F\r
-:10364000969596959F3088F5E0910E01F0910F01C7\r
-:10365000E90FF11D877021E030E001C0220F8A954B\r
-:10366000EAF78181822B8183089540910E01509168\r
-:103670000F0120E030E09FEFFA01E20FF31F6281BB\r
-:10368000681799F09F3F19F4611101C0922F2F5FC5\r
-:103690003F4F2E30310581F79F3F39F0FA01E90F96\r
-:1036A000F11D97FDFA9582830895089590910C017C\r
-:1036B0009923E1F090910D019923C1F0982F9695EF\r
-:1036C000969596959F3020F5E0910E01F0910F01AF\r
-:1036D000E90FF11D877021E030E001C0220F8A95CB\r
-:1036E000EAF72095818128232183089540910E01D6\r
-:1036F00050910F0120E030E0FA01E20FF31F9281B8\r
-:10370000981301C012822F5F3F4F2E303105A1F771\r
-:10371000089581E090E0E0910E01F0910F01E80F33\r
-:10372000F91F1082019680319105A9F708959091B3\r
-:10373000CC01982B9093CC01089580959091CC0169\r
-:1037400098239093CC0108951092CC010895909104\r
-:10375000CB01982B9093CB01089580959091CB014C\r
-:1037600098239093CB0108951092CB0108959091E6\r
-:10377000CA01982B9093CA01089580959091CA012F\r
-:1037800098239093CA0108951092CA0108958093D6\r
-:10379000B90108951092B901089540910E01509118\r
-:1037A0000F0120E030E080E0FA01E20FF31F918189\r
-:1037B00091118F5F2F5F3F4F2F303105A9F708958B\r
-:1037C000E0910E01F0910F018091CC018083E09196\r
-:1037D0000E01F0910F0180819091CB01892B8083A4\r
-:1037E000E0910E01F0910F0180819091CA01892B27\r
-:1037F00080839091B901992361F0E0910E01F091DD\r
-:103800000F018081892B80830E94CD1B8111109232\r
-:10381000B90180910E0190910F010C944F10CF923D\r
-:10382000DF92EF92FF920F931F936C01EE24FF241F\r
-:10383000C114D104E104F10421F46B017C0180E0A6\r
-:1038400001C080E133272F2D1E2D0D2D01151105EF\r
-:103850002105310519F0885F68017901970186011A\r
-:10386000A4E03695279517950795AA95D1F70115E8\r
-:1038700011052105310519F08C5F68017901970167\r
-:103880008601F2E03695279517950795FA95D1F7B9\r
-:10389000011511052105310519F08E5F68017901C7\r
-:1038A000B701A6017695679557954795452B462B09\r
-:1038B000472B09F08F5F1F910F91FF90EF90DF90E2\r
-:1038C000CF9008958091E601843009F11092CE01E5\r
-:1038D00020E488E190E00FB6F894A895809360000A\r
-:1038E0000FBE2093600083B7817F846083BF83B75E\r
-:1038F000816083BF7894889583B78E7F83BF88E18A\r
-:103900000FB6F89480936000109260000FBE089587\r
-:1039100008950895CF930E94881C0E9437060E9444\r
-:10392000891CC0E08C2F0E942407811105C0CF5F45\r
-:10393000CE30C1F780E001C081E0CF9108950E94B0\r
-:10394000AD150E9443100C94480982E084BD93E0B9\r
-:1039500095BD9AEF97BD80936E0008952FB7F894A8\r
-:103960008091CF019091D001A091D101B091D2016D\r
-:103970002FBF0895CF92DF92EF92FF920F931F9384\r
-:103980002FB7F8944091CF015091D0016091D101AF\r
-:103990007091D2012FBF6A017B01EE24FF248C01BC\r
-:1039A00020E030E0C016D106E206F30610F44150E4\r
-:1039B0005109481B590BCA011F910F91FF90EF90BD\r
-:1039C000DF90CF9008951F920F920FB60F9211249F\r
-:1039D0008F939F93AF93BF938091CF019091D0012C\r
-:1039E000A091D101B091D2010196A11DB11D80938A\r
-:1039F000CF019093D001A093D101B093D201BF9198\r
-:103A0000AF919F918F910F900FBE0F901F901895BF\r
-:103A10000E94490DF8942FEF87EA91E621508040EB\r
-:103A20009040E1F700C0000087E090EBDC0180935C\r
-:103A3000EF019093F001A093F101B093F2012CE01B\r
-:103A400088E190E00FB6F894A895809360000FBECF\r
-:103A500020936000FFCFEF92FF920F931F93CF93BD\r
-:103A6000DF93E82EF12C8F2D0E942407C0E0D0E0D8\r
-:103A7000082F10E098010C2E02C0359527950A9466\r
-:103A8000E2F720FD05C02196C630D10599F709C09F\r
-:103A90006C2F7F2D80E00E94EB07E812F4CF81E0CD\r
-:103AA00005C0F3948EE0F812DECF80E0DF91CF9175\r
-:103AB0001F910F91FF90EF900895CF93C82F8CE244\r
-:103AC0000E942B1D882321F08C2FCF910C942B1D4D\r
-:103AD00080E0CF910895CF930E94B01E811102C063\r
-:103AE0000E94961EC5E6C15049F00E9437068FE33A\r
-:103AF0009CE90197F1F700C00000F5CF89E20E9430\r
-:103B00005D1D811111C18AE20E945D1D81110E941B\r
-:103B1000961E85E00E945D1D81110E94081D0E9475\r
-:103B2000BB1E8093CD0187E00E945D1D882399F123\r
-:103B30008BE10E945D1D882351F09091CD0191FB96\r
-:103B4000882780F921E0822780FB91F922C08EE04E\r
-:103B50000E945D1D882351F09091CD0192FB882732\r
-:103B600080F921E0822780FB92F913C080E10E9456\r
-:103B70005D1D9091CD01882341F093FB882780F94A\r
-:103B800021E0822780FB93F904C0892F809580FB78\r
-:103B900090F99093CD018091CD010E94BF1E0E94AB\r
-:103BA000CD1E8093E00180EE0E945D1D882341F0D0\r
-:103BB0008091E001982F909590FB80F98093E0012F\r
-:103BC00089E30E945D1D882359F09091E00191FBEB\r
-:103BD000882780F921E0822780FB91F99093E0010A\r
-:103BE00082EE0E945D1D882359F09091E00192FBC6\r
-:103BF000882780F921E0822780FB92F99093E001E9\r
-:103C000086EE0E945D1D882359F09091E00193FBA0\r
-:103C1000882780F921E0822780FB93F99093E001C7\r
-:103C200083EE0E945D1D882359F09091E00194FB82\r
-:103C3000882780F921E0822780FB94F99093E001A6\r
-:103C400085E30E945D1D882359F09091E00195FB6A\r
-:103C5000882780F921E0822780FB95F99093E00185\r
-:103C600081E30E945D1D882359F09091E00196FB4D\r
-:103C7000882780F921E0822780FB96F99093E00164\r
-:103C800081E10E945D1D882359F09091E00197FB2E\r
-:103C9000882780F921E0822780FB97F99093E00143\r
-:103CA0008091E0010E94D11E8091E00187FB88276E\r
-:103CB00080F980930D0187E20E945D1DC82F8EE17F\r
-:103CC0000E945D1D8111C2608FE10E945D1D811106\r
-:103CD000C46080E20E945D1D8111C86081E20E9483\r
-:103CE0005D1D8111C06182E20E945D1D8111C06273\r
-:103CF00083E20E945D1D8111C06484E20E945D1D0B\r
-:103D0000882311F0C06802C0CC2329F08C2F0E94B8\r
-:103D1000C81E6C2F03C00E94C41E682F70E080E094\r
-:103D200090E0CF910C94A719CF9108956DEE7EEF9E\r
-:103D300080E090E00E94EC2460E082E090E00E944D\r
-:103D4000DE2460E083E090E00E94DE2460E084E016\r
-:103D500090E00E94DE2460E085E090E00C94DE2498\r
-:103D600080E090E00E94D82421E08D3E9E4F09F033\r
-:103D700020E0822F089582E090E00C94D024682FF8\r
-:103D800082E090E00C94DE2483E090E00C94D02458\r
-:103D9000682F83E090E00C94DE2484E090E00C94A3\r
-:103DA000D024682F84E090E00C94DE248091D5012B\r
-:103DB00080FF0BC06091130185E0689FB001112462\r
-:103DC00075956795759567952AC081FF09C06091C3\r
-:103DD000130185E0689FB0011124759567951FC098\r
-:103DE00082FF07C06091130185E0689FB001112434\r
-:103DF00016C04091D6014423C9F0609112014617C4\r
-:103E000088F72091130185E0289F90011124429F9B\r
-:103E1000C001439F900D112470E00E94A2246038DD\r
-:103E2000710540F46115710539F002C065E070E07C\r
-:103E3000862F08958FE7089581E008958091D50138\r
-:103E400080FF08C06091110170E0759567957595C8\r
-:103E5000679521C081FF06C06091110170E07595E2\r
-:103E6000679519C082FF04C06091110170E010C015\r
-:103E70008091D6018823C1F0609110018617A0F7C8\r
-:103E800090911101989FC001112470E00E94A2241A\r
-:103E90006038710528F46115710521F0862F0895A9\r
-:103EA0008FE7089581E0089561E070E0F4CF803FEE\r
-:103EB00021F40E94D61E819504C0813F29F40E94FE\r
-:103EC000D61E8093D9010895823F21F40E94D61E08\r
-:103ED000819504C0833F29F40E94D61E8093D801A7\r
-:103EE0000895893F19F40E941E1F05C08A3F31F4CE\r
-:103EF0000E941E1F81958093DA0108958B3F21F463\r
-:103F00000E941E1F819504C08C3F29F40E941E1F31\r
-:103F10008093DB010895843F21F48091D701816073\r
-:103F200017C0853F21F48091D701826011C0863F80\r
-:103F300021F48091D70184600BC0873F21F48091E8\r
-:103F4000D701886005C0883F31F48091D701806136\r
-:103F50008093D70108958D3F21F48091D501816030\r
-:103F60000BC08E3F21F48091D501826005C08F3F48\r
-:103F700029F48091D50184608093D5010895803F14\r
-:103F800039F48091D90187FF6CC01092D90169C0C2\r
-:103F9000813F29F48091D9011816BCF362C0909139\r
-:103FA000D801823F29F497FF5CC01092D80159C014\r
-:103FB000833F19F41916CCF354C0893F41F4809122\r
-:103FC000DA0118160CF04DC01092DA014AC08A3F8F\r
-:103FD00029F48091DA0187FF44C0F6CF8B3F39F492\r
-:103FE0008091DB0187FF3DC01092DB013AC08C3F1E\r
-:103FF00029F48091DB011816BCF333C0843F21F40F\r
-:104000008091D7018E7F17C0853F21F48091D70121\r
-:104010008D7F11C0863F21F48091D7018B7F0BC02B\r
-:10402000873F21F48091D701877F05C0883F31F415\r
-:104030008091D7018F7E8093D70113C08D3F21F4EB\r
-:104040008091D5018E7F0BC08E3F21F48091D501E8\r
-:104050008D7F05C08F3F29F48091D5018B7F8093A0\r
-:10406000D5018091D80181110EC08091D9018111B3\r
-:104070000AC08091DA01811106C08091DB018111B3\r
-:1040800002C01092D601089587ED91E00E945A1067\r
-:104090000E94AE1C9093D4018093D30108951F9386\r
-:1040A000CF93DF938091D3019091D4010E94BA1CE9\r
-:1040B0004091D601442321F02091140130E006C044\r
-:1040C000209115015AE0259F900111248217930732\r
-:1040D00008F482C08091D8011091D901D091DA0101\r
-:1040E000C091DB01811107C0111105C0D11103C0BE\r
-:1040F000CC2309F471C04F3F19F04F5F4093D601B4\r
-:10410000181624F40E94D61E8093D8018091D801FD\r
-:1041100087FF05C00E94D61E81958093D801111695\r
-:1041200024F40E94D61E8093D9018091D90187FF83\r
-:1041300005C00E94D61E81958093D9016091D80157\r
-:10414000662339F11091D901112319F1772767FD01\r
-:104150007095872F972F0E94B32323E333E343E324\r
-:104160005FE30E9417240E9480236093D801612F8F\r
-:10417000772767FD7095872F972F0E94B32323E33E\r
-:1041800033E343E35FE30E9417240E94802360939C\r
-:10419000D9011D1624F40E941E1F8093DA0180911C\r
-:1041A000DA0187FF05C00E941E1F81958093DA0106\r
-:1041B0001C1624F40E941E1F8093DB018091DB01FA\r
-:1041C00087FF05C00E941E1F81958093DB01DF9150\r
-:1041D000CF911F910C944420DF91CF911F910895AE\r
-:1041E000E7EDF1E085E0DF011D928A95E9F7109295\r
-:1041F000D6011092D5010895833081F128F48130E1\r
-:1042000059F08230D1F00895853009F449C0B8F1F1\r
-:10421000863009F456C0089520911501862F90E04C\r
-:10422000820F911D8F3F910520F4620F609315015D\r
-:1042300008958FEF80931501089520911401862F22\r
-:1042400090E0820F911D8F3F910520F4620F6093E3\r
-:10425000140108958FEF80931401089520911301A4\r
-:10426000862F90E0820F911D8F3F910520F4620F01\r
-:104270006093130108958FEF8093130108952091A7\r
-:104280001201862F90E0820F911D8F3F910520F43F\r
-:10429000620F6093120108958FEF809312010895C9\r
-:1042A00020911101862F90E0820F911D8F3F910583\r
-:1042B00020F4620F6093110108958FEF8093110134\r
-:1042C000089520911001862F90E0820F911D8F3F5D\r
-:1042D000910520F4620F6093100108958FEF809391\r
-:1042E00010010895833011F128F4813049F08230B3\r
-:1042F00091F00895853081F120F18630C1F1089563\r
-:1043000080911501681720F4861B8093150108958C\r
-:1043100010921501089580911401681720F4861BEE\r
-:10432000809314010895109214010895809113014F\r
-:10433000681720F4861B80931301089510921301CF\r
-:10434000089580911201681720F4861B8093120152\r
-:10435000089510921201089580911101681720F4B8\r
-:10436000861B809311010895109211010895809188\r
-:104370001001681720F4861B809310010895109295\r
-:10438000100108958D3109F442C020F58E3009F4F2\r
-:1043900079C070F4873009F45EC020F4863009F4E7\r
-:1043A00042C033C08830D1F18B3009F4A7C02DC092\r
-:1043B000863109F4A3C038F4803109F46DC081312D\r
-:1043C00009F47BC022C0893109F498C08B3109F40B\r
-:1043D0004FC01BC0853309F479C048F4873209F413\r
-:1043E00075C008F478C0893209F470C00EC08334F7\r
-:1043F00038F48A3308F071C0883309F47FC005C0EF\r
-:10440000833409F463C08834C1F080E008950E94C9\r
-:104410003A230E9443100E94480970C00E94BB1EAC\r
-:104420000E94CD1E6BC08091CD01817F8E7F8093D5\r
-:10443000CD0181E08093DD0108950E94AD152FEF3D\r
-:1044400083ED90E3215080409040E1F700C00000F0\r
-:104450000E94081D53C09091CD01892F817090FF5B\r
-:1044600003C0917F9E7F26C091609093CD0146C08E\r
-:104470009091CD0191FB882780F921E0822780FB74\r
-:1044800091F913C09091CD0192FB882780F921E02A\r
-:10449000822780FB92F909C09091CD0193FB882778\r
-:1044A00080F921E0822780FB93F99093CD01882346\r
-:1044B00029F191609093CD0108950E94AD158091EE\r
-:1044C0000D0191E0892780930D0118C061E070E033\r
-:1044D00080E090E00FC023EE01C027EC280F61E0E0\r
-:1044E00070E080E090E004C0660F771F881F991F7E\r
-:1044F0002A95D2F70E94A7190E94AD1581E0089570\r
-:1045000080E0089580E00895CF93C82F8091DD0169\r
-:10451000813079F018F08230D1F184C0A0910E0181\r
-:10452000B0910F018C91813169F0823209F07CC029\r
-:1045300009C0A0910E01B0910F018C91813111F051\r
-:10454000823249F48C2F0E94802281111DC08C2F51\r
-:104550000E94C2211AC08C2F0E948222811114C095\r
-:10456000C43179F048F4CB3079F0C03109F060C043\r
-:1045700082E08093DD0108C0C93219F0C83321F010\r
-:1045800057C01092DD0154C081E0817053C0C93220\r
-:1045900089F118F5C43171F1A8F4C73009F046C0AB\r
-:1045A0008AE08093150194E19093140193E0909335\r
-:1045B00013018093120188E08093110188E28093B7\r
-:1045C000100134C0CE51C63088F5EC2FF0E0E65D26\r
-:1045D000FE4F80818093DC0129C0CE34E9F020F4C5\r
-:1045E000CB3421F56AE013C0C13579F0C235F1F45E\r
-:1045F00061E00DC08091DC01882319F01092DC018C\r
-:1046000015C081E08093DD0115C061E006C0809196\r
-:10461000DC010E94FC200AC06AE08091DC010E945B\r
-:10462000722104C01092DD0180E004C081E002C06C\r
-:1046300080E0ABCFCF910895E1E8F0E08081886021\r
-:1046400080838081816080838FB7F89493E090931A\r
-:10465000890090ED909388008FBF0895EFE6F0E019\r
-:104660008081826080830895EFE6F0E080818D7F15\r
-:1046700080830895EFE6F0E0808192E089278083CF\r
-:1046800008951F920F920FB60F9211242F933F930C\r
-:104690004F935F936F937F938F939F93AF93BF934A\r
-:1046A000EF93FF938091DE019091DF01019690934B\r
-:1046B000DF018093DE01811103C082E00E9448097E\r
-:1046C000E091DF01E695E695F0E0E258F74FE491DE\r
-:1046D0008091DE018E1303C080E00E944809FF91A3\r
-:1046E000EF91BF91AF919F918F917F916F915F916A\r
-:1046F0004F913F912F910F900FBE0F901F901895E3\r
-:1047000004D06894B1118DC0089570D088F09F577F\r
-:1047100090F0B92F9927B751A0F0D1F0660F771F0D\r
-:10472000881F991F1AF0BA95C9F712C0B13081F0ED\r
-:1047300077D0B1E0089574C0672F782F8827B85FCD\r
-:1047400039F0B93FCCF3869577956795B395D9F74E\r
-:104750003EF490958095709561957F4F8F4F9F4F58\r
-:104760000895E89409C097FB3EF490958095709564\r
-:1047700061957F4F8F4F9F4F9923A9F0F92F96E9AD\r
-:10478000BB279395F695879577956795B795F11122\r
-:10479000F8CFFAF4BB0F11F460FF1BC06F5F7F4FBF\r
-:1047A0008F4F9F4F16C0882311F096E911C07723D1\r
-:1047B00021F09EE8872F762F05C0662371F096E8DA\r
-:1047C000862F70E060E02AF09A95660F771F881FA9\r
-:1047D000DAF7880F9695879597F9089557FD9058C1\r
-:1047E000440F551F59F05F3F71F04795880F97FBB5\r
-:1047F000991F61F09F3F79F087950895121613066F\r
-:104800001406551FF2CF4695F1DF08C0161617069D\r
-:104810001806991FF1CF86957105610508940895D2\r
-:10482000E894BB2766277727CB0197F908950BD02B\r
-:1048300078C069D028F06ED018F0952309F05AC0DE\r
-:104840005FC01124EECFCADFA0F3959FD1F3950F7F\r
-:1048500050E0551F629FF001729FBB27F00DB11D04\r
-:10486000639FAA27F00DB11DAA1F649F6627B00D94\r
-:10487000A11D661F829F2227B00DA11D621F739F7D\r
-:10488000B00DA11D621F839FA00D611D221F749F8B\r
-:104890003327A00D611D231F849F600D211D822FD2\r
-:1048A000762F6A2F11249F5750408AF0E1F0882319\r
-:1048B0004AF0EE0FFF1FBB1F661F771F881F915026\r
-:1048C0005040A9F79E3F510570F014C0AACF5F3F3A\r
-:1048D000ECF3983EDCF3869577956795B795F79559\r
-:1048E000E7959F5FC1F7FE2B880F911D96958795E1\r
-:1048F00097F9089597F99F6780E870E060E0089560\r
-:104900009FEF80EC089500240A94161617061806E7\r
-:104910000906089500240A941216130614060506C3\r
-:104920000895092E0394000C11F4882352F0BB0F54\r
-:1049300040F4BF2B11F460FF04C06F5F7F4F8F4FB7\r
-:104940009F4F089597FB072E16F4009407D077FD2C\r
-:1049500009D00E94BC2407FC05D03EF490958195B7\r
-:104960009F4F0895709561957F4F0895EE0FFF1F3B\r
-:104970000590F491E02D0994AA1BBB1B51E107C0DF\r
-:10498000AA1FBB1FA617B70710F0A61BB70B881FDF\r
-:10499000991F5A95A9F780959095BC01CD0108956E\r
-:1049A000F999FECF92BD81BDF89A992780B50895F7\r
-:1049B000A8E1B0E042E050E00C94F324262FF999EE\r
-:1049C000FECF1FBA92BD81BD20BD0FB6F894FA9AF2\r
-:1049D000F99A0FBE019608950E94DE24272F0C94A9\r
-:1049E000DF24DC01CB01FC01F999FECF06C0F2BD4A\r
-:1049F000E1BDF89A319600B40D9241505040B8F79D\r
-:064A00000895F894FFCFB9\r
-:104A060020024A09D709B40980094D090101BA01F2\r
-:104A160028080A03140A3F4D36393F08F207BC0737\r
-:104A2600830716072F0748076107010203040506D7\r
-:044A36000708090064\r
+:102A50000C945E1B0E94441BC701B60128960FB65A\r
+:102A6000F894DEBF0FBECDBFDF91CF911F910F91C4\r
+:102A7000FF90EF90DF90CF900C942A1B603FC9F13C\r
+:102A800018F4603E50F49BC0623F09F460C008F443\r
+:102A90004AC0633F09F46FC092C0162F1F70842F85\r
+:102AA0008F71FF2099F00E94C31A812F28960FB6CC\r
+:102AB000F894DEBF0FBECDBFDF91CF911F910F9174\r
+:102AC000FF90EF90DF90CF900C940F130E94E41AC8\r
+:102AD000812F28960FB6F894DEBF0FBECDBFDF91D1\r
+:102AE000CF911F910F91FF90EF90DF90CF900C94BA\r
+:102AF0001613FF20A1F05111B2C0842F8F712896B8\r
+:102B00000FB6F894DEBF0FBECDBFDF91CF911F91FE\r
+:102B10000F91FF90EF90DF90CF900C94091B5230F3\r
+:102B200008F09DC0EACFFF20A1F0842F8F71289676\r
+:102B30000FB6F894DEBF0FBECDBFDF91CF911F91CE\r
+:102B40000F91FF90EF90DF90CF900C94C31AFF206D\r
+:102B500061F3842F8F7128960FB6F894DEBF0FBEF5\r
+:102B6000CDBFDF91CF911F910F91FF90EF90DF903C\r
+:102B7000CF900C94E41AFF2091F0842F8F71289647\r
+:102B80000FB6F894DEBF0FBECDBFDF91CF911F917E\r
+:102B90000F91FF90EF90DF90CF900C94AE1A289693\r
+:102BA0000FB6F894DEBF0FBECDBFDF91CF911F915E\r
+:102BB0000F91FF90EF90DF90CF900C94A41AFF201C\r
+:102BC000A1F0552309F4B1CF862F28960FB6F894BB\r
+:102BD000DEBF0FBECDBFDF91CF911F910F91FF9050\r
+:102BE000EF90DF90CF900C94F811552309F4B1CFFA\r
+:102BF000862F28960FB6F894DEBF0FBECDBFDF91AB\r
+:102C0000CF911F910F91FF90EF90DF90CF900C9498\r
+:102C1000C0124F70C8010E941D0328960FB6F89489\r
+:102C2000DEBF0FBECDBFDF91CF911F910F91FF90FF\r
+:102C3000EF90DF90CF900C94CB194F70C80128967D\r
+:102C40000FB6F894DEBF0FBECDBFDF91CF911F91BD\r
+:102C50000F91FF90EF90DF90CF900C94FC06289698\r
+:102C60000FB6F894DEBF0FBECDBFDF91CF911F919D\r
+:102C70000F91FF90EF90DF90CF9008950E94661C17\r
+:102C80000E94761C0E943B1C0E94921C0E945221B2\r
+:102C90000E94A62080E090E00E94F11080E090E089\r
+:102CA0000C9407110E94561C0C943E160E94B91BEE\r
+:102CB000292F22952F7030E02C3031054CF42A302A\r
+:102CC00031056CF4225031092230310590F407C0EF\r
+:102CD0002C30310551F02F30310539F00AC0803EDB\r
+:102CE00010F0803F31F481E0089593FB882780F94C\r
+:102CF000089580E00895CF93DF9300D000D01F9215\r
+:102D0000CDB7DEB70F900F900F900F900F90DF911F\r
+:102D1000CF910895CF93DF9300D000D000D0CDB7EE\r
+:102D2000DEB726960FB6F894DEBF0FBECDBFDF919B\r
+:102D3000CF9108951F93CF93DF93C091810116E047\r
+:102D400080918201C81799F0D0E01C9FF0011D9F6F\r
+:102D5000F00D1124ED57FE4F408151816281738146\r
+:102D6000848195810E948A162196C770E9CFDF91F0\r
+:102D7000CF911F9108954091B3015091B40160919A\r
+:102D8000B5017091B6018091B7019091B8010C9492\r
+:102D90008A16CF938091B80182958F7009F05FC039\r
+:102DA0008091B501882309F45AC020918101A09136\r
+:102DB00082016091B3017091B4018091B60190914C\r
+:102DC000B70131E06F3F09F030E0B32FC6E02A17BA\r
+:102DD00009F445C0009721F07F3F21F44B2F03C039\r
+:102DE00041E001C040E030E040FD35C0C29FF0014D\r
+:102DF000C39FF00D1124ED57FE4F418174132BC07A\r
+:102E00004081641328C04281411125C0438154810F\r
+:102E10004817590710F441505109481B590B483CB9\r
+:102E20005105C8F48091B8018F7080618093B8011A\r
+:102E300086E0829FF001839FF00D1124E857FE4F3A\r
+:102E400080818F708061808383EB91E00E941D13ED\r
+:102E5000CF910C949A162F5F3F4F2770B8CFCF9128\r
+:102E60000895CF92DF92EF92FF920F931F93CF932B\r
+:102E7000DF93CDB7DEB762970FB6F894DEBF0FBE13\r
+:102E8000CDBF8C0185E0F801DE011D9601900D9209\r
+:102E90008A95E1F7D8014C9111965C9111971296A1\r
+:102EA0006C9112971396ED90FC9014977091B3016A\r
+:102EB000E091B4012091B6013091B701211531059F\r
+:102EC00031F0EF3F31F481E07F3F19F403C081E03E\r
+:102ED00001C080E0B82FB170CB2E80FD6CC1D090C6\r
+:102EE000B501DD2009F4F5C0F091B801E216F30652\r
+:102EF00038F0C701821B930B883C910548F09BC0BA\r
+:102F0000209530952E0D3F1D283C310508F093C0CB\r
+:102F10008F2F807F09F052C0E51314C0741312C0C4\r
+:102F2000D62E61110FC0FF70F061F093B8010E94BE\r
+:102F3000BB1683EB91E00E941D138091B801F8014C\r
+:102F400085836CC1EF2831F05F3F31F481E04F3F62\r
+:102F500019F403C081E001C080E080FD03C081E07E\r
+:102F6000862701C080E0F82FF170FF2E80FF1CC083\r
+:102F7000809181012091820136E0821709F428C1F5\r
+:102F800090E0389FF001399FF00D1124ED57FE4F6E\r
+:102F90007181571306C07081471303C07281671394\r
+:102FA00003C001968770E9CFD62E662309F436C197\r
+:102FB0008091B80181608093B80153C0E51308C0C7\r
+:102FC000741306C0611104C0D8011596FC93AEC0FD\r
+:102FD0004D875E878D859E856A8B0E9456166A890D\r
+:102FE000882329F1D62E662311F12091B801822F72\r
+:102FF00082958F7090E002970CF460C08091B301CD\r
+:103000009091B40198878F831986FB86EA862C8776\r
+:10301000CE01079651C0E51731F14D875E878D854A\r
+:103020009E856A8B0E9456166A8981112EC0C8013E\r
+:103030000E941D13A4C08F2F807F69F77E2DF98A0F\r
+:10304000E88A89890E947B1683EB91E00E941D1318\r
+:10305000E3EBF1E086E0DF011D928A95E9F70E943B\r
+:10306000BB16D12CDBC07413D8CF6111D6CFD801D9\r
+:103070001596FC93C8010E941D13E3EBF1E086E076\r
+:10308000DF011D928A95E9F7C9C0D62E662379F231\r
+:103090002091B801822F82958F7090E0029774F092\r
+:1030A0008091B3019091B4019A8389831B82FD8240\r
+:1030B000EC822E83CE0101960E941D1386E0F8015A\r
+:1030C000A3EBB1E001900D928A95E1F70E94C91639\r
+:1030D0006FC0E216F30628F0C701821B930B9C0118\r
+:1030E00004C0209530952E0D3F1D283C310508F079\r
+:1030F00052C0D62E662309F49ACFE5132CC0741360\r
+:103100002AC08091B80180FD1DC0982F92959F70B4\r
+:10311000C9F0D80115968C9315979F3039F09F5FB1\r
+:103120009295907F8F70892B15968C93C8010E9481\r
+:103130001D1386E0F801A3EBB1E001900D928A9592\r
+:10314000E1F736C086E0F801A3EBB1E001900D9203\r
+:103150008A95E1F763C04D875E878D859E850E94C5\r
+:103160005616882379F086E0F801A3EBB1E00190D0\r
+:103170000D928A95E1F70E94C9160E94BB16DD24C4\r
+:10318000D3944CC08091B80181608093B801C8018C\r
+:103190000E941D1343C07E2DF98AE88A89890E9406\r
+:1031A0007B16E3EBF1E086E0DF011D928A95E9F7FB\r
+:1031B0000E94BB1633C0662309F439CF4D875E8762\r
+:1031C0008D859E850E945616882309F430CFCBCF7B\r
+:1031D0004D875E878D859E850E94B91B292F22957C\r
+:1031E0002F7030E0223031052CF49F7041F08111B6\r
+:1031F00006C00CC0243031052CF49F7049F4805E69\r
+:10320000883020F0C8010E941D13CF2CDC2C06C092\r
+:10321000D80115969C91907F91F7F8CF8D2D6296ED\r
+:103220000FB6F894DEBF0FBECDBFDF91CF911F91D7\r
+:103230000F91FF90EF90DF90CF9008951F93CF9361\r
+:10324000DF93CDB7DEB72C970FB6F894DEBF0FBE75\r
+:10325000CDBF4F83588769877A878B879C87CE013C\r
+:1032600007960E9431178823C1F02F8138858A85FF\r
+:103270009B85892B31F03F3F11F080E003C02F3F49\r
+:10328000E1F781E0811147C04F81588569857A85D2\r
+:103290008B859C850E948A163EC086E0FE0137968B\r
+:1032A000DE01119601900D928A95E1F7FF81E88584\r
+:1032B0004A855B854115510531F0EF3F31F481E0DE\r
+:1032C000FF3F19F403C081E001C080E080FD23C00E\r
+:1032D0002091820130E0C9010196877099276091A1\r
+:1032E000810170E086179707F1F1F983EA835D8326\r
+:1032F0004C8396E0929FD001939FB00D1124AD575F\r
+:10330000BE4FFE01319601900D929A95E1F78093A0\r
+:1033100082010E949A1616E08091810190918201AB\r
+:10332000891779F1189FC00111248D579E4F0E9473\r
+:103330003117882331F1E09181011E9FF0011124A2\r
+:10334000ED57FE4F40815181628173818481958167\r
+:103350000E948A168091810190E0019687709927DA\r
+:1033600080938101D9CF0E9452161092820110924F\r
+:103370008101E3EBF1E086E0DF011D928A95E9F738\r
+:10338000CACF2C960FB6F894DEBF0FBECDBFDF912B\r
+:10339000CF911F910895EF92FF920F931F93CF93B8\r
+:1033A000DF93FC01009709F46FC0F12CEE24E39445\r
+:1033B000EF0121968491843740F4843008F055C0A1\r
+:1033C000813081F0823021F15FC0853709F447C038\r
+:1033D000C0F19CE7980F903708F056C08F770E9495\r
+:1033E000C01245C08F010E5F1F4FFE01849190E215\r
+:1033F000980F983050F48770FE2D01C0FF0F8A950A\r
+:10340000EAF78F2F0E94691C15C00E94F81114C0A2\r
+:103410008F010E5F1F4FFE01849190E2980F98304C\r
+:1034200068F48770FE2D01C0FF0F8A95EAF78F2F91\r
+:103430000E946F1C0E94921CE80119C00E94C012D9\r
+:10344000FBCFCF010296FE01C491CC2361F0EFE9DE\r
+:10345000FFE03197F1F700C00000C150F6CFCF0177\r
+:103460000296FE01F490EC0102C00E94F8118F2D2B\r
+:10347000882341F0EFE9FFE03197F1F700C0000049\r
+:103480008150F6CFFE0194CFDF91CF911F910F9124\r
+:10349000FF90EF90089508956093BD017093BE0171\r
+:1034A0008093BF019093C0010C943E160F931F931D\r
+:1034B0000091BD011091BE012091BF013091C0016A\r
+:1034C000062B172B282B392B0093BD011093BE011F\r
+:1034D0002093BF013093C0011F910F910C943E16B1\r
+:1034E0000F931F930091BD011091BE012091BF0168\r
+:1034F0003091C00106231723282339230093BD01EF\r
+:103500001093BE012093BF013093C0011F910F9112\r
+:103510000C943E160F931F930091BD011091BE01B4\r
+:103520002091BF013091C00106271727282739278E\r
+:103530000093BD011093BE012093BF013093C001E1\r
+:103540001F910F910C943E161092B9011092BA017E\r
+:103550001092BB011092BC010C943E1641E050E069\r
+:1035600060E070E004C0440F551F661F771F8A9506\r
+:10357000D2F74093B9015093BA016093BB017093A5\r
+:10358000BC010C943E1641E050E060E070E004C0E5\r
+:10359000440F551F661F771F8A95D2F78091B90196\r
+:1035A0009091BA01A091BB01B091BC01842B952BE5\r
+:1035B000A62BB72B8093B9019093BA01A093BB01BE\r
+:1035C000B093BC010C943E1641E050E060E070E026\r
+:1035D00004C0440F551F661F771F8A95D2F7409588\r
+:1035E0005095609570958091B9019091BA01A09124\r
+:1035F000BB01B091BC0184239523A623B7238093FC\r
+:10360000B9019093BA01A093BB01B093BC010C9493\r
+:103610003E1641E050E060E070E004C0440F551FEA\r
+:10362000661F771F8A95D2F78091B9019091BA01F0\r
+:10363000A091BB01B091BC0184279527A627B7278D\r
+:103640008093B9019093BA01A093BB01B093BC01E0\r
+:103650000C943E160F931F930091B9011091BA017B\r
+:103660002091BB013091BC01062B172B282B392B45\r
+:103670000093B9011093BA012093BB013093BC01B0\r
+:103680001F910F910C943E160F931F930091B90157\r
+:103690001091BA012091BB013091BC010623172380\r
+:1036A000282339230093B9011093BA012093BB0159\r
+:1036B0003093BC011F910F910C943E160F931F93F2\r
+:1036C0000091B9011091BA012091BB013091BC0168\r
+:1036D00006271727282739270093B9011093BA0125\r
+:1036E0002093BB013093BC011F910F910C943E16A7\r
+:1036F0000895CF92DF92EF92FF920F931F93CF9393\r
+:10370000DF93EC01C090BD01D090BE01E090BF01FD\r
+:10371000F090C0018091B9019091BA01A091BB01D4\r
+:10372000B091BC01C82AD92AEA2AFB2A0FE110E08D\r
+:10373000B701A601002E04C0769567955795479569\r
+:103740000A94D2F740FD05C00150110988F780E0C6\r
+:1037500007C0BE01802F0E9439090197A9F3802F6D\r
+:10376000DF91CF911F910F91FF90EF90DF90CF905D\r
+:103770000895CF93DF93EC010E94791BBE010E9454\r
+:103780003909DF91CF910895CB010E94B91B0895AB\r
+:1037900090910C019923D9F090910D019923B9F0E2\r
+:1037A000982F9695969596959F3088F5E0910E0105\r
+:1037B000F0910F01E90FF11D877021E030E001C0A9\r
+:1037C000220F8A95EAF78181822B818308954091A7\r
+:1037D0000E0150910F0120E030E09FEFFA01E20F5F\r
+:1037E000F31F6281681799F09F3F19F4611101C0BE\r
+:1037F000922F2F5F3F4F2E30310581F79F3F39F0D9\r
+:10380000FA01E90FF11D97FDFA9582830895089555\r
+:1038100090910C019923E1F090910D019923C1F051\r
+:10382000982F9695969596959F3020F5E0910E01EC\r
+:10383000F0910F01E90FF11D877021E030E001C028\r
+:10384000220F8A95EAF72095818128232183089504\r
+:1038500040910E0150910F0120E030E0FA01E20F9B\r
+:10386000F31F9281981301C012822F5F3F4F2E30B9\r
+:103870003105A1F7089581E090E0E0910E01F0910B\r
+:103880000F01E80FF91F1082019680319105A9F709\r
+:1038900008959091D401982B9093D4010895809528\r
+:1038A0009091D40198239093D40108951092D4015B\r
+:1038B00008959091D301982B9093D301089580950A\r
+:1038C0009091D30198239093D30108951092D3013E\r
+:1038D00008959091D201982B9093D20108958095EC\r
+:1038E0009091D20198239093D20108951092D20121\r
+:1038F00008958093C10108951092C10108954091E7\r
+:103900000E0150910F0120E030E080E0FA01E20F5B\r
+:10391000F31F918191118F5F2F5F3F4F2F30310542\r
+:10392000A9F70895E0910E01F0910F018091D40163\r
+:103930008083E0910E01F0910F0180819091D3017D\r
+:10394000892B8083E0910E01F0910F01808190918D\r
+:10395000D201892B80839091C101992361F0E0917C\r
+:103960000E01F0910F018081892B80830E947F1CC2\r
+:1039700081111092C10180910E0190910F010C9460\r
+:10398000DB108091EC01843021F11092D60120E40B\r
+:1039900088E190E00FB6F894A895809360000FBE80\r
+:1039A0002093600080E00E94D40983B7817F846007\r
+:1039B00083BF83B7816083BF7894889583B78E7FF8\r
+:1039C00083BF88E10FB6F894809360001092600086\r
+:1039D0000FBE089508950895CF930E94EA1C0E9497\r
+:1039E00008060E94EB1CC0E08C2F0E94F506811196\r
+:1039F00005C0CF5FCE30C1F780E001C081E0CF913C\r
+:103A000008950E9452160E94CF100C94D40982E0AF\r
+:103A100084BD93E095BD9AEF97BD80936E000895A5\r
+:103A20002FB7F8948091D7019091D801A091D90136\r
+:103A3000B091DA012FBF0895CF92DF92EF92FF92FB\r
+:103A40000F931F932FB7F8944091D7015091D8014D\r
+:103A50006091D9017091DA012FBF6A017B01EE24D8\r
+:103A6000FF248C0120E030E0C016D106E206F30608\r
+:103A700010F441505109481B590BCA011F910F9175\r
+:103A8000FF90EF90DF90CF9008951F920F920FB6A6\r
+:103A90000F9211248F939F93AF93BF938091D7017F\r
+:103AA0009091D801A091D901B091DA010196A11DA0\r
+:103AB000B11D8093D7019093D801A093D901B09301\r
+:103AC000DA01BF91AF919F918F910F900FBE0F9030\r
+:103AD0001F9018950E94D50DF8942FEF87EA91E674\r
+:103AE000215080409040E1F700C0000087E090EB5B\r
+:103AF000DC018093F6019093F701A093F801B09355\r
+:103B0000F9012CE088E190E00FB6F894A895809335\r
+:103B100060000FBE20936000FFCFEF92FF920F93E3\r
+:103B20001F93CF93DF93E82EF12C8F2D0E94F50683\r
+:103B3000C0E0D0E0082F10E098010C2E02C03595AF\r
+:103B400027950A94E2F720FD05C02196C630D105DD\r
+:103B500099F709C06C2F7F2D80E00E94FD06E812C6\r
+:103B6000F4CF81E005C0F3948EE0F812DECF80E060\r
+:103B7000DF91CF911F910F91FF90EF900895CF9318\r
+:103B8000C82F8CE20E948D1D882321F08C2FCF91AD\r
+:103B90000C948D1D80E0CF910895CF930E94121F49\r
+:103BA000811102C00E94F81EC5E6C15049F00E9472\r
+:103BB00008068FE39CE90197F1F700C00000F5CFFC\r
+:103BC00089E20E94BF1D811111C18AE20E94BF1DBE\r
+:103BD00081110E94F81E85E00E94BF1D81110E9484\r
+:103BE0006A1D0E941D1F8093D50187E00E94BF1DA2\r
+:103BF000882399F18BE10E94BF1D882351F0909199\r
+:103C0000D50191FB882780F921E0822780FB91F97B\r
+:103C100022C08EE00E94BF1D882351F09091D501F3\r
+:103C200092FB882780F921E0822780FB92F913C05C\r
+:103C300080E10E94BF1D9091D501882341F093FB44\r
+:103C4000882780F921E0822780FB93F904C0892F1F\r
+:103C5000809580FB90F99093D5018091D5010E94C9\r
+:103C6000211F0E942F1F8093F50180EE0E94BF1D2F\r
+:103C7000882341F08091F501982F909590FB80F971\r
+:103C80008093F50189E30E94BF1D882359F090912C\r
+:103C9000F50191FB882780F921E0822780FB91F9CB\r
+:103CA0009093F50182EE0E94BF1D882359F09091F8\r
+:103CB000F50192FB882780F921E0822780FB92F9A9\r
+:103CC0009093F50186EE0E94BF1D882359F09091D4\r
+:103CD000F50193FB882780F921E0822780FB93F987\r
+:103CE0009093F50183EE0E94BF1D882359F09091B7\r
+:103CF000F50194FB882780F921E0822780FB94F965\r
+:103D00009093F50185E30E94BF1D882359F090919F\r
+:103D1000F50195FB882780F921E0822780FB95F942\r
+:103D20009093F50181E30E94BF1D882359F0909183\r
+:103D3000F50196FB882780F921E0822780FB96F920\r
+:103D40009093F50181E10E94BF1D882359F0909165\r
+:103D5000F50197FB882780F921E0822780FB97F9FE\r
+:103D60009093F5018091F5010E94331F8091F50138\r
+:103D700087FB882780F980930D0187E20E94BF1D91\r
+:103D8000C82F8EE10E94BF1D8111C2608FE10E9489\r
+:103D9000BF1D8111C46080E20E94BF1D8111C860F7\r
+:103DA00081E20E94BF1D8111C06182E20E94BF1D9D\r
+:103DB0008111C06283E20E94BF1D8111C06484E250\r
+:103DC0000E94BF1D882311F0C06802C0CC2329F0D7\r
+:103DD0008C2F0E942A1F6C2F03C00E94261F682F61\r
+:103DE00070E080E090E0CF910C944C1ACF91089550\r
+:103DF0006DEE7EEF80E090E00E94502560E082E072\r
+:103E000090E00E943E2560E083E090E00E943E2525\r
+:103E100060E084E090E00E943E2560E085E090E074\r
+:103E20000C943E2580E090E00E94382521E08D3EF4\r
+:103E30009E4F09F020E0822F089582E090E00C94DC\r
+:103E40003025682F82E090E00C943E2583E090E0DE\r
+:103E50000C943025682F83E090E00C943E2584E09C\r
+:103E600090E00C943025682F84E090E00C943E257F\r
+:103E70008091DD0180FF0BC06091130185E0689F98\r
+:103E8000B001112475956795759567952AC081FFD6\r
+:103E900009C06091130185E0689FB00111247595F8\r
+:103EA00067951FC082FF07C06091130185E0689F7E\r
+:103EB000B001112416C04091DE014423C9F0609185\r
+:103EC0001201461788F72091130185E0289F900181\r
+:103ED0001124429FC001439F900D112470E00E9465\r
+:103EE00002256038710540F46115710539F002C092\r
+:103EF00065E070E0862F08958FE7089581E00895CA\r
+:103F00008091DD0180FF08C06091110170E075951E\r
+:103F100067957595679521C081FF06C06091110175\r
+:103F200070E07595679519C082FF04C0609111011A\r
+:103F300070E010C08091DE018823C1F06091100113\r
+:103F40008617A0F790911101989FC001112470E08D\r
+:103F50000E9402256038710528F46115710521F071\r
+:103F6000862F08958FE7089581E0089561E070E05D\r
+:103F7000F4CF803F21F40E94381F819504C0813F17\r
+:103F800029F40E94381F8093E1010895823F21F4B3\r
+:103F90000E94381F819504C0833F29F40E94381F76\r
+:103FA0008093E0010895893F19F40E94801F05C0A5\r
+:103FB0008A3F31F40E94801F81958093E201089529\r
+:103FC0008B3F21F40E94801F819504C08C3F29F40F\r
+:103FD0000E94801F8093E3010895843F21F4809123\r
+:103FE000DF01816017C0853F21F48091DF0182608D\r
+:103FF00011C0863F21F48091DF0184600BC0873FB0\r
+:1040000021F48091DF01886005C0883F31F4809100\r
+:10401000DF0180618093DF0108958D3F21F480915D\r
+:10402000DD0181600BC08E3F21F48091DD01826053\r
+:1040300005C08F3F29F48091DD0184608093DD010C\r
+:104040000895803F39F48091E10187FF6CC01092A0\r
+:10405000E10169C0813F29F48091E1011816BCF3A8\r
+:1040600062C09091E001823F29F497FF5CC01092FA\r
+:10407000E00159C0833F19F41916CCF354C0893FAD\r
+:1040800041F48091E20118160CF04DC01092E2014B\r
+:104090004AC08A3F29F48091E20187FF44C0F6CFED\r
+:1040A0008B3F39F48091E30187FF3DC01092E3011B\r
+:1040B0003AC08C3F29F48091E3011816BCF333C059\r
+:1040C000843F21F48091DF018E7F17C0853F21F46A\r
+:1040D0008091DF018D7F11C0863F21F48091DF0147\r
+:1040E0008B7F0BC0873F21F48091DF01877F05C064\r
+:1040F000883F31F48091DF018F7E8093DF0113C010\r
+:104100008D3F21F48091DD018E7F0BC08E3F21F425\r
+:104110008091DD018D7F05C08F3F29F48091DD0105\r
+:104120008B7F8093DD018091E00181110EC0809131\r
+:10413000E10181110AC08091E201811106C08091E4\r
+:10414000E301811102C01092DE0108958FED91E02C\r
+:104150000E94E6100E94101D9093DC018093DB0109\r
+:1041600008951F93CF93DF938091DB019091DC0141\r
+:104170000E941C1D4091DE01442321F02091140176\r
+:1041800030E006C0209115015AE0259F90011124CE\r
+:104190008217930708F482C08091E0011091E10139\r
+:1041A000D091E201C091E301811107C0111105C056\r
+:1041B000D11103C0CC2309F471C04F3F19F04F5FF8\r
+:1041C0004093DE01181624F40E94381F8093E0010A\r
+:1041D0008091E00187FF05C00E94381F8195809380\r
+:1041E000E001111624F40E94381F8093E1018091B0\r
+:1041F000E10187FF05C00E94381F81958093E1018E\r
+:104200006091E001662339F11091E101112319F168\r
+:10421000772767FD7095872F972F0E94132423E33C\r
+:1042200033E343E35FE30E9477240E94E02360933B\r
+:10423000E001612F772767FD7095872F972F0E94E8\r
+:10424000132423E333E343E35FE30E9477240E94D4\r
+:10425000E0236093E1011D1624F40E94801F8093E7\r
+:10426000E2018091E20187FF05C00E94801F8195D5\r
+:104270008093E2011C1624F40E94801F8093E301C6\r
+:104280008091E30187FF05C00E94801F8195809384\r
+:10429000E301DF91CF911F910C94A620DF91CF9184\r
+:1042A0001F910895EFEDF1E085E0DF011D928A9501\r
+:1042B000E9F71092DE011092DD010895833081F15B\r
+:1042C00028F4813059F08230D1F00895853009F416\r
+:1042D00049C0B8F1863009F456C0089520911501FF\r
+:1042E000862F90E0820F911D8F3F910520F4620F81\r
+:1042F0006093150108958FEF809315010895209123\r
+:104300001401862F90E0820F911D8F3F910520F4BC\r
+:10431000620F6093140108958FEF80931401089544\r
+:1043200020911301862F90E0820F911D8F3F910500\r
+:1043300020F4620F6093130108958FEF80931301AF\r
+:10434000089520911201862F90E0820F911D8F3FDA\r
+:10435000910520F4620F6093120108958FEF80930E\r
+:104360001201089520911101862F90E0820F911D76\r
+:104370008F3F910520F4620F6093110108958FEF34\r
+:1043800080931101089520911001862F90E0820FF3\r
+:10439000911D8F3F910520F4620F609310010895E5\r
+:1043A0008FEF809310010895833011F128F481304C\r
+:1043B00049F0823091F00895853081F120F1863006\r
+:1043C000C1F1089580911501681720F4861B809330\r
+:1043D0001501089510921501089580911401681730\r
+:1043E00020F4861B809314010895109214010895FF\r
+:1043F00080911301681720F4861B809313010895A0\r
+:1044000010921301089580911201681720F4861B01\r
+:104410008093120108951092120108958091110164\r
+:10442000681720F4861B80931101089510921101E2\r
+:10443000089580911001681720F4861B8093100165\r
+:1044400008951092100108958D3109F442C020F5AD\r
+:104450008E3009F477C070F4873009F459C018F42D\r
+:104460008630F1F134C0883009F4A8C08B3009F4EB\r
+:10447000A5C02DC0863109F4A1C038F4803109F4FB\r
+:1044800072C0813109F479C022C0893109F496C023\r
+:104490008B3109F44DC01BC0853309F487C048F443\r
+:1044A000873209F483C008F473C0893209F47EC0EE\r
+:1044B0000EC0833438F48A3308F068C0883309F4B6\r
+:1044C0007DC005C0833409F471C0883499F080E060\r
+:1044D00008950E949A230E94CF100E94D4096EC0B2\r
+:1044E0008091D501817F8E7F8093D50181E080937B\r
+:1044F000E50108950E9452162FEF83ED90E32150BD\r
+:1045000080409040E1F700C000000E946A1D56C044\r
+:104510009091D501892F8095817080FB90F919F0D9\r
+:10452000966098601DC0997F977F9093D50146C093\r
+:104530009091D50191FB882780F921E0822780FBAB\r
+:1045400091F909C09091D50192FB882780F921E06B\r
+:10455000822780FB92F99093D501882379F19160AD\r
+:104560009093D50108959091D50193FB882780F908\r
+:1045700021E0822780FB93F9EECF0E9452168091B2\r
+:104580000D0191E0892780930D0118C027EC01C02F\r
+:1045900023EE280F61E070E080E090E004C0660F39\r
+:1045A000771F881F991F2A95D2F704C061E070E039\r
+:1045B00080E090E00E944C1A0E94521681E008951B\r
+:1045C00080E0089580E00895CF93C82F8091E501A1\r
+:1045D000813079F018F08230D1F184C0A0910E01C1\r
+:1045E000B0910F018C91813169F0823209F07CC069\r
+:1045F00009C0A0910E01B0910F018C91813111F091\r
+:10460000823249F48C2F0E94E02281111DC08C2F30\r
+:104610000E9424221AC08C2F0E94E222811114C011\r
+:10462000C43179F048F4CB3079F0C03109F060C082\r
+:1046300082E08093E50108C0C93219F0C83321F047\r
+:1046400057C01092E50154C081E0817053C0C93257\r
+:1046500089F118F5C43171F1A8F4C73009F046C0EA\r
+:104660008AE08093150194E19093140193E0909374\r
+:1046700013018093120188E08093110188E28093F6\r
+:10468000100134C0CE51C63088F5EC2FF0E0E65D65\r
+:10469000FE4F80818093E40129C0CE34E9F020F4FC\r
+:1046A000CB3421F56AE013C0C13579F0C235F1F49D\r
+:1046B00061E00DC08091E401882319F01092E401BB\r
+:1046C00015C081E08093E50115C061E006C08091CE\r
+:1046D000E4010E945E210AC06AE08091E4010E9428\r
+:1046E000D42104C01092E50180E004C081E002C042\r
+:1046F00080E0ABCFCF910895E1E8F0E08081886061\r
+:1047000080838081816080838FB7F89493E0909359\r
+:10471000890090ED909388008FBF0895EFE6F0E058\r
+:104720008081826080830895EFE6F0E080818D7F54\r
+:1047300080830895EFE6F0E0808192E0892780830E\r
+:1047400008951F920F920FB60F9211242F933F934B\r
+:104750004F935F936F937F938F939F93AF93BF9389\r
+:10476000EF93FF938091E6019091E701019690937A\r
+:10477000E7018093E601811103C082E00E94D40921\r
+:10478000E091E701E695E695F0E0E259FA4FE49111\r
+:104790008091E6018E1303C080E00E94D409FF914E\r
+:1047A000EF91BF91AF919F918F917F916F915F91A9\r
+:1047B0004F913F912F910F900FBE0F901F90189522\r
+:1047C00004D06894B1118DC0089570D088F09F57BF\r
+:1047D00090F0B92F9927B751A0F0D1F0660F771F4D\r
+:1047E000881F991F1AF0BA95C9F712C0B13081F02D\r
+:1047F00077D0B1E0089574C0672F782F8827B85F0D\r
+:1048000039F0B93FCCF3869577956795B395D9F78D\r
+:104810003EF490958095709561957F4F8F4F9F4F97\r
+:104820000895E89409C097FB3EF4909580957095A3\r
+:1048300061957F4F8F4F9F4F9923A9F0F92F96E9EC\r
+:10484000BB279395F695879577956795B795F11161\r
+:10485000F8CFFAF4BB0F11F460FF1BC06F5F7F4FFE\r
+:104860008F4F9F4F16C0882311F096E911C0772310\r
+:1048700021F09EE8872F762F05C0662371F096E819\r
+:10488000862F70E060E02AF09A95660F771F881FE8\r
+:10489000DAF7880F9695879597F9089557FD905800\r
+:1048A000440F551F59F05F3F71F04795880F97FBF4\r
+:1048B000991F61F09F3F79F08795089512161306AE\r
+:1048C0001406551FF2CF4695F1DF08C016161706DD\r
+:1048D0001806991FF1CF8695710561050894089512\r
+:1048E000E894BB2766277727CB0197F908950BD06B\r
+:1048F00078C069D028F06ED018F0952309F05AC01E\r
+:104900005FC01124EECFCADFA0F3959FD1F3950FBE\r
+:1049100050E0551F629FF001729FBB27F00DB11D43\r
+:10492000639FAA27F00DB11DAA1F649F6627B00DD3\r
+:10493000A11D661F829F2227B00DA11D621F739FBC\r
+:10494000B00DA11D621F839FA00D611D221F749FCA\r
+:104950003327A00D611D231F849F600D211D822F11\r
+:10496000762F6A2F11249F5750408AF0E1F0882358\r
+:104970004AF0EE0FFF1FBB1F661F771F881F915065\r
+:104980005040A9F79E3F510570F014C0AACF5F3F79\r
+:10499000ECF3983EDCF3869577956795B795F79598\r
+:1049A000E7959F5FC1F7FE2B880F911D9695879520\r
+:1049B00097F9089597F99F6780E870E060E008959F\r
+:1049C0009FEF80EC089500240A9416161706180627\r
+:1049D0000906089500240A94121613061406050603\r
+:1049E0000895092E0394000C11F4882352F0BB0F94\r
+:1049F00040F4BF2B11F460FF04C06F5F7F4F8F4FF7\r
+:104A00009F4F089597FB072E16F4009407D077FD6B\r
+:104A100009D00E941C2507FC05D03EF49095819595\r
+:104A20009F4F0895709561957F4F0895EE0FFF1F7A\r
+:104A30000590F491E02D0994AA1BBB1B51E107C01E\r
+:104A4000AA1FBB1FA617B70710F0A61BB70B881F1E\r
+:104A5000991F5A95A9F780959095BC01CD010895AD\r
+:104A6000F999FECF92BD81BDF89A992780B5089536\r
+:104A7000A8E1B0E042E050E00C945825262FF999C7\r
+:104A8000FECF92BD81BDF89A019700B4021639F0AD\r
+:104A90001FBA20BD0FB6F894FA9AF99A0FBE08957E\r
+:104AA0000196272F0E943F250C943E25DC01CB0167\r
+:104AB000FC01F999FECF06C0F2BDE1BDF89A31962E\r
+:104AC00000B40D9241505040B8F70895F894FFCFCC\r
+:104AD0002002D609630A400A0C0AD9090101C20161\r
+:104AE00028080A03140A3F4D36392F05E204AC04A6\r
+:104AF000730406041F04380451040102030405066C\r
+:044B00000708090099\r
 :00000001FF\r
index 842dc7ee19b90d83e17d9c73a1509fb7a02f391b..6465cd79e068b09800f2453b4b76281fedc94e21 100644 (file)
@@ -55,7 +55,7 @@ Finally, consider the turquoise text-nav keys. Here in the Symbols layer, these
 * The bright green keys are more F-keys
 * The dark yellow keys signal Web and Audio applications
 * The light yellow keys signal the operating system
-* The uncolored keys do nothing in case you bump them by accident
+* The dark gray keys do nothing in case you bump them by accident
 
 ![Ordinary media layout](ordinary-media.png)
 
@@ -67,14 +67,37 @@ Alas, the yellow keys have at best spotty success with common software. Good luc
 
 ## Switching Between Layers ##
 
-The three Shift keys correspond to three logical layers on top of the ever-present base layer, and are represented in the three LEDs on the keyboard: Capitals (red), Symbols (green), Media (blue). The color of a layer illuminates when the layer is active. Shift keys work in the expected way: press them and the keys shift to that layer; release them and the keys shift back to the base layer. The Ordinary Layout also features a Shift Lock key to keep a layer active indefinitely. Hold down the Shift Lock key then press any Shift key to lock to that layer. Or, hold down the Shift key and press the Shift Lock key; it works either way. To revert to the base layer, use the Shift Lock key again in combination with the Shift key.
+In addition to Symbols and Media there is the Capitals layer which is exactly the same as pressing the shift key. Each layer is accessed by a shift key on each edge of the keyboard and corresponds to one of the three LEDs on the keyboard: Capitals (red), Symbols (green), Media (blue). The color of a layer illuminates when the layer is active.
 
-This layout attempts to treat the Capitals Shift layer the same as the other two Shift layers, but internally they are different which causes some inconsistencies. For instance, it is possible to switch from any layer to any other layer, and to lock to any layer, *except* it is not possible to go from Media to Symbols. You must exit the Media layer before engaging the Symbols layer. Also, the Caps Lock feature must be triggered by first pressing the Shift Lock key then a Capitals Shift key; it doesn't work if you press the Shift key first (instead you get the secondary symbol character associated with the Shift Lock button).
+Shift buttons work in the expected way: press them and all of the keys switch to that layer; release them and the keys switch back to the base layer. If you press both of a pair of shift keys, the layer will lock on until you press both shift keys again. For instance, the widely and rightly loathed Caps Lock is engaged by pressing both Capitals Shift buttons. All the Shift keys work this way.
 
-## Special Escape & Backspace Sequences ##
+Multiple layers can be turned on at once. The Capitals layer will affect characters on other layers to capitalize. Other layers, however, don't 'mix': Symbols blankets the base layout; Media blankets Symbols.
 
-In the Ordinary Layout, the most unsatisfying key location is the Escape key which rightly belongs segregated on its own way up on the top left of the keyboard. The Ergodox does not have a physical button in such a location and the nearest one, in the top left corner, is home to the tilde (er, grave) which is commonly found there. The Escape key is important so it features prominently on the other top corner on the left side of the keyboard, and is always there in all layers. Nevertheless, alas, it isn't Ordinary to put the escape in that different corner!
+## Special Sequences ##
 
-That tilde key has a second function as the Shift Lock key and that makes possible a special feature. To make this layout as Ordinary as possible, the Escape key can *also* be accessed by pressing Shift Lock then the 1 button right next to it. This easy gesture is a way to partially maintain the ease of flicking your wrist to the left and tapping Escape. This gesture works in all layers.
+![Ordinary special layout](ordinary-special.png)
 
-Finally, because the special Escape sequence is so natural and useful, on the top right corner of the Ergodox EZ you can do the same gesture with the 0 key to produce a Backspace. Users of this keyboard and this layout are well advised to learn to use their thumbs for deleting text, but sometimes you are doing other computery things and just want to flick your digits up to the right and press backspace a bunch times. These special sequences should feel unremarkably mundane but might prove to be remarkably useful.
+### Escape ###
+
+The One True Location for the Escape key is segregated way up on the top left of the keyboard. The Ergodox does not have a physical button in such a location and the nearest one is home to the tilde (er, grave) which is commonly found there. In the Ordinary layout the Escape key is found on all layers in the prominent location in the corner next to the 5, whnich is easy to remember, and yet it isn't natural for those of us with muscle memory flicking our wrists up and to the left looking for Escape.
+
+The Ordinary layout offers as a consolation prize a Special sequence for Escape: Special Shift + 1. This is natural so you can tap the top left button, then the button next to it and get Escape. This gesture works in all layers.
+
+### Backspace ###
+
+At the top right corner of the Ergodox EZ you can a gesture similar to the special Escape sequence, using the 0 key, to produce a Backspace. Users of this keyboard and this layout are well advised to learn to use their thumbs for deleting text, but sometimes you are doing other computery things and just want to flick your digits up to the right and press backspace a bunch times.
+
+### RShift ###
+
+The Ordinary Layout locks layers by pressing both of a pair of shift keys. This interferes with the QMK firmware magic sequence, which is LShift+RShift. To work around this, both of the Capitals Shift keys produce a *Left Shift* keystroke. If for some reason a person needs *Right Shift* they can find it by pressing a Special Shift key, then the Capitals Shift key on the right side of the keyboard.
+
+****
+
+The Ordinary Layout for the Ergodox EZ keyboard, v4
+
+Modifications from default by Nicholas Keene ergodoxez@nicholaskeene.com
+
+No rights reserved. This software is in the public domain. Credit me if you are friendly but if you're a jerk don't bother.
+
+Details: readme.md
+         https://github.com/nrrkeene/qmk_firmware/tree/master/keyboard/ergodox_ez/keymaps/ordinary
index b3ed55f217af1968975a7cdb7f429fc890929a05..19e539006ac5771f494f59040f72d4099bc74666 100644 (file)
 #include "keymap_extras/keymap_spanish.h"
 #include "keymap_extras/keymap_bepo.h"
 
+
+/**
+* This layout was generated using the ErgodoxLayoutGenerator (ELG). You can download it from https://github.com/sboesebeck/ErgodoxLayoutGenerator/releases
+* documentation about it can be found here https://boesebeck.name/2016/04/16/ergodoxlayoutgenerator-documentation/
+* Thanks to the team of Erez Zukerman for building the great Ergodox-EZ!
+*
+* use at own risk!
+**/
+
 #define BASE 0
 #define SYMB 1
 #define MDIA 2
 #define EGOS 5
 
 #define SMLY_TOG_QUOT 0
+
 #define M_TOGGLE_5 1
+
 #define TGH_NUM 2
+
 #define M_DE_OSX_PLUS_CTRLALT 3
+
 #define SM_KISS 4
+
 #define SM_FROWN 5
+
 #define SM_CRY 6
+
 #define SM_SMILE 7
+
 #define SM_SMIRK 8
+
 #define M_LGUI_SHFT 9
+
 #define SM_HEART 10
+
 #define TOG_HLD_MDIA 11
+
 #define SM_LAUGH 12
+
 #define SM_SAD 13
+
 #define M_DE_OSX_CIRC_CTRLCMD 14
+
 #define M_MEH_SH_ACUT 15
 
+
 //Layout keymap.c generated with ErgodoxLayoutGenerator V1.0BETA1
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/**
+* Layer: BASE
+* /-------------------//-------------------//-------------------//-------------------//-------------------//-------------------//-------------------/                        /-------------------//-------------------//-------------------//-------------------//-------------------//-------------------//-------------------/                       
+* | ESC                | 1                  | 2                  | 3                  | 4                  | 5                  | Hold or toggle     |                       | Hold or toggle     | 6                  | 7                  | 8                  | 9                  | 0                  | ß                  |                      
+* |                    |                    |                    |                    |                    |                    | Layer NUMB         |                       | Layer MDIA         |                    |                    |                    |                    |                    |                    |                      
+* /-------------------//-------------------//-------------------//-------------------//-------------------//-------------------//-------------------/                        /-------------------//-------------------//-------------------//-------------------//-------------------//-------------------//-------------------/                       
+* | TAB                | Q                  | W                  | E                  | R                  | T                  | Cmd                |                       | Cmd                | Z                  | U                  | I                  | O                  | P                  | Ü                  |                      
+* |                    |                    |                    |                    |                    |                    |                    |                       |                    |                    |                    |                    |                    |                    |                    |                      
+* /-------------------//-------------------//-------------------//-------------------//-------------------//-------------------/\-------------------\                        \-------------------\/-------------------//-------------------//-------------------//-------------------//-------------------//-------------------/                       
+* | Alt                | A                  | S                  | D                  | F                  | G                  |                                                                 | H                  | J                  | K                  | L                  | Ö                  | Ä                  |                      
+* |                    |                    |                    |                    |                    |                    |                                                                 |                    |                    |                    |                    |                    | ALT                |                      
+* /-------------------//-------------------//-------------------//-------------------//-------------------//-------------------//-------------------/                        /-------------------//-------------------//-------------------//-------------------//-------------------//-------------------//-------------------/                       
+* | Shift              | Y                  | X                  | C                  | V                  | B                  | Alt                |                       | Alt                | N                  | M                  | ,                  | .                  | -                  | Shift              |                      
+* |                    | Ctrl               |                    |                    |                    |                    |                    |                       |                    |                    |                    |                    |                    | Ctrl               |                    |                      
+* \-------------------\\-------------------\\-------------------\\-------------------\\-------------------\\-------------------\\-------------------\                        \-------------------\\-------------------\\-------------------\\-------------------\\-------------------\\-------------------\\-------------------\                       
+*                                                                                                                                                                                                                                                                                                                                                      
+*                                                                                                                                                                                                                                                                                                                                                      
+*                                           /-------------------//-------------------//-------------------//-------------------//-------------------/                                                                                       /-------------------//-------------------//-------------------//-------------------//-------------------/  
+*                                           | <                  | LongPress / Type   | LongPress / Type   | Shift+Ctrl         | Type               |                                                                                      | #                  | ACUT               | CMD+Shift          | ALT+Shift          | +                  | 
+*                                           | SYMB               | DE_OSX_CIRC_CTRLCMD| DE_OSX_PLUS_CTRAlt |                    | Toggle SMLY        |                                                                                      | Meh                | Hyper              |                    |                    | SYMB               | 
+*                                           \-------------------\\-------------------\\-------------------\\-------------------\/-------------------//-------------------/   /-------------------//-------------------/                     \-------------------\\-------------------\\-------------------\\-------------------\\-------------------\  
+*                                                                                                                               | HOME               | END                |  | LEFT               | RIGHT              |                                                                                                                               
+*                                                                                                                               |                    |                    |  |                    |                    |                                                                                                                               
+*                                                                                                                               \-------------------\/-------------------/   /-------------------/\-------------------\                                                                                                                                
+*                                                                                                                                                    | PGUP               |  | UP                 |                                                                                                                                                    
+*                                                                                                                                                    |                    |  |                    |                                                                                                                                                    
+*                                                                                                          /-------------------//-------------------//-------------------/   /-------------------//-------------------//-------------------/                                                                                                           
+*                                                                                                          | BSPC               | DEL                | PGDN               |  | DOWN               | ENT                | SPC                |                                                                                                          
+*                                                                                                          |                    |                    |                    |  |                    |                    |                    |                                                                                                          
+*                                                                                                          \-------------------\\-------------------\\-------------------\   \-------------------\\-------------------\\-------------------\                                                                                                           
+*                                                                                                                                                                                                                                                                                                                                                      
+* 
+**/
 [BASE]=KEYMAP(
 //left half
     KC_ESC, DE_OSX_1, DE_OSX_2, DE_OSX_3, DE_OSX_4, DE_OSX_5, M(TGH_NUM), 
@@ -60,6 +118,39 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     KC_LEFT, KC_RIGHT, 
     KC_UP, 
     KC_DOWN, KC_ENT, KC_SPC),
+/**
+* Layer: SYMB
+* /-----------//-----------//-----------//-----------//-----------//-----------//-----------/                /-----------//-----------//-----------//-----------//-----------//-----------//-----------/               
+* | APPLICATION| F1         | F2         | F3         | F4         | F5         | F5         |               | F6         | F6         | F7         | F8         | F9         | F10        | F11        |              
+* |            |            |            |            |            |            |            |               |            |            |            |            |            |            |            |              
+* /-----------//-----------//-----------//-----------//-----------//-----------//-----------/                /-----------//-----------//-----------//-----------//-----------//-----------//-----------/               
+* |            | <          | >          | !          | ?          |            |            |               |            | \          | [          | ]          | <          | >          | !          |              
+* |            |            |            |            |            |            |            |               |            |            |            |            |            |            |            |              
+* /-----------//-----------//-----------//-----------//-----------//-----------/\-----------\                \-----------\/-----------//-----------//-----------//-----------//-----------//-----------/               
+* |            | #          | $          | \          | /          | .          |                                         | /          | (          | )          | {          | }          | #          |              
+* |            |            |            |            |            |            |                                         |            |            |            |            |            |            |              
+* /-----------//-----------//-----------//-----------//-----------//-----------//-----------/                /-----------//-----------//-----------//-----------//-----------//-----------//-----------/               
+* |            |            | <          | %          | |          | ~          |            |               |            | |          | ~          |            |            |            |            |              
+* |            |            |            |            |            |            |            |               |            |            |            |            |            |            |            |              
+* \-----------\\-----------\\-----------\\-----------\\-----------\\-----------\\-----------\                \-----------\\-----------\\-----------\\-----------\\-----------\\-----------\\-----------\               
+*                                                                                                                                                                                                                      
+*                                                                                                                                                                                                                      
+*                           /-----------//-----------//-----------//-----------//-----------/                                                       /-----------//-----------//-----------//-----------//-----------/  
+*                           |            |            |            |            |            |                                                      | '          | DQOT       |            | Toggle 5   |            | 
+*                           |            |            |            |            |            |                                                      |            |            |            |            |            | 
+*                           \-----------\\-----------\\-----------\\-----------\/-----------//-----------/   /-----------//-----------/             \-----------\\-----------\\-----------\\-----------\\-----------\  
+*                                                                               |            |            |  | F13        | F12        |                                                                               
+*                                                                               |            |            |  |            |            |                                                                               
+*                                                                               \-----------\/-----------/   /-----------/\-----------\                                                                                
+*                                                                                            |            |  | F14        |                                                                                            
+*                                                                                            |            |  |            |                                                                                            
+*                                                                  /-----------//-----------//-----------/   /-----------//-----------//-----------/                                                                   
+*                                                                  |            | DEL        |            |  | F15        |            |            |                                                                  
+*                                                                  |            |            |            |  |            |            |            |                                                                  
+*                                                                  \-----------\\-----------\\-----------\   \-----------\\-----------\\-----------\                                                                   
+*                                                                                                                                                                                                                      
+* 
+**/
 [SYMB]=KEYMAP(
 //left half
     KC_APPLICATION, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F5, 
@@ -79,6 +170,39 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     KC_F13, KC_F12, 
     KC_F14, 
     KC_F15, KC_TRNS, KC_TRNS),
+/**
+* Layer: MDIA
+* /-----//-----//-----//-----//-----//-----//-----/          /-----//-----//-----//-----//-----//-----//-----/         
+* |      |      |      |      |      |      |      |         |      |      |      |      |      |      |      |        
+* |      |      |      |      |      |      |      |         |      |      |      |      |      |      |      |        
+* /-----//-----//-----//-----//-----//-----//-----/          /-----//-----//-----//-----//-----//-----//-----/         
+* |      |      | BTN1 | U    | BTN2 | U    |      |         |      |      |      |      |      |      |      |        
+* |      |      |      |      |      |      |      |         |      |      |      |      |      |      |      |        
+* /-----//-----//-----//-----//-----//-----/\-----\          \-----\/-----//-----//-----//-----//-----//-----/         
+* |      |      | L    | D    | R    | D    |                       |      |      |      |      |      |      |        
+* |      |      |      |      |      |      |                       |      |      |      |      |      |      |        
+* /-----//-----//-----//-----//-----//-----//-----/          /-----//-----//-----//-----//-----//-----//-----/         
+* |      |      | L    | D    | R    | BTN3 |      |         |      |      |      |      |      | UP   |      |        
+* |      |      |      |      |      |      |      |         |      |      |      |      |      |      |      |        
+* \-----\\-----\\-----\\-----\\-----\\-----\\-----\          \-----\\-----\\-----\\-----\\-----\\-----\\-----\         
+*                                                                                                                      
+*                                                                                                                      
+*               /-----//-----//-----//-----//-----/                               /-----//-----//-----//-----//-----/  
+*               |      |      |      |      |      |                              |      |      | LEFT | DOWN | RIGHT| 
+*               |      |      |      |      |      |                              |      |      |      |      |      | 
+*               \-----\\-----\\-----\\-----\/-----//-----/   /-----//-----/       \-----\\-----\\-----\\-----\\-----\  
+*                                           |      |      |  | MPRV | MNXT |                                           
+*                                           |      |      |  |      |      |                                           
+*                                           \-----\/-----/   /-----/\-----\                                            
+*                                                  |      |  | VOLU |                                                  
+*                                                  |      |  |      |                                                  
+*                                    /-----//-----//-----/   /-----//-----//-----/                                     
+*                                    |      |      |      |  | VOLD | MUTE | MPLY |                                    
+*                                    |      |      |      |  |      |      |      |                                    
+*                                    \-----\\-----\\-----\   \-----\\-----\\-----\                                     
+*                                                                                                                      
+* 
+**/
 [MDIA]=KEYMAP(
 //left half
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 
@@ -90,14 +214,47 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                                      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),
+    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_UP, KC_TRNS, 
+                         KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, 
+    KC_MPRV, KC_MNXT, 
+    KC_VOLU, 
+    KC_VOLD, KC_MUTE, KC_MPLY),
+/**
+* Layer: SMLY
+* /--------//--------//--------//--------//--------//--------//--------/             /--------//--------//--------//--------//--------//--------//--------/            
+* |         |         |         |         |         |         |         |            | Typing  | Typing  | Typing  |         |         |         |         |           
+* |         |         |         |         |         |         |         |            | SM_SMILE| SM_SMIRK| SM_LAUGH|         |         |         |         |           
+* /--------//--------//--------//--------//--------//--------//--------/             /--------//--------//--------//--------//--------//--------//--------/            
+* |         |         |         |         |         |         |         |            |         | Typing  | Typing  | Typing  |         |         |         |           
+* |         |         |         |         |         |         |         |            |         | SM_FROWN| SM_SAD  | SM_CRY  |         |         |         |           
+* /--------//--------//--------//--------//--------//--------/\--------\             \--------\/--------//--------//--------//--------//--------//--------/            
+* |         |         |         |         |         |         |                                | Typing  | Typing  |         |         |         |         |           
+* |         |         |         |         |         |         |                                | SM_HEART| SM_KISS |         |         |         |         |           
+* /--------//--------//--------//--------//--------//--------//--------/             /--------//--------//--------//--------//--------//--------//--------/            
+* |         |         |         |         |         |         |         |            |         |         |         |         |         |         |         |           
+* |         |         |         |         |         |         |         |            |         |         |         |         |         |         |         |           
+* \--------\\--------\\--------\\--------\\--------\\--------\\--------\             \--------\\--------\\--------\\--------\\--------\\--------\\--------\            
+*                                                                                                                                                                      
+*                                                                                                                                                                      
+*                     /--------//--------//--------//--------//--------/                                           /--------//--------//--------//--------//--------/  
+*                     |         |         |         |         |         |                                          |         |         |         |         |         | 
+*                     |         |         |         |         |         |                                          |         |         |         |         |         | 
+*                     \--------\\--------\\--------\\--------\/--------//--------/   /--------//--------/          \--------\\--------\\--------\\--------\\--------\  
+*                                                             |         |         |  |         |         |                                                             
+*                                                             |         |         |  |         |         |                                                             
+*                                                             \--------\/--------/   /--------/\--------\                                                              
+*                                                                       |         |  |         |                                                                       
+*                                                                       |         |  |         |                                                                       
+*                                                   /--------//--------//--------/   /--------//--------//--------/                                                    
+*                                                   |         |         |         |  |         |         |         |                                                   
+*                                                   |         |         |         |  |         |         |         |                                                   
+*                                                   \--------\\--------\\--------\   \--------\\--------\\--------\                                                    
+*                                                                                                                                                                      
+* 
+**/
 [SMLY]=KEYMAP(
 //left half
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 
@@ -117,6 +274,39 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     KC_TRNS, KC_TRNS, 
     KC_TRNS, 
     KC_TRNS, KC_TRNS, KC_TRNS),
+/**
+* Layer: NUMB
+* /----//----//----//----//----//----//----/         /----//----//----//----//----//----//----/        
+* |     |     |     |     |     |     |     |        |     | F6  | F7  | F8  | F9  | F10 | F11 |       
+* |     |     |     |     |     |     |     |        |     |     |     |     |     |     |     |       
+* /----//----//----//----//----//----//----/         /----//----//----//----//----//----//----/        
+* |     |     |     | UP  |     |     |     |        |     | /   | 7   | 8   | 9   | *   | F12 |       
+* |     |     |     |     |     |     |     |        |     |     |     |     |     |     |     |       
+* /----//----//----//----//----//----/\----\         \----\/----//----//----//----//----//----/        
+* |     |     | LEFT| DOWN| RGHT|     |                    | /   | 4   | 5   | 6   | +   | -   |       
+* |     |     |     |     |     |     |                    |     |     |     |     |     |     |       
+* /----//----//----//----//----//----//----/         /----//----//----//----//----//----//----/        
+* |     |     |     |     |     |     |     |        |     | %   | 1   | 2   | 3   |     |     |       
+* |     |     |     |     |     |     |     |        |     |     |     |     |     |     |     |       
+* \----\\----\\----\\----\\----\\----\\----\         \----\\----\\----\\----\\----\\----\\----\        
+*                                                                                                      
+*                                                                                                      
+*             /----//----//----//----//----/                           /----//----//----//----//----/  
+*             |     |     |     |     |     |                          | 0   | .   | ,   | =   |     | 
+*             |     |     |     |     |     |                          |     |     |     |     |     | 
+*             \----\\----\\----\\----\/----//----/   /----//----/      \----\\----\\----\\----\\----\  
+*                                     |     |     |  |     |     |                                     
+*                                     |     |     |  |     |     |                                     
+*                                     \----\/----/   /----/\----\                                      
+*                                           |     |  |     |                                           
+*                                           |     |  |     |                                           
+*                               /----//----//----/   /----//----//----/                                
+*                               |     |     |     |  |     |     |     |                               
+*                               |     |     |     |  |     |     |     |                               
+*                               \----\\----\\----\   \----\\----\\----\                                
+*                                                                                                      
+* 
+**/
 [NUMB]=KEYMAP(
 //left half
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 
@@ -136,6 +326,39 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     KC_TRNS, KC_TRNS, 
     KC_TRNS, 
     KC_TRNS, KC_TRNS, KC_TRNS),
+/**
+* Layer: EGOS
+* /--------//--------//--------//--------//--------//--------//--------/             /--------//--------//--------//--------//--------//--------//--------/            
+* |         |         |         |         |         |         |         |            |         |         |         |         |         |         |         |           
+* |         |         |         |         |         |         |         |            |         |         |         |         |         |         |         |           
+* /--------//--------//--------//--------//--------//--------//--------/             /--------//--------//--------//--------//--------//--------//--------/            
+* |         |         |         |         |         |         |         |            |         |         |         |         |         |         |         |           
+* |         |         |         |         |         |         |         |            |         |         |         |         |         |         |         |           
+* /--------//--------//--------//--------//--------//--------/\--------\             \--------\/--------//--------//--------//--------//--------//--------/            
+* | Shift   |         |         |         |         |         |                                |         |         |         |         |         |         |           
+* |         |         |         |         |         |         |                                |         |         |         |         |         |         |           
+* /--------//--------//--------//--------//--------//--------//--------/             /--------//--------//--------//--------//--------//--------//--------/            
+* |         |         |         |         |         |         |         |            |         |         |         |         |         |         |         |           
+* |         |         |         |         |         |         |         |            |         |         |         |         |         |         |         |           
+* \--------\\--------\\--------\\--------\\--------\\--------\\--------\             \--------\\--------\\--------\\--------\\--------\\--------\\--------\            
+*                                                                                                                                                                      
+*                                                                                                                                                                      
+*                     /--------//--------//--------//--------//--------/                                           /--------//--------//--------//--------//--------/  
+*                     | Ctrl    |         |         |         |         |                                          |         |         |         | Toggle 5|         | 
+*                     |         |         |         |         |         |                                          |         |         |         |         |         | 
+*                     \--------\\--------\\--------\\--------\/--------//--------/   /--------//--------/          \--------\\--------\\--------\\--------\\--------\  
+*                                                             | F1      | F2      |  |         |         |                                                             
+*                                                             |         |         |  |         |         |                                                             
+*                                                             \--------\/--------/   /--------/\--------\                                                              
+*                                                                       | F3      |  |         |                                                                       
+*                                                                       |         |  |         |                                                                       
+*                                                   /--------//--------//--------/   /--------//--------//--------/                                                    
+*                                                   | SPC     | Ctrl    | F4      |  |         |         |         |                                                   
+*                                                   |         |         |         |  |         |         |         |                                                   
+*                                                   \--------\\--------\\--------\   \--------\\--------\\--------\                                                    
+*                                                                                                                                                                      
+* 
+**/
 [EGOS]=KEYMAP(
 //left half
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 
@@ -259,7 +482,7 @@ case M_LGUI_SHFT:
 if (record->event.pressed){
                        return MACRO(DOWN(KC_LGUI),DOWN(KC_LSFT),END);
                }else{
-                       return MACRO(UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),U(LGUI),U(LSFT),END);
+                       return MACRO(UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),UP(KC_LGUI),UP(KC_LSFT),U(LGUI),U(LSFT),END);
                }
 
 break;
diff --git a/keyboard/ergodox_ez/keymaps/osx_de_experimental/osx_de_experimental.hex b/keyboard/ergodox_ez/keymaps/osx_de_experimental/osx_de_experimental.hex
new file mode 100644 (file)
index 0000000..3c7ab58
--- /dev/null
@@ -0,0 +1,1247 @@
+:100000000C9430040C9474040C9474040C947404D4
+:100010000C9474040C9474040C9474040C94740480
+:100020000C9474040C9474040C94680F0C943A109F
+:100030000C9474040C9474040C9474040C94740460
+:100040000C9474040C9404250C9474040C9474049F
+:100050000C9474040C94931E0C9474040C94740407
+:100060000C9474040C9474040C9474040C94740430
+:100070000C9474040C9474040C9474040C94740420
+:100080000C9474040C9474040C9474040C94740410
+:100090000C9474040C9474040C9474040C94740400
+:1000A0000C9474040C9474040C9474048404BE04BE
+:1000B000D004F2040A05100516051C0522052805C2
+:1000C0002D0533055D05620567057E05A710C9107E
+:1000D000B711C910B7110E113111B711861199114D
+:1000E00085148514C214C214051543155C175C17DA
+:1000F0005C155C175D165D1630175C175C174717AB
+:1001000002E002E2012E022E02E10002E002E10220
+:10011000E20001E001E101E20002E002E301640229
+:10012000640002E002E30001E001E30001E10137C5
+:10013000023702E10138023801E10125022502E11E
+:100140000001E10137023702E10138023801E10123
+:1001500007020702E10001350235012002200002FA
+:10016000E302E102E302E102E302E102E302E1026F
+:10017000E302E102E302E102E302E102E302E1025F
+:10018000E302E102E302E102E302E102E302E1024F
+:10019000E302E102E302E102E302E102E302E1023F
+:1001A000E302E102E302E102E302E102E302E1022F
+:1001B000E302E102E302E102E302E102E302E1021F
+:1001C000E302E102E302E102E302E102E302E1020F
+:1001D000E302E102E302E102E302E102E302E102FF
+:1001E000E302E102E302E102E302E102E302E102EF
+:1001F000E302E102E302E10001E301E10001E101C8
+:1002000036023602E10138023801E10126022602F7
+:10021000E10001E10137023702E10138023801E172
+:100220000126022602E10001E10136023602E10167
+:1002300038023801E10125022502E10001E1013720
+:10024000023702E10138023801E20125022502E20B
+:100250000001E10137023702E10138023801E10112
+:1002600030023002E10002E002E20130023000021E
+:10027000E002E20001E001E20001E10131023102AD
+:10028000E10029002B00E200E100358100001E00A2
+:10029000140004001D710E304E001F001A001600DD
+:1002A0001B0003304C002000080007000600E0029D
+:1002B0002A00210015000900190000304B0022001F
+:1002C00017000A00050000004A000230E3000000A9
+:1002D000E20000004D000B30E7000000E6000000E7
+:1002E000500023001C000B00110000004F002400F0
+:1002F00018000D0010003177520025000C000E0090
+:1003000036002E7F2C00260012000F003700E10877
+:1003100028002700130033003871E10451002D003C
+:100320002F003474E50030810000650001000100F9
+:100330000100010000003A00350031000100010019
+:1003400001003B0035022102350001004C003C0059
+:100350001E0224062202010001003D002D0224029B
+:100360002404010001003E000100370011040000D8
+:1003700001003E00010000000100000001003F00FC
+:10038000010000000100000068003F002406240274
+:10039000240400004500400022042502110431021B
+:1003A000690041002304260201001F0201004200EF
+:1003B0003500250401000100010043003502260438
+:1003C000010001306A0044001E02310001000100FA
+:1003D0000000010001000100010001000000010017
+:1003E000010001000100010001000100F400F20021
+:1003F000FB00010001000100F000F100FA00010023
+:1004000001000100F500F300FC0001000100010003
+:10041000F900FA00F60000000100010001000000F0
+:1004200001000000010001000100000001000000C7
+:10043000AC0001000100010001000000AB00010060
+:100440000100010001000100A900010001000100FC
+:1004500001000100AE000100010001000100500098
+:10046000A80001000100010052005100AA00010093
+:100470000100010001004F00000001000100010027
+:100480000100010000000100010001000100010065
+:100490000100010001000100010001000100010054
+:1004A0000100010001000100010001000100010044
+:1004B0000100010001000100010001000100000035
+:1004C00001000100010000000100000001000730F0
+:1004D00001000000010000000100083005300A3072
+:1004E0000100000001000C300D300430010001005B
+:1004F00001000100063001000100010001000100BF
+:1005000001000100010001000100010001000100E3
+:1005100001000100010001000100010001000100D3
+:1005200000000100010001000100010000000100C5
+:100530000100010001000100010001000100500064
+:100540000100010001000100520051000100010002
+:100550000100010001004F00010001000100010045
+:100560000100010001000000010001000100000085
+:100570000100000001000100010000000100000076
+:1005800001003F002402240222020000010040007A
+:10059000240021001E002700010041002500220048
+:1005A0001F00370001004200260023002000360013
+:1005B0000100430030023000010027020100440026
+:1005C0004500380001000100000001000100E100C9
+:1005D0000100E00000000100010001000100010035
+:1005E0003D0001000100010001000100E0000100E8
+:1005F00001000100010001002C00010001000100C8
+:10060000010001003C0001000100010001000000A8
+:100610003A00010001000000010000003B00010061
+:1006200001000000010000000100010001000100C4
+:1006300001000000010001000100010001000100B3
+:1006400001000100010001000100010001000100A2
+:100650000100010001000100010001000100010092
+:100660000100013001000100010001000100010052
+:10067000000016034500720067006F0044006F0021
+:100680007800200045005A00000016034500720063
+:1006900067006F0044006F007800200045005A009A
+:1006A00000000403090409026D00040100A0FA0916
+:1006B0000400000103010100092111010001223F92
+:1006C000000705810308000A090401000103010273
+:1006D00000092111010001224D00070582030800D5
+:1006E0000A090402000103000000092111010001B0
+:1006F0002236000705830308000A090403000103EA
+:1007000000000009211101000122390007058403BE
+:100710001000011201100100000008EDFE07130196
+:10072000000102000105010906A101050719E029E0
+:10073000E7150025019508750181020508190129B1
+:10074000059505750191029501750391010507193C
+:1007500000297715002501957875018102C00501F2
+:100760000980A101850216010026B7001A01002A9E
+:10077000B700751095018100C0050C0901A1018524
+:1007800003160100269C021A01002A9C027510958E
+:10079000018100C005010902A1010901A1000509AB
+:1007A000190129051500250195057501810295019D
+:1007B000750381010501093009311581257F9502F5
+:1007C0007508810609381581257F95017508810610
+:1007D000050C0A38021581257F950175088106C030
+:1007E000C005010906A101050719E029E715002543
+:1007F00001950875018102950175088101050819A7
+:100800000129059505750191029501750391010571
+:1008100007190029FF150025FF950675088100C0FE
+:100820000000000000000000000000010204060AB1
+:100830000F17202C3A4A5D71879DB3C7DAE9F5FCA2
+:10084000FFFCF5E9DAC7B39D87715D4A3A2C2017A2
+:100850000F0A060402010000000000000000000072
+:1008600011241FBECFEFDAE0DEBFCDBF04B603FE1A
+:1008700024C08091F0019091F101A091F201B0911A
+:10088000F3018730904BA740B04BB9F41092F001C0
+:100890001092F1011092F2011092F30114BE84B78C
+:1008A000877F84BF88E10FB6F89480936000109230
+:1008B00060000FBEE0E0FFE3099511E0A0E0B1E0C9
+:1008C000E6E9FDE402C005900D92A433B107D9F723
+:1008D00011E0A4E3B1E001C01D92A03FB107E1F730
+:1008E0000E94AC0C0C94C9260C940000462F50E0DA
+:1008F0004031510508F01FC1DC01FA01EA5AFF4FEF
+:1009000012968C910C9479268823A9F00E945D1E82
+:1009100090933501809334018091B3019091B4019B
+:10092000A091B501B091B60128E08227887099277F
+:10093000AA27BB27AEC08091B3019091B401A091CA
+:10094000B501B091B60128E0822788709927AA27BF
+:10095000BB278093B3019093B401A093B501B093EA
+:10096000B60180913401909135010E94691E87394A
+:1009700091050CF0E0C089E792E00895882309F41E
+:10098000DAC08091B3019091B401A091B501B0910A
+:10099000B60120E2822780729927AA27BB2779C057
+:1009A000882339F00E945D1E9093350180933401B5
+:1009B0000AC080913401909135010E94691E8739E7
+:1009C00091050CF4B8C08091B3019091B401A0914D
+:1009D000B501B091B60120E1822780719927AA273D
+:1009E000BB2757C0882349F00E945D1E90933501B4
+:1009F0008093340184E792E00895809134019091CE
+:100A000035010E94691E873991050CF08EC086E67B
+:100A100092E00895882309F48EC081E592E008955C
+:100A2000882309F488C08CE392E00895882309F4B0
+:100A300082C087E292E00895882309F47CC082E1B5
+:100A400092E00895882309F476C08DEF91E008952F
+:100A500081116EC08FE591E00895882309F46BC081
+:100A600086E591E008958823E9F00E945D1E909349
+:100A70003501809334018091B3019091B401A0912C
+:100A8000B501B091B60124E0822784709927AA2786
+:100A9000BB278093B3019093B401A093B501B093A9
+:100AA000B60149C080913401909135010E94691EC0
+:100AB000873991050CF43FC0DECF8823E1F181E452
+:100AC00091E008958823B9F18CE291E0089588239C
+:100AD00049F00E945D1E909335018093340187E2B6
+:100AE00091E0089580913401909135010E94691E32
+:100AF000873991051CF589E191E00895882349F033
+:100B00000E945D1E909335018093340182E191E053
+:100B1000089580913401909135010E94691E8739B2
+:100B200091057CF480E091E008958FE692E00895CD
+:100B300088EF91E0089580E090E0089582E291E0EE
+:100B400008958BE091E0089508956091B30170914C
+:100B5000B4018091B5019091B6010E94BF1D5698D5
+:100B60005E9825982D9826982E9827982F98823051
+:100B700061F018F4813031F00895843069F08530E7
+:100B800039F00895259A2D9A0895269A2E9A089557
+:100B9000259A2D9A269A2E9A279A2F9A08950C9480
+:100BA000A50556985E9825982D9826982E982798F2
+:100BB0002F988FEF90E09093890080938800909316
+:100BC0008B0080938A0090938D0080938C00259AEF
+:100BD0002D9A2FEF80E792E0215080409040E1F77E
+:100BE00000C00000269A2E9A2FEF80E792E0215055
+:100BF00080409040E1F700C00000279A2F9A2FEF25
+:100C000080E792E0215080409040E1F700C0000072
+:100C100025982D982FEF80E792E02150804090405A
+:100C2000E1F700C0000026982E982FEF80E792E0B1
+:100C3000215080409040E1F700C0000027982F9895
+:100C400056985E9825982D9826982E9827982F9834
+:100C5000089589EA8093800089E080938100249838
+:100C60002C983F988AB18F748AB96E98479A8BB145
+:100C7000806B8BB9769A0E94D1050C94A40580E212
+:100C8000809300018091360181110EC00E948E0672
+:100C900081E0809336012FEF83ED90E32150804077
+:100CA0009040E1F700C0000080E40E949406809329
+:100CB000000181112EC00E94BE06809300018111A7
+:100CC00028C00E94BE0680930001811122C08FE3DC
+:100CD0000E94BE068093000181111BC00E94B606CF
+:100CE00080E40E94940680930001811112C08CE080
+:100CF0000E94BE068093000181110BC00E94BE06B7
+:100D000080930001811105C08FE30E94BE0680938D
+:100D100000010E94B6068091000108951092B9006A
+:100D20008AE08093B800089594EA9093BC00909173
+:100D3000BC0097FFFCCF9091B900987F983021F0CC
+:100D4000903111F081E008958093BB0084E8809396
+:100D5000BC008091BC0087FFFCCF8091B900887FE8
+:100D6000883111F0803471F780E0089584E9809330
+:100D7000BC008091BC0084FDFCCF08958093BB0033
+:100D800084E88093BC008091BC0087FFFCCF9091E9
+:100D9000B900987F81E0983209F480E0089584E8F2
+:100DA0008093BC008091BC0087FFFCCF8091BB008A
+:100DB000089580910001811115C080E40E9494067D
+:100DC0008093000181110CC082E10E94BE068093D5
+:100DD0000001811105C08FEF0E94BE0680930001C3
+:100DE0000E94B60684B1807F84B985B1807F85B9C1
+:100DF0008AB1837F8AB98BB1837F8BB93E9846983D
+:100E000008950E943F06809300010E94D90680B396
+:100E10008C7080BB81B3836F81BBA8E3B1E0E6E453
+:100E2000F1E08EE08E0F11921D928E13FCCF0C9488
+:100E30002906BF92CF92DF92EF92FF920F931F93FA
+:100E4000CF93DF9380910001882379F0809137015F
+:100E50008F5F80933701811108C00E943F06809305
+:100E60000001811102C00E94D10508E311E0C0E039
+:100E7000D0E0DD24D39482E0C82EEE24E394F12C5C
+:100E8000C730D10500F580910001811164C080E474
+:100E90000E94940680930001811112C082E10E9499
+:100EA000BE068093000181110BC0C7010C2E01C04A
+:100EB000880F0A94EAF780950E94BE06809300018D
+:100EC0000E94B60648C0CA30A1F028F4C83059F0D4
+:100ED000C93061F005C0CC3089F070F0CD3089F0B8
+:100EE000209A289810C0219A29980DC0229A2A98F1
+:100EF0000AC0239A2B9807C0529A01C0539A5B9854
+:100F000002C03E9A469890EA9A95F1F79FB1799976
+:100F100002C082E001C080E091709D25982B7C99F1
+:100F200002C084E001C080E0892B7D9902C038E0D6
+:100F300001C030E0832B7E9902C020E101C020E097
+:100F4000822B9FB19095991F9927991F9295990F80
+:100F5000907E892B0FC080910001811149C080E4EF
+:100F60000E94940680930001882379F1B12C0E949D
+:100F7000B6068B2DF8019081981719F08083C092E6
+:100F800001010E94D90621960F5F1F4FCE30D10577
+:100F900009F076CF80910101882361F1815080931F
+:100FA0000101882339F08FE99FE00197F1F700C034
+:100FB000000020C0A6E4B1E0E8E3F1E0CF01825FE9
+:100FC00091919D938E13FCCF15C083E10E94BE06C4
+:100FD000809300018111CACF81E40E94940680931E
+:100FE00000018111C3CF0E94CF06B82EB094BFCFAD
+:100FF00080E0C0CF0E94CF0581E0DF91CF911F91AB
+:101000000F91FF90EF90DF90CF90BF900895E82F61
+:10101000F0E0EA5BFE4F808108950895089596E020
+:10102000799FF001112494E5899FE00DF11D1124B1
+:10103000E60FF11DEE0FFF1FEE57FD4F85919491C6
+:101040000895880F991FFC01EE5FFE4F85919491E2
+:101050000895880F991FFC01EE57FD4F85919491DB
+:1010600008950F931F93CF93DF93EC018115904365
+:1010700050F5C11580E2D80708F0B3C0CB3BD105CD
+:1010800090F4C83AD10508F05AC0C53AD10508F025
+:101090004BC0C430D10508F0BBC1219709F0B5C1E0
+:1010A00001E010E0F5C1CF3FD10511F008F0B0C16B
+:1010B000C03FD10508F092C0CE01805E910908972B
+:1010C00008F4A6C1A2C1C11591E5D907A8F4C230A0
+:1010D00020E5D20708F09EC0C11580E5D80709F4C5
+:1010E00085C008F091C0C11520E4D20708F08DC179
+:1010F000DD278E01106CCCC1C11580E8D80758F4EB
+:10110000C11590E7D90708F07CC1C11520E6D207C8
+:1011100008F422C17AC1C11580E9D80708F075C169
+:10112000DF708E01106AB4C1C53AD10509F472C1ED
+:10113000C63AD10509F071C102E810E4A9C1C83A64
+:10114000D10509F46DC1C93AD10509F46CC1CA3A97
+:10115000D10509F46BC1CB3AD10509F46AC1CC3A87
+:10116000D10509F469C1CD3AD10509F468C1C03B84
+:10117000D10509F467C1CE3AD10509F466C1CF3A69
+:10118000D10509F465C1C13BD10509F464C1C23B75
+:10119000D10509F463C1C33BD10509F462C1C43B65
+:1011A000D10509F461C1C53BD10509F460C1C63B55
+:1011B000D10509F45FC1C73BD10509F45EC1C83B45
+:1011C000D10509F45DC1C93BD10509F45CC1CA3B35
+:1011D000D10509F45BC100E014E45AC18E01106529
+:1011E00057C1CE019F700E94290853C10E948017E9
+:1011F0009FEF24E38CE0915020408040E1F700C055
+:1012000000000E94B81E44C18091CF01816080938C
+:10121000CF013EC10E946120811102C00E9447207F
+:101220000E947E2090E09093F0018093EF01C23005
+:1012300090E5D90721F48091EF01816086C0C43028
+:1012400020E5D20721F48091EF0182607EC0C63094
+:1012500080E5D80721F48091EF01846076C0C83022
+:1012600090E5D90719F48091EF0127C0CA3020E535
+:10127000D20721F48091EF01806167C0CC3080E516
+:10128000D80721F48091EF0180625FC0CE3090E5F5
+:10129000D90721F48091EF01806457C0C03120E567
+:1012A000D20721F48091EF0180684FC0C23180E500
+:1012B000D80729F48091EF018460886046C0C3306C
+:1012C00090E5D90721F48091EF018E7F3EC0C530B3
+:1012D00020E5D20721F48091EF018D7F36C0C73021
+:1012E00080E5D80721F48091EF018B7F2EC0C930B3
+:1012F00090E5D90719F48091EF0126C0CB3020E5A5
+:10130000D20721F48091EF018F7E1FC0CD3080E5A0
+:10131000D80721F48091EF018F7D17C0CF3090E581
+:10132000D90721F48091EF018F7B0FC0C13120E5F7
+:10133000D20721F48091EF018F7707C0C331D045E8
+:1013400031F48091EF018B7F877F8093EF01809153
+:10135000EF010E9482209CC08D2F99278F709927C2
+:1013600081309105D9F49E012370332702C0880F84
+:10137000991F2A95E2F79C688E0144E0000F111F27
+:101380004A95E1F700271370802B912B53E0CC0F87
+:10139000DD1F5A95E1F7C076DD272FC08230910519
+:1013A00031F4DC2FCC278E01016F106A71C08330BD
+:1013B000910569F4CE018370992701E010E002C025
+:1013C000000F111F8A95E2F7C8019C680FC00497AF
+:1013D00009F05EC0CE018370992701E010E002C0E1
+:1013E000000F111F8A95E2F7C8019A6823E0CC0F1D
+:1013F000DD1F2A95E1F7C07ED7708C010C2B1D2BC9
+:1014000047C0DF708E01106243C000E010E040C0B2
+:101410008E013EC001E810E43BC003E810E438C090
+:1014200002EE14E435C009EE14E432C00AEE14E40E
+:101430002FC005EB14E42CC006EB14E429C007EB25
+:1014400014E426C00CEC14E423C00DEC14E420C01A
+:1014500003E815E41DC00AE815E41AC002E915E422
+:1014600017C004E915E414C001E216E411C003E258
+:1014700016E40EC004E216E40BC005E216E408C050
+:1014800006E216E405C007E216E402C00AE216E42A
+:10149000C801DF91CF911F910F91089596E0799F38
+:1014A000F001112494E5899FE00DF11D1124E60F50
+:1014B000F11DEE0FFF1FEE57FD4F85919491803E79
+:1014C0009105E0F4803C910558F58133910509F4CC
+:1014D0006FC048F48932910509F463C08A329105DE
+:1014E00009F46DC072C089339105E9F08238910525
+:1014F000D1F08533910509F44DC067C0833E910555
+:1015000081F138F4803E9105B9F0823E9105D9F021
+:101510005CC0863E910561F1873E9105A1F155C001
+:101520000E94210808952091EF0120FD02C021FFB3
+:101530004CC080EE90E049C08091EF0180FFF9CF70
+:1015400089E390E042C08091EF0182FF0EC080915C
+:10155000EF0184FF03C080E090E037C083EE90E0AD
+:1015600034C08091EF0182FFF2CF82EE90E02DC077
+:101570008091EF0183FF0BC08091EF0184FDEBCFE1
+:1015800087EE90E022C08091EF0183FFF5CF86EED9
+:1015900090E01BC08091EF0185FF07C089E290E0D9
+:1015A00014C08091EF0185FFF9CF85E390E00DC075
+:1015B0008091EF0186FF07C08AE290E006C080912B
+:1015C000EF0186FFF9CF81E390E00E943108089592
+:1015D00008950C94E80A809164010895CF93DF93F5
+:1015E00000D01F92CDB7DEB79C018091E601843018
+:1015F00019F593E099833B832A839093E9008FEF59
+:101600009091E800815095FD06C095ED9A95F1F70F
+:1016100000008111F5CF8091E80085FF0DC040E00A
+:1016200050E063E070E0CE0101960E94580D809179
+:10163000E8008E778093E8000F900F900F90DF9175
+:10164000CF910895CF93DF9300D01F92CDB7DEB72F
+:101650002091E601243021F522E029839B838A83AF
+:1016600083E08093E9008FEF9091E800815095FD31
+:1016700006C095ED9A95F1F700008111F5CF8091A4
+:10168000E80085FF0DC040E050E063E070E0CE016F
+:1016900001960E94580D8091E8008E778093E800B3
+:1016A0000F900F900F90DF91CF9108952091E60158
+:1016B0002430F1F422E02093E9002FEF3091E8008C
+:1016C000215035FD06C035ED3A95F1F700002111A6
+:1016D000F5CF2091E80025FF0BC040E050E065E029
+:1016E00070E00E94580D8091E8008E778093E800AA
+:1016F0000895CF93DF93EC019091E601943009F0C7
+:1017000046C080910C018823D9F080910D01882377
+:10171000B9F09093E9008FEF9091E800815095FD2A
+:1017200006C095E19A95F1F700008111F5CF8091FF
+:10173000E80085FF2CC040E050E060E170E017C099
+:1017400081E08093E9008FEF9091E800815095FD52
+:1017500006C095ED9A95F1F700008111F5CF8091C3
+:10176000E80085FF14C040E050E068E070E0CE0182
+:101770000E94580D8091E8008E778093E80080E108
+:10178000FE01A4E5B1E001900D928A95E1F7DF91A9
+:10179000CF9108958091E501811109C00E94ED0E5D
+:1017A0000E944A0F8091E20084608093E2000895D5
+:1017B0001092E501089508950C94F1240E944E1EA4
+:1017C0000E94F7240E94F0110C94E90A42E061ECB7
+:1017D00081E00E94670E42E061EC82E00E94670EA9
+:1017E00042E061EC83E00E94670E42E161EC84E03C
+:1017F0000C94670E8091E801833009F455C030F4F1
+:10180000813071F0823009F48EC008958A3009F475
+:101810007AC08B3009F460C0893009F09CC020C0C8
+:101820008091E701813A09F096C08091E800877FB6
+:101830008093E8008091EB019091EC01892B21F4D9
+:1018400060E184E591E003C060E080E090E070E05A
+:101850000E94A30D8091E8008B778093E8000895A3
+:101860008091E701813209F076C08091EB0190917F
+:10187000EC01009719F0039709F06DC08091E80022
+:10188000877F8093E8008091E80082FD05C0809109
+:10189000E6018111F8CF5FC08091F100809364016F
+:1018A0008091E8008B7753C08091E701813A09F07D
+:1018B00052C08091EB019091EC01892B09F04BC053
+:1018C0008091E800877F8093E8008091E80080FFA6
+:1018D000FCCF80910C0136C08091E7018132D9F5AF
+:1018E0008091EB019091EC01892BA9F58091E800A2
+:1018F000877F8093E8000E949C0E8091E90180938D
+:101900000C010C9480178091E701813221F58091C0
+:10191000E800877F8093E8000E949C0E8091EA0196
+:101920008093650108958091E701813AA1F4809147
+:10193000E800877F8093E8008091E80080FFFCCF7B
+:10194000809165018093F1008091E8008E7780930B
+:10195000E8000C949C0E089584B7877F84BF88E1CB
+:101960000FB6F89480936000109260000FBE90E074
+:1019700080E80FB6F89480936100909361000FBEE9
+:101980000E943F120E94ED0E0E944A0F8091E200D9
+:1019900084608093E20078940E94D0110E944112EA
+:1019A00082E091E00E94EB110E94DF248091E60129
+:1019B000853069F40E940F1E8091E4018823B1F301
+:1019C0000E943A1E882391F30E94420DEFCF0E949D
+:1019D0004712ECCF292F332723303105C9F064F4A7
+:1019E0002130310581F02230310509F043C08DE608
+:1019F00090E026EA36E042C021323105F1F0223291
+:101A0000310541F137C082E190E023E137E036C093
+:101A100099278130910541F08230910541F0892B61
+:101A200049F5E2EAF6E005C0EAE8F6E002C0E2E7DE
+:101A3000F6E0849190E09F0121C06430D8F4E62F55
+:101A4000F0E0EE0FFF1FEE5DFE4F2081318189E057
+:101A500090E014C0643070F470E0FB01EE0FFF1FE3
+:101A6000E65EFE4F20813181FB01EA5EFE4F808100
+:101A700090E004C080E090E020E030E0FA013183A3
+:101A80002083089580E189BD82E189BD09B400FE0B
+:101A9000FDCF8091D8008F7D8093D8008091E000A9
+:101AA00082608093E0008091E00081FDFCCF08958A
+:101AB000CF92DF92EF92FF920F931F93CF93DF931A
+:101AC000EC018B016A010E94BB0E811133C0C1146D
+:101AD000D10439F0F60180819181081B190BC80FE0
+:101AE000D91FE12CF12C0115110519F18091E800A5
+:101AF00085FD16C08091E8008E778093E800C114C0
+:101B0000D10449F0F60180819181E80EF91EF1823D
+:101B1000E08285E00FC00E94BB0E882321F30AC03B
+:101B200089918093F10001501109FFEFEF1AFF0A2C
+:101B3000DACF80E0DF91CF911F910F91FF90EF906E
+:101B4000DF90CF9008952091ED013091EE0126179E
+:101B5000370748F06115710539F42091E8002E77B8
+:101B60002093E80001C0B90140E061157105A9F1B9
+:101B70002091E601222309F443C0253009F442C034
+:101B80002091E80023FD40C02091E80022FD32C0F2
+:101B90002091E80020FFE9CF4091F3002091F2006E
+:101BA00030E0342BFC01CF016115710559F028306C
+:101BB000310540F481918093F100615071092F5FEC
+:101BC0003F4FF1CF41E02830310509F040E020914E
+:101BD000E8002E772093E800C8CF4111C9CF0AC092
+:101BE0008091E601882361F0853061F08091E80002
+:101BF00083FD0AC08091E80082FFF2CF80E0089563
+:101C000082E0089583E0089581E008952091ED0138
+:101C10003091EE012617370748F06115710539F448
+:101C20002091E8002E772093E80001C0B901FC0163
+:101C300020E06115710591F18091E601882309F496
+:101C400040C0853009F43FC08091E80083FD3DC06D
+:101C50008091E80082FD2FC08091E80080FFE9CFED
+:101C60002091F3008091F20090E0922B61157105B4
+:101C700059F08830910540F424912093F100319679
+:101C8000615071090196F2CF21E0089709F020E038
+:101C90008091E8008E778093E800CBCF2111CCCFE4
+:101CA0000AC08091E601882361F0853061F080915F
+:101CB000E80083FD0AC08091E80082FFF2CF80E057
+:101CC000089582E0089583E0089581E00895982FB3
+:101CD000973058F59093E900981739F07091EC001F
+:101CE0002091ED005091F00003C0242F762F50E09A
+:101CF00021FF19C03091EB003E7F3093EB00309113
+:101D0000ED003D7F3093ED003091EB00316030937A
+:101D1000EB007093EC002093ED005093F0002091C5
+:101D2000EE0027FF07C09F5FD3CF8F708093E9003D
+:101D300081E0089580E008958091E70187FF11C058
+:101D40008091E80082FD05C08091E6018111F8CF05
+:101D500011C08091E8008B770BC08091E601882349
+:101D600049F08091E80080FFF8CF8091E8008E77FD
+:101D70008093E80008952091E4003091E50095E615
+:101D80004091EC00842F817040FF22C08091E800D8
+:101D900080FD1CC08091E601882391F0853091F090
+:101DA0008091EB0085FD10C04091E4005091E5006A
+:101DB0004217530729F39A01915011F784E00895CF
+:101DC00082E0089583E0089581E0089580E0089519
+:101DD0004091E80042FFDECF08950E945B0F0E9411
+:101DE000630FE0EEF0E0808181608083E8EDF0E059
+:101DF00080818F77808319BCA7EDB0E08C918E7FB6
+:101E00008C9380818F7E80831092E50108950F93DB
+:101E10001F93CF93DF930E945B0F0E94630FC8ED67
+:101E2000D0E088818F7788838881806888838881E3
+:101E30008F7D888319BC1092E6011092E201109206
+:101E4000E4011092E30100EE10E0F80180818B7F45
+:101E5000808388818160888342E060E080E00E9426
+:101E6000670EE1EEF0E080818E7F8083E2EEF0E0AD
+:101E7000808181608083808188608083F801808197
+:101E80008E7F8083888180618883DF91CF911F91CD
+:101E90000F910895E8EDF0E080818F7E8083E7ED7B
+:101EA000F0E080818160808384E082BF81E0809364
+:101EB000E5010C94070FE8EDF0E080818E7F8083D0
+:101EC0001092E20008951092DA001092E100089555
+:101ED0001F920F920FB60F9211242F933F934F939F
+:101EE0005F936F937F938F939F93AF93BF93EF9382
+:101EF000FF938091E10082FF0BC08091E20082FF9E
+:101F000007C08091E1008B7F8093E1000E94CF1198
+:101F10008091DA0080FF1FC08091D80080FF1BC035
+:101F20008091DA008E7F8093DA008091D90080FF63
+:101F30000DC080E189BD82E189BD09B400FEFDCFFD
+:101F400081E08093E6010E94CA0B05C019BC109283
+:101F5000E6010E94D80B8091E10080FF19C08091BA
+:101F6000E20080FF15C08091E2008E7F8093E20046
+:101F70008091E20080618093E2008091D8008062CD
+:101F80008093D80019BC85E08093E6010E94DC0BA9
+:101F90008091E10084FF30C08091E20084FF2CC07A
+:101FA00080E189BD82E189BD09B400FEFDCF809149
+:101FB000D8008F7D8093D8008091E1008F7E809340
+:101FC000E1008091E2008F7E8093E2008091E20048
+:101FD00081608093E2008091E201882311F084E027
+:101FE00007C08091E30087FD02C081E001C083E06B
+:101FF0008093E6010E94DE0B8091E10083FF29C0FF
+:102000008091E20083FF25C08091E100877F80936B
+:10201000E10082E08093E6011092E2018091E1000C
+:102020008E7F8093E1008091E2008E7F8093E200BA
+:102030008091E20080618093E20042E060E080E015
+:102040000E94670E8091F00088608093F0000E94EB
+:10205000DB0BFF91EF91BF91AF919F918F917F919A
+:102060006F915F914F913F912F910F900FBE0F9005
+:102070001F9018951F920F920FB60F9211242F9355
+:102080003F934F935F936F937F938F939F93AF9300
+:10209000BF93CF93DF93EF93FF93C091E900CF708D
+:1020A0008091EC00D82FD17080FDD0E81092E9002B
+:1020B0008091F000877F8093F00078940E947E10DA
+:1020C0001092E9008091F00088608093F000CD2BA1
+:1020D000CF70C093E900FF91EF91DF91CF91BF9155
+:1020E000AF919F918F917F916F915F914F913F91B0
+:1020F0002F910F900FBE0F901F9018951F93CF93A5
+:10210000DF93CDB7DEB7AA970FB6F894DEBF0FBE48
+:10211000CDBFE7EEF1E088E08E0F9091F100919352
+:102120008E13FBCF0E94FA0B8091E80083FF1FC142
+:102130008091E7019091E801492F50E04A30510524
+:1021400008F015C1FA01EA59FF4F0C94792680383E
+:1021500081F0823809F00BC18091EB018F70809380
+:10216000E9008091EB0085FB882780F91092E90057
+:1021700006C08091E3019091E401911182609091F9
+:10218000E800977F9093E8008093F1001092F100AF
+:10219000C8C0282F2D7F09F0EAC0882319F08230AB
+:1021A00061F0E5C08091E901813009F0E0C0933031
+:1021B00009F080E08093E4012BC08091E901811156
+:1021C00027C08091EB018F7009F4D1C08093E900A2
+:1021D0002091EB0020FF1CC0933021F48091EB0094
+:1021E000806214C09091EB0090619093EB0021E02D
+:1021F00030E0A90102C0440F551F8A95E2F74093D1
+:10220000EA001092EA008091EB0088608093EB0076
+:102210001092E9008091E800877F86C08111A7C0F5
+:102220001091E9011F778091E3008078812B8093E2
+:10223000E3008091E800877F8093E8000E949C0E75
+:102240008091E80080FFFCCF8091E300806880935C
+:10225000E300111102C082E001C083E08093E60137
+:1022600086C08058823008F082C08091E901909148
+:10227000EA018C3D53E0950779F583E08A838AE291
+:1022800089834FB7F894DE01139620E03EE051E2D7
+:10229000E32FF0E050935700E49120FF03C0E29554
+:1022A000EF703F5FEF708E2F90E0EA3010F0C7962E
+:1022B00001C0C0968D939D932F5F243149F74FBF86
+:1022C0008091E800877F8093E8006AE270E0CE01A9
+:1022D00001960E94A30D14C0AE014F5F5F4F609145
+:1022E000EB010E94EA0CBC01892B09F440C09091DB
+:1022F000E800977F9093E80089819A810E94060EFA
+:102300008091E8008B778093E80031C0803879F5C0
+:102310008091E800877F8093E8008091E2018093BC
+:10232000F1008091E8008E778093E8000E949C0E77
+:102330001EC081111CC09091E9019230C0F48091BF
+:10234000E800877F8093E8009093E2010E949C0E52
+:102350008091E201811106C08091E30087FD02C0F7
+:1023600081E001C084E08093E6010E94E60B809149
+:10237000E80083FF0AC08091E800877F8093E8002F
+:102380008091EB0080628093EB00AA960FB6F894E0
+:10239000DEBF0FBECDBFDF91CF911F91089508958D
+:1023A000CF938091E6018823A1F0C091E900CF701E
+:1023B0009091EC00892F817090FD80E8C82B1092DD
+:1023C000E9008091E80083FD0E947E10CF70C093E9
+:1023D000E900CF91089590936B0180936A0108956D
+:1023E000E0916A01F0916B01309721F00190F0814A
+:1023F000E02D099480E00895E0916A01F0916B016D
+:10240000309721F00280F381E02D09940895E09146
+:102410006A01F0916B01309721F00480F581E02D85
+:1024200009940895209168013091690182179307FA
+:1024300071F09093690180936801E0916A01F091D5
+:102440006B01309721F00680F781E02D0994089503
+:1024500020916601309167018217930771F0909384
+:10246000670180936601E0916A01F0916B013097FA
+:1024700021F00084F185E02D0994089508950C94CD
+:102480003E120E94541E0E9401070C941A1FCF9204
+:10249000DF92EF92FF920F931F93CF93DF93CDB70D
+:1024A000DEB72B970FB6F894DEBF0FBECDBF0E94EC
+:1024B00019078DE6C82E81E0D82E00E010E0E02E4E
+:1024C000802F0E940708F60141916F01F42EF82633
+:1024D000B1F40F5F1F4F0E30110589F78FEF89831D
+:1024E0008A831B820E945D1E8160782F9D838C836E
+:1024F00049815A816B818D810E94EA1240C090917E
+:10250000CF0191FF04C08B870E940D088B8520E0CE
+:1025100030E04F2D50E0922FBA01022E02C0759587
+:1025200067950A94E2F760FF24C02E83EF8221E0D2
+:1025300030E0690102C0CC0CDD1C9A95E2F790E016
+:102540008C219D21892B09F420E028870E945D1EA3
+:102550008160782F9A8789874E815F8168858A8517
+:102560000E94EA12F801E359FE4F8081C826C0821A
+:1025700006C02F5F3F4F2630310569F6AACF0E9473
+:10258000012210916C010E94F0111817A1F00E9415
+:10259000F01180936C012B960FB6F894DEBF0FBE3E
+:1025A000CDBFDF91CF911F910F91FF90EF90DF9002
+:1025B000CF900C94E90A2B960FB6F894DEBF0FBEAD
+:1025C000CDBFDF91CF911F910F91FF90EF90DF90E2
+:1025D000CF900895CF93DF93CDB7DEB72B970FB68B
+:1025E000F894DEBF0FBECDBF4F83588769877A87C7
+:1025F0008B87DE01119686E0FD0111928A95E9F73D
+:1026000085E0FE01379601900D928A95E1F74981A8
+:102610005A816B817C818D819E810E941A1A2B9632
+:102620000FB6F894DEBF0FBECDBFDF91CF910895F6
+:102630000895CF93882309F4C2C0C82F823859F473
+:102640000E94F01181FDBBC089E30E94C31C0E945F
+:10265000901D89E30CC0833879F40E94F01180FD4D
+:10266000AEC083E50E94C31C0E94901D83E50E94BA
+:10267000051DCF910C94901D843859F40E94F011DF
+:1026800082FD9DC087E40E94C31C0E94901D87E4C8
+:10269000EECF8CEF8C0F813A48F48C2F0E944424AB
+:1026A00081118DC08C2F0E94C31CE3CF80E28C0F60
+:1026B000883048F4C77081E001C0880FCA95EAF7F6
+:1026C0000E94491DD6CF8BE58C0F833078F4C53A34
+:1026D00029F0C63A31F083E890E005C081E890E047
+:1026E00002C082E890E0CF910C94121288E58C0F22
+:1026F000833108F064C0C83A39F1C93A41F1CA3AA5
+:1027000049F1CB3A51F1CC3A59F1CD3A61F1C03BA4
+:1027100069F1CE3A71F1CF3A79F1C13B81F1C23B17
+:1027200089F1C33B91F1C43B99F1C53BA1F1C63B93
+:10273000A9F1C73BB1F1C83BB9F1C93BC1F1CA3BF3
+:10274000C9F180E090E038C082EE90E035C089EEBB
+:1027500090E032C08AEE90E02FC085EB90E02CC074
+:1027600086EB90E029C087EB90E026C08CEC90E0EF
+:1027700023C08DEC90E020C083E891E01DC08AE882
+:1027800091E01AC082E991E017C084E991E014C099
+:1027900081E292E011C083E292E00EC084E292E016
+:1027A0000BC085E292E008C086E292E005C087E2B5
+:1027B00092E002C08AE292E0CF910C942812CF916D
+:1027C0000895882309F44BC0823859F40E94F0110F
+:1027D00081FF45C089E30E94C31C0E94901D89E3CC
+:1027E0000CC0833871F40E94F01180FF38C083E57B
+:1027F0000E94C31C0E94901D83E50E94051D0C943D
+:10280000901D843859F40E94F01182FF28C087E49B
+:102810000E94C31C0E94901D87E4EFCF9CEF980F8D
+:10282000913A58F390E2980F983050F4877091E005
+:1028300001C0990F8A95EAF7892F0E944F1DDFCFBB
+:102840009BE5980F933020F480E090E00C941212F6
+:10285000885A833120F480E090E00C942812089587
+:10286000882321F00E94491D0C94901D089588230F
+:1028700021F00E944F1D0C94901D0895BF92CF929D
+:10288000DF92EF92FF920F931F93CF93DF9300D0CD
+:1028900000D000D0CDB7DEB725E0FC01DE011196F7
+:1028A00001900D922A95E1F7FC01D08011810281FF
+:1028B000258122952F7043815481452B09F4FCC258
+:1028C0001F3F21F4FFEFDF1609F4F6C27C012E83CF
+:1028D0000E941813D9821A8369817A81802F0E94FD
+:1028E000BF1C182FB92E0E94741C0E943B1B2E8106
+:1028F000002319F00E94661D2E81EB2DE295EF70EA
+:10290000F0E0E059FF4F0C9479268B2D807F9B2DB2
+:102910009F70F92E882319F0F29480EFF82200239B
+:1029200089F0FF2009F475C280E2810F883020F41D
+:102930008F2D0E94491D03C08F2D0E94591D0E949A
+:10294000901D67C2812F0E94E113FF2009F4B4C2D9
+:10295000105E8F2D183018F40E944F1D02C00E9487
+:102960005F1D26960FB6F894DEBF0FBECDBFDF9178
+:10297000CF911F910F91FF90EF90DF90CF90BF907C
+:102980000C94901D3B2D307F8B2D8F70303211F0C9
+:102990008295807F112319F0113021F12CC0002382
+:1029A000B9F0222309F4A0C1213009F09DC1269677
+:1029B0000FB6F894DEBF0FBECDBFDF91CF911F9150
+:1029C0000F91FF90EF90DF90CF90BF900C94791D06
+:1029D000222319F0213009F46FC28E830E947C1DDE
+:1029E0008E8196C1002321F0223008F065C27CC19F
+:1029F000211162C28DC1002321F0222309F474C188
+:102A000008C2222309F484C119C22B2D26952695CC
+:102A1000237030E02115310521F021303105D1F04E
+:102A20004BC2002321F0812F9B2D937002C080E0C8
+:102A300090E026960FB6F894DEBF0FBECDBFDF91B3
+:102A4000CF911F910F91FF90EF90DF90CF90BF90AB
+:102A50000C941212002321F0812F9B2D937002C041
+:102A600080E090E026960FB6F894DEBF0FBECDBF93
+:102A7000DF91CF911F910F91FF90EF90DF90CF905A
+:102A8000BF900C942812812F002319F00E94092175
+:102A900002C00E94712126960FB6F894DEBF0FBEC9
+:102AA000CDBFDF91CF911F910F91FF90EF90DF90FD
+:102AB000CF90BF900C94F6218B2D837009F07BC0D2
+:102AC0000111FAC1812F829586958770880F880F32
+:102AD000912F9F70C92ED12CE12CF12C082E04C00F
+:102AE000CC0CDD1CEE1CFF1C0A94D2F714FF12C0A4
+:102AF0004FE050E060E070E004C0440F551F661FD7
+:102B0000771F8A95D2F7CB01BA01609570958095B1
+:102B1000909503C060E070E0CB012B2D26952695A3
+:102B20002370422F50E042305105D9F04330510517
+:102B300069F16C297D298E299F294130510551F178
+:102B400026960FB6F894DEBF0FBECDBFDF91CF91B2
+:102B50001F910F91FF90EF90DF90CF90BF900C945A
+:102B6000621B6C297D298E299F2926960FB6F89421
+:102B7000DEBF0FBECDBFDF91CF911F910F91FF90B0
+:102B8000EF90DF90CF90BF900C947E1B0E94621B51
+:102B9000C701B60126960FB6F894DEBF0FBECDBFB3
+:102BA000DF91CF911F910F91FF90EF90DF90CF9029
+:102BB000BF900C94461B002319F08B2D817001C02F
+:102BC0008695882309F478C1812F82958695877030
+:102BD000880F880F912F9F70C92ED12CE12CF12CDA
+:102BE000082E04C0CC0CDD1CEE1CFF1C0A94D2F78E
+:102BF00014FF12C04FE050E060E070E004C0440FEA
+:102C0000551F661F771F8A95D2F7CB01BA016095D1
+:102C100070958095909503C060E070E0CB012B2DFE
+:102C2000269526952370422F50E042305105D9F069
+:102C30004330510569F16C297D298E299F29413046
+:102C4000510551F126960FB6F894DEBF0FBECDBFE9
+:102C5000DF91CF911F910F91FF90EF90DF90CF9078
+:102C6000BF900C943C1C6C297D298E299F292696A7
+:102C70000FB6F894DEBF0FBECDBFDF91CF911F918D
+:102C80000F91FF90EF90DF90CF90BF900C94581C65
+:102C90000E943C1CC701B60126960FB6F894DEBF11
+:102CA0000FBECDBFDF91CF911F910F91FF90EF909D
+:102CB000DF90CF90BF900C94201C103FD1F118F4FE
+:102CC000103E50F4A1C0123F09F463C008F44CC098
+:102CD000133F09F473C098C01F708B2D8F710023B0
+:102CE000A1F00E94B91B812F26960FB6F894DEBF83
+:102CF0000FBECDBFDF91CF911F910F91FF90EF904D
+:102D0000DF90CF90BF900C9430140E94DA1B812F7B
+:102D100026960FB6F894DEBF0FBECDBFDF91CF91E0
+:102D20001F910F91FF90EF90DF90CF90BF900C9488
+:102D300037140023A9F02111BFC08B2D8F71269667
+:102D40000FB6F894DEBF0FBECDBFDF91CF911F91BC
+:102D50000F91FF90EF90DF90CF90BF900C94FF1BEE
+:102D6000223008F0A9C0E9CF0023A9F08B2D8F7184
+:102D700026960FB6F894DEBF0FBECDBFDF91CF9180
+:102D80001F910F91FF90EF90DF90CF90BF900C9428
+:102D9000B91B002359F38B2D8F7126960FB6F8942B
+:102DA000DEBF0FBECDBFDF91CF911F910F91FF907E
+:102DB000EF90DF90CF90BF900C94DA1B002399F036
+:102DC0008B2D8F7126960FB6F894DEBF0FBECDBF48
+:102DD000DF91CF911F910F91FF90EF90DF90CF90F7
+:102DE000BF900C94A41B26960FB6F894DEBF0FBEBE
+:102DF000CDBFDF91CF911F910F91FF90EF90DF90AA
+:102E0000CF90BF900C949A1B0023A9F0222309F4C1
+:102E1000ADCF812F26960FB6F894DEBF0FBECDBF83
+:102E2000DF91CF911F910F91FF90EF90DF90CF90A6
+:102E3000BF900C941913222309F4ADCF812F26964D
+:102E40000FB6F894DEBF0FBECDBFDF91CF911F91BB
+:102E50000F91FF90EF90DF90CF90BF900C94E11313
+:102E60004B2D4F70612FC7010E94760426960FB636
+:102E7000F894DEBF0FBECDBFDF91CF911F910F91B0
+:102E8000FF90EF90DF90CF90BF900C94BE1A4B2D27
+:102E90004F70612FC70126960FB6F894DEBF0FBEA4
+:102EA000CDBFDF91CF911F910F91FF90EF90DF90F9
+:102EB000CF90BF900C940E0826960FB6F894DEBF04
+:102EC0000FBECDBFDF91CF911F910F91FF90EF907B
+:102ED000DF90CF90BF9008950E94661D0E94761DDE
+:102EE0000E943B1D0E94901D0E94A7220E94F62175
+:102EF00080E090E00E94121280E090E00C94281292
+:102F00000E94561D0C946C170E94B41C292F229508
+:102F10002F7030E02C3031054CF42A3031056CF440
+:102F2000225031092230310588F407C02C30310598
+:102F300049F02F30310531F009C0803E48F0803F24
+:102F400029F406C093FB882780F9089580E008954E
+:102F500081E00895CF93DF9300D000D01F92CDB7CA
+:102F6000DEB70F900F900F900F900F90DF91CF91E1
+:102F70000895CF93DF9300D000D000D0CDB7DEB757
+:102F800026960FB6F894DEBF0FBECDBFDF91CF916E
+:102F900008951F93CF93DF93C0917B0116E080913A
+:102FA0007C01C81799F0D0E01C9FF0011D9FF00D27
+:102FB0001124E358FE4F40815181628173818481E5
+:102FC00095810E94B9172196C770E9CFDF91CF9103
+:102FD0001F9108954091AD015091AE016091AF01F4
+:102FE0007091B0018091B1019091B2010C94B91728
+:102FF0008091B20182958F7009F054C08091AF0129
+:10300000882309F44FC080917B01A0917C016091DD
+:10301000AD017091AE014091B0015091B101B6E0A7
+:103020008A1709F43FC090E041155105C1F17F3F77
+:1030300011F46F3FA1F1B89FF001B99FF00D112479
+:10304000E358FE4F218172132AC02081621327C0EA
+:103050002281211124C0238134812417350710F4E3
+:1030600021503109241B350B283C3105C0F4209137
+:10307000B2012F7020612093B20126E0289FF00159
+:10308000299FF00D1124EE57FE4F80818F708061D3
+:1030900080838DEA91E00E943E140C94C91701963A
+:1030A0008770BECF0895CF92DF92EF92FF920F9379
+:1030B0001F93CF93DF93CDB7DEB762970FB6F89427
+:1030C000DEBF0FBECDBF8C0185E0F801DE011D968D
+:1030D00001900D928A95E1F7D8014C9111965C917F
+:1030E000119712966C9112971396CD90DC901497CD
+:1030F0003091AD017091AE018091B0019091B1011C
+:10310000009709F46BC17F3F19F43F3F09F466C192
+:10311000E090AF01EE2009F4C0C02091B201C816C2
+:10312000D90628F0F601E81BF90BCF0104C0809501
+:1031300090958C0D9D1DFF24F394883C910578F0AB
+:10314000F12C207F09F0C6C07C2DD98AC88A8989D4
+:103150000E94AA178DEA91E00E943E14B1C0822F0E
+:10316000807F09F046C0751314C0341312C061117A
+:1031700010C02F7020612093B2010E94EA178DEADF
+:1031800091E00E943E148091B201D80115968C9373
+:103190002EC0CD2819F15F3F11F44F3FF9F0F62E04
+:1031A00061111CC080917B0120917C0136E0821767
+:1031B00009F45AC090E0389FF001399FF00D1124B6
+:1031C000E358FE4F7181571306C07081471303C047
+:1031D0007281711103C001968770E9CFF62E6623C4
+:1031E00009F418C18091B20181608093B201F12C81
+:1031F00011C1751308C0341306C0611104C0809159
+:10320000B201D801C3C04D875E878D859E856A8BCC
+:103210000E9484176A898823E1F16623D1F1209105
+:10322000B201822F82958F7090E0029774F08091A6
+:10323000AD019091AE0198878F831986DB86CA868F
+:103240002C87CE0107960E943E1486E0F801ADEA75
+:10325000B1E001900D928A95E1F70E94F8170E9463
+:10326000EA17FF24F394D6C04D875E878D859E852F
+:103270000E94B41C292F22952F7030E02230310596
+:103280000CF0BCC09F7009F0B6C0805E883008F4B6
+:10329000C1C0C8010E943E14E4CFC816D90608F484
+:1032A00053C0F601E81BF90BCF01883C910508F4E7
+:1032B00050C0F12C7C2DD98AC88A89890E94AA170E
+:1032C000EDEAF1E086E0DF011D928A95E9F70E94C0
+:1032D000EA17A0C0751314C0341312C0611110C0D6
+:1032E0008091B201F8018583C8010E943E1486E0F6
+:1032F000EDEAF1E0DF011D928A95E9F7FE2C8AC024
+:103300004D875E878D859E856A8B0E9484176A89AA
+:10331000882309F4BECF662309F4BBCF2091B20104
+:10332000822F82958F7090E002970CF48ECF80915F
+:10333000AD019091AE019A8389831B82DD82CC829C
+:103340002E83CE0101967FCF809590958C0D9D1D8B
+:10335000ACCFF62E662309F49CCF75132EC0341320
+:103360002CC02091B20120FD1FC0822F82958F704A
+:10337000D9F0D80115962C9315978F3049F08F5FAF
+:10338000982F9295907F822F8F70892B15968C9312
+:10339000C8010E943E1486E0F801ADEAB1E0019058
+:1033A0000D928A95E1F793CF86E0F801ADEAB1E09E
+:1033B00001900D928A95E1F72DC04D875E878D852E
+:1033C0009E850E948417811140CF8091B201816057
+:1033D0008093B201C8010E943E141CC0662309F408
+:1033E00058CF4D875E878D859E850E9484178823E0
+:1033F00009F44FCF2ACF811148CF0CC024303105BA
+:103400000CF047CF9F7009F440CFF8019581907F71
+:1034100009F03BCF8F2D62960FB6F894DEBF0FBE3A
+:10342000CDBFDF91CF911F910F91FF90EF90DF9073
+:10343000CF9008951F93CF93DF93CDB7DEB72C972E
+:103440000FB6F894DEBF0FBECDBF4F835887698794
+:103450007A878B879C87CE0107960E945318882312
+:1034600069F08F8198852A853B85232BF1F19F3F59
+:1034700009F063C08F3F09F060C037C086E0FE01ED
+:103480003796DE01119601900D928A95E1F76F81D2
+:103490007885EA85FB85309741F17F3F11F46F3FD6
+:1034A00021F120917C0130E0C901019687709927B4
+:1034B00040917B0150E08417950709F447C0698368
+:1034C0007A83FD83EC8396E0929FD001939FB00DA9
+:1034D0001124A358BE4FFE01319601900D929A958A
+:1034E000E1F780937C010E94C91716E080917B016F
+:1034F00090917C018917C1F1189FC0011124835854
+:103500009E4F0E945318882379F1E0917B011E9F02
+:10351000F0011124E358FE4F408151816281738193
+:10352000848195810E94B91780917B0190E001967A
+:103530008770992780937B01D9CF4F815885698502
+:103540007A858B859C850E94B917CFCF0E94801702
+:1035500010927C0110927B01EDEAF1E086E0DF0140
+:103560001D928A95E9F7C1CF2C960FB6F894DEBF6D
+:103570000FBECDBFDF91CF911F910895EF92FF92C3
+:103580000F931F93CF93DF938C01892B09F46CC0A9
+:10359000F12CEE24E394E8012196F801849184371C
+:1035A00040F4843008F051C0813081F0823019F14C
+:1035B0005BC0853709F444C0A8F19CE7980F9037A9
+:1035C00008F052C08F770E94E11341C00E5F1F4F79
+:1035D000FE01C49180E28C0F883048F4C7708E2DB4
+:1035E00001C0880FCA95EAF70E94691D14C08C2F8C
+:1035F0000E9419132DC00E5F1F4FFE01C49180E27F
+:103600008C0F883058F4C7708E2D01C0880FCA9572
+:10361000EAF70E946F1D0E94901D1AC08C2F0E9415
+:10362000E11316C00E5F1F4FFE01C491CC2381F041
+:103630008FE99FE00197F1F700C00000C150F6CF7D
+:103640000E5F1F4FFE01F49003C00E9419138E01FC
+:103650008F2D882309F49FCFEFE9FFE03197F1F731
+:1036600000C000008150F5CFDF91CF911F910F91E5
+:10367000FF90EF90089508956093B7017093B8019B
+:103680008093B9019093BA010C946C170F931F9318
+:103690000091B7011091B8012091B9013091BA01A0
+:1036A000DC01CB01802B912BA22BB32B8093B70194
+:1036B0009093B801A093B901B093BA011F910F91F3
+:1036C0000C946C170F931F930091B7011091B801E0
+:1036D0002091B9013091BA01DC01CB018023912303
+:1036E000A223B3238093B7019093B801A093B901AB
+:1036F000B093BA011F910F910C946C170F931F9305
+:103700000091B7011091B8012091B9013091BA012F
+:10371000DC01CB0180279127A227B3278093B70133
+:103720009093B801A093B901B093BA011F910F9182
+:103730000C946C171092B3011092B4011092B50161
+:103740001092B6010C946C1741E050E060E070E01C
+:1037500004C0440F551F661F771F8A95D2F7409308
+:10376000B3015093B4016093B5017093B6010C940A
+:103770006C1741E050E060E070E004C0440F551F5A
+:10378000661F771F8A95D2F78091B3019091B4019B
+:10379000A091B501B091B601482B592B6A2B7B2B18
+:1037A0004093B3015093B4016093B5017093B60197
+:1037B0000C946C1741E050E060E070E004C0440FEE
+:1037C000551F661F771F8A95D2F7409550956095D3
+:1037D00070958091B3019091B401A091B501B09121
+:1037E000B601482359236A237B234093B3015093A6
+:1037F000B4016093B5017093B6010C946C1741E06D
+:1038000050E060E070E004C0440F551F661F771F52
+:103810008A95D2F78091B3019091B401A091B5013E
+:10382000B091B601482759276A277B274093B301F7
+:103830005093B4016093B5017093B6010C946C176A
+:103840000F931F930091B3011091B4012091B50122
+:103850003091B601DC01CB01802B912BA22BB32B35
+:103860008093B3019093B401A093B501B093B601D6
+:103870001F910F910C946C170F931F930091B3013C
+:103880001091B4012091B5013091B601DC01CB015A
+:1038900080239123A223B3238093B3019093B40197
+:1038A000A093B501B093B6011F910F910C946C17C2
+:1038B0000F931F930091B3011091B4012091B501B2
+:1038C0003091B601DC01CB0180279127A227B327D5
+:1038D0008093B3019093B401A093B501B093B60166
+:1038E0001F910F910C946C170895CF92DF92EF9275
+:1038F000FF920F931F93CF93DF938C01C090B7017A
+:10390000D090B801E090B901F090BA018091B30174
+:103910009091B401A091B501B091B601C82AD92AFD
+:10392000EA2AFB2ACFE1D0E0D701C6010C2E04C061
+:10393000B695A795979587950A94D2F780FF06C00C
+:10394000B8018C2F0E944E0A019721F4219760F74D
+:1039500080E001C08C2FDF91CF911F910F91FF90DC
+:10396000EF90DF90CF900895CF93DF93EC010E940A
+:10397000751CBE010E944E0ADF91CF910895CB01C4
+:103980000E94B41C089590910C01992321F090910C
+:103990000D01911109C020910E0130910F01F90123
+:1039A00032969FEF40E01FC0982F9695969596957A
+:1039B0009F3050F5E0910E01F0910F01E90FF11DDC
+:1039C000877021E030E0A90102C0440F551F8A959D
+:1039D000E2F7CA019181892B818308959F3F39F0D5
+:1039E0004F5F4E3041F051915813F8CF0DC0511137
+:1039F000F7CF942FF5CF9F3F39F0F901E90FF11D73
+:103A000097FDFA9582830895089590910C0199236A
+:103A100021F090910D01911109C020910E0130917A
+:103A20000F01F9013296205F3F4F1FC0982F9695E6
+:103A3000969596959F30F0F4E0910E01F0910F016C
+:103A4000E90FF11D877021E030E0A90102C0440FA9
+:103A5000551F8A95E2F7CA01809591818923818358
+:103A600008953196E217F30729F090819813F9CF62
+:103A70001082F7CF089581E090E0E0910E01F0917F
+:103A80000F01E80FF91F1082019680319105A9F707
+:103A900008959091CE01892B8093CE010895809551
+:103AA0009091CE0189238093CE0108951092CE018A
+:103AB00008959091CD01892B8093CD010895809533
+:103AC0009091CD0189238093CD0108951092CD016D
+:103AD00008959091CC01892B8093CC010895809515
+:103AE0009091CC0189238093CC0108951092CC0150
+:103AF00008958093BB0108951092BB0108958091B1
+:103B00000E0190910F01FC0131969C01205F3F4F07
+:103B100080E0919191118F5FE217F307D1F708953B
+:103B2000E0910E01F0910F018091CE018083E09130
+:103B30000E01F0910F0190818091CD01892B80833E
+:103B4000E0910E01F0910F0190818091CC01892BC1
+:103B500080838091BB01882361F0E0910E01F09198
+:103B60000F019081892B80830E947F1D811110920B
+:103B7000BB0180910E0190910F010C94FC11CF922A
+:103B8000DF92EF92FF926C01EE24FF24C114D10466
+:103B9000E104F10421F0C701B60120E101C020E0F9
+:103BA000C72ED82EE92EFF24C114D104E104F1045C
+:103BB00019F0285FC701B6016B017C0154E0F6944F
+:103BC000E794D794C7945A95D1F7C114D104E1046E
+:103BD000F10419F02C5FC701B6016B017C0142E0D2
+:103BE000F694E794D794C7944A95D1F7C114D104B9
+:103BF000E104F10419F02E5FC701B601DC01CB012D
+:103C0000B695A79597958795892B8A2B8B2B09F0CD
+:103C10002F5F822FFF90EF90DF90CF9008958091DB
+:103C2000E601843021F11092D00120E488E190E097
+:103C30000FB6F894A895809360000FBE20936000A3
+:103C400080E00E94E90A83B7817F846083BF83B7E5
+:103C5000816083BF7894889583B78E7F83BF88E126
+:103C60000FB6F89480936000109260000FBE089524
+:103C700008950895CF930E94381E0E9419070E944C
+:103C8000391EC0E08C2F0E940708811104C0CF5F4D
+:103C9000CE30C1F701C081E0CF9108950E94801716
+:103CA0000E94F0110C94E90A82E084BD93E095BD76
+:103CB0009AEF97BD80936E0008952FB7F894809186
+:103CC000D1019091D201A091D301B091D4012FBF25
+:103CD0000895CF92DF92EF92FF920F931F932FB729
+:103CE000F8944091D1015091D2016091D30170912B
+:103CF000D4012FBF6A017B01EE24FF248C0120E058
+:103D000030E0C016D106E206F30610F44150510926
+:103D10009A01281B390BC9011F910F91FF90EF9059
+:103D2000DF90CF9008951F920F920FB60F9211243B
+:103D30008F939F93AF93BF938091D1019091D201C4
+:103D4000A091D301B091D4010196A11DB11D809322
+:103D5000D1019093D201A093D301B093D401BF912C
+:103D6000AF919F918F910F900FBE0F901F9018955C
+:103D70000E94ED0EF8942FEF87EA91E621508040E3
+:103D80009040E1F700C0000087E090EBDC018093F9
+:103D9000F0019093F101A093F201B093F3019CE044
+:103DA00088E10FB6F894A895809360000FBE9093B9
+:103DB0006000FFCFEF92FF920F931F93CF93DF939B
+:103DC000D82FC0E08C2F0E94070800E010E0E82EFA
+:103DD000F12CC701002E02C0959587950A94E2F751
+:103DE00080FD06C00F5F1F4F0630110591F709C017
+:103DF000602F7C2F80E00E940F08D813F3CF81E062
+:103E000004C0CF5FCE30F1F680E0DF91CF911F91FB
+:103E10000F91FF90EF900895CF93C82F8CE20E94EE
+:103E2000DA1E882321F08C2FCF910C94DA1E80E0CB
+:103E3000CF910895CF930E946120811102C00E940A
+:103E40004720C5E6C15049F00E9419078FE39CE95D
+:103E50000197F1F700C00000F5CF89E20E940C1F26
+:103E6000811113C18AE20E940C1F81110E94472018
+:103E700085E00E940C1F81110E94B81E0E946C20D8
+:103E80008093CF0187E00E940C1F8823A9F18BE16A
+:103E90000E940C1F882351F08091CF0181FB2227C3
+:103EA00020F991E0922790FB81F90EC08EE00E94EC
+:103EB0000C1F882361F08091CF0182FB222720F91B
+:103EC00091E0922790FB82F98093CF0115C080E1A9
+:103ED0000E940C1F9091CF01882341F093FB222771
+:103EE00020F981E0822780FB93F904C0892F809517
+:103EF00080FB90F99093CF018091CF010E947020B8
+:103F00000E947E208093EF0180EE0E940C1F882388
+:103F100041F08091EF01982F909590FB80F980936C
+:103F2000EF0189E30E940C1F882359F08091EF0173
+:103F300081FB222720F991E0922790FB81F9809361
+:103F4000EF0182EE0E940C1F882359F08091EF014F
+:103F500082FB222720F991E0922790FB82F980933F
+:103F6000EF0186EE0E940C1F882359F08091EF012B
+:103F700083FB222720F991E0922790FB83F980931D
+:103F8000EF0183EE0E940C1F882359F08091EF010E
+:103F900084FB222720F991E0922790FB84F98093FB
+:103FA000EF0185E30E940C1F882359F08091EF01F7
+:103FB00085FB222720F991E0922790FB85F98093D9
+:103FC000EF0181E30E940C1F882359F08091EF01DB
+:103FD00086FB222720F991E0922790FB86F98093B7
+:103FE000EF0181E10E940C1F882359F08091EF01BD
+:103FF00087FB222720F991E0922790FB87F9809395
+:10400000EF018091EF010E9482208091EF0187FBF8
+:10401000882780F980930D0187E20E940C1FC82F2A
+:104020008EE10E940C1F8111C2608FE10E940C1F63
+:104030008111C46080E20E940C1F8111C86081E27E
+:104040000E940C1F8111C06182E20E940C1F81112D
+:10405000C06283E20E940C1F8111C06484E20E944E
+:104060000C1F882311F0C06802C0CC2329F08C2FCC
+:104070000E9479206C2F03C00E947520682F70E089
+:1040800080E090E0CF910C943C1BCF9108956DEEB1
+:104090007EEF80E090E00E94B32660E082E090E056
+:1040A0000E94A12660E083E090E00E94A12660E0EB
+:1040B00084E090E00E94A12660E085E090E00C940E
+:1040C000A12680E090E00E949B2621E08D3E9E4F3D
+:1040D00009F020E0822F089582E090E00C9493266E
+:1040E000682F82E090E00C94A12683E090E00C948D
+:1040F0009326682F83E090E00C94A12684E090E062
+:104100000C949326682F84E090E00C94A126809173
+:10411000D70180FF0BC06091130185E0689FB0015B
+:10412000112475956795759567952BC081FF09C01A
+:104130006091130185E0689FB00111247595679522
+:1041400020C082FF07C06091130185E0689FB00125
+:10415000112417C09091D8019923D1F060911201D8
+:10416000961788F72091130185E0289F900111246C
+:10417000929FA001939F500D112470E0CA010E94EC
+:1041800065266038710540F46115710539F002C08B
+:1041900065E070E0862F08958FE7089581E0089527
+:1041A0008091D70180FF08C06091110170E0759582
+:1041B00067957595679521C081FF06C060911101D3
+:1041C00070E07595679519C082FF04C06091110178
+:1041D00070E010C09091D8019923C1F06091100156
+:1041E0009617A0F780911101899FC001112470E0FA
+:1041F0000E9465266038710528F46115710521F06B
+:10420000862F08958FE7089581E0089561E070E0BA
+:10421000F4CF803F21F40E948720819504C0813F24
+:1042200029F40E9487208093DB010895823F21F4C6
+:104230000E948720819504C0833F29F40E94872033
+:104240008093DA010895893F19F40E94D02005C0B7
+:104250008A3F31F40E94D02081958093DC0108953B
+:104260008B3F21F40E94D020819504C08C3F29F41B
+:104270000E94D0208093DD010895843F21F4809135
+:10428000D901816017C0853F21F48091D9018260F6
+:1042900011C0863F21F48091D90184600BC0873F13
+:1042A00021F48091D901886005C0883F31F4809164
+:1042B000D90180618093D90108958D3F21F48091C7
+:1042C000D70181600BC08E3F21F48091D7018260BD
+:1042D00005C08F3F29F48091D70184608093D70176
+:1042E0000895803F39F48091DB0187FF6CC0109204
+:1042F000DB0169C0813F29F48091DB011816BCF312
+:1043000062C09091DA01823F29F497FF5CC010925D
+:10431000DA0159C0833F19F41916CCF354C0893F10
+:1043200041F48091DC0118160CF04DC01092DC01B4
+:104330004AC08A3F29F48091DC0187FF44C0F6CF50
+:104340008B3F39F48091DD0187FF3DC01092DD0184
+:104350003AC08C3F29F48091DD011816BCF333C0BC
+:10436000843F21F48091D9018E7F17C0853F21F4CD
+:104370008091D9018D7F11C0863F21F48091D901B0
+:104380008B7F0BC0873F21F48091D901877F05C0C7
+:10439000883F31F48091D9018F7E8093D90113C079
+:1043A0008D3F21F48091D7018E7F0BC08E3F21F489
+:1043B0008091D7018D7F05C08F3F29F48091D7016F
+:1043C0008B7F8093D7018091DA0181110EC080919B
+:1043D000DB0181110AC08091DC01811106C080914E
+:1043E000DD01811102C01092D801089589ED91E09C
+:1043F0000E9407120E945D1E9093D6018093D50102
+:1044000008951F93CF93DF938091D5019091D601AA
+:104410000E94691EAC019091D801992321F020914E
+:10442000140130E006C0209115018AE0289F900118
+:1044300011244217530708F486C08091DA01C09115
+:10444000DB01D091DC011091DD01811107C0C111A8
+:1044500076C0D11174C0111172C075C09F3F19F0A0
+:104460009F5F9093D801181624F40E9487208093B0
+:10447000DA018091DA0187FF05C00E9487208195CB
+:104480008093DA011C1624F40E9487208093DB01BC
+:104490008091DB0187FF05C00E9487208195809372
+:1044A000DB016091DA01662339F1C091DB01CC2395
+:1044B00019F1772767FD7095872F972F0E94762532
+:1044C00023E333E343E35FE30E94DA250E944325BD
+:1044D0006093DA016C2F772767FD7095872F972FF0
+:1044E0000E94762523E333E343E35FE30E94DA256A
+:1044F0000E9443256093DB011D1624F40E94D02006
+:104500008093DC018091DC0187FF05C00E94D020F0
+:1045100081958093DC01111624F40E94D0208093B1
+:10452000DD018091DD0187FF05C00E94D0208195CB
+:104530008093DD01DF91CF911F910C94F6219F3F75
+:1045400009F08ECF96CFDF91CF911F910895E9EDBD
+:10455000F1E085E0DF011D928A95E9F71092D8011C
+:104560001092D7010895833081F128F4813059F0F9
+:104570008230D1F00895853009F449C0B8F1863011
+:1045800009F456C0089580911501262F30E0280FB8
+:10459000311D2F3F310524F4680F609315010895F4
+:1045A0008FEF80931501089580911401262F30E03C
+:1045B000280F311D2F3F310524F4680F609314013B
+:1045C00008958FEF80931401089580911301262F91
+:1045D00030E0280F311D2F3F310524F4680F609320
+:1045E000130108958FEF80931301089580911201B4
+:1045F000262F30E0280F311D2F3F310524F4680F9E
+:104600006093120108958FEF8093120108958091B5
+:104610001101262F30E0280F311D2F3F310524F4E2
+:10462000680F6093110108958FEF80931101089531
+:1046300080911001262F30E0280F311D2F3F3105CA
+:1046400024F4680F6093100108958FEF8093100198
+:104650000895833011F128F4813049F0823091F0CF
+:104660000895853081F120F18630C1F1089580915F
+:104670001501681720F4861B809315010895109288
+:104680001501089580911401681720F4861B80930A
+:104690001401089510921401089580911301681770
+:1046A00020F4861B8093130108951092130108953E
+:1046B00080911201681720F4861B809312010895DF
+:1046C00010921201089580911101681720F4861B41
+:1046D00080931101089510921101089580911001A5
+:1046E000681720F4861B8093100108951092100122
+:1046F00008950F931F938D3109F46BC008F03FC0EC
+:104700008E3009F47FC0C0F4873009F469C068F4C2
+:10471000863009F0B1C08091CF01817F8E7F809378
+:10472000CF0181E08093DF01A8C0883009F4A2C0E6
+:104730008B3009F49FC0A0C0863109F49BC078F487
+:10474000803109F472C0813109F096C00E9480174F
+:1047500090910D0181E0892780930D018BC08931F3
+:1047600009F488C08B3109F087C08091CF0181FBAB
+:10477000222720F991E0922790FB81F94CC08533E4
+:1047800009F470C048F4873209F46CC008F459C0C9
+:10479000893209F467C070C0833438F48A3308F072
+:1047A0004EC0883309F466C067C0833409F45AC028
+:1047B000883409F061C00E9480170FEF13ED20E3E9
+:1047C000015010402040E1F700C000000E94B81ED8
+:1047D00051C00E94FD240E94F0110E94E90A4AC0C3
+:1047E0009091CF01892F8095817080FB90F929F0FD
+:1047F000966098609093CF0140C0997F977F909387
+:10480000CF0138C08091CF0182FB222720F991E0AF
+:10481000922790FB82F98093CF01992359F18091DF
+:10482000CF0181608093CF0125C08091CF0183FBB0
+:10483000222720F991E0922790FB83F9ECCF89534E
+:1048400001C08D5141E050E060E070E08A019B01C1
+:1048500004C0000F111F221F331F8A95D2F7C90110
+:10486000B80104C061E070E080E090E00E943C1B71
+:104870000E94801781E001C080E01F910F91089590
+:1048800080E0089580E00895CF93C82F8091DF01E4
+:10489000813079F018F08230E9F187C0E0910E01A3
+:1048A000F0910F018081813169F0823209F07FC07F
+:1048B00009C0E0910E01F0910F018081813111F06A
+:1048C000823261F48C2F0E944024811104C08C2F0D
+:1048D0000E9479231DC081E090E01AC08C2F0E94B5
+:1048E0004224811114C0C43179F048F4CB3079F0FE
+:1048F000C03109F060C082E08093DF0108C0C93296
+:1049000019F0C83321F057C01092DF0154C081E084
+:10491000817053C0C93289F118F5C43171F1A8F41E
+:10492000C73009F046C08AE08093150194E1909366
+:10493000140193E0909313018093120188E0809317
+:10494000110188E28093100134C0CE51C63088F541
+:10495000EC2FF0E0E65DFE4F80818093DE0129C000
+:10496000CE34E9F020F4CB3421F56AE013C0C13530
+:1049700079F0C235F1F461E00DC08091DE01882349
+:1049800019F01092DE0115C081E08093DF0115C09F
+:1049900061E006C08091DE010E94B3220AC06AE095
+:1049A0008091DE010E94292304C01092DF0180E083
+:1049B00004C081E002C080E0ABCFCF910895E1E870
+:1049C000F0E08081886080838081816080838FB700
+:1049D000F89493E09093890090ED909388008FBFB6
+:1049E0000895EFE6F0E08081826080830895EFE62D
+:1049F000F0E080818D7F80830895EFE6F0E0908184
+:104A000082E08927808308951F920F920FB60F923C
+:104A100011242F933F934F935F936F937F938F93C3
+:104A20009F93AF93BF93EF93FF938091E001909199
+:104A3000E10101969093E1018093E001811103C0AF
+:104A400082E00E94E90AE091E101E695E695F0E056
+:104A5000E05EF74FE4918091E0018E1303C080E0A7
+:104A60000E94E90AFF91EF91BF91AF919F918F91C1
+:104A70007F916F915F914F913F912F910F900FBE5A
+:104A80000F901F90189504D06894B1118DC00895AF
+:104A900070D088F09F5790F0B92F9927B751A0F0A8
+:104AA000D1F0660F771F881F991F1AF0BA95C9F7C2
+:104AB00012C0B13081F077D0B1E0089574C0672F93
+:104AC000782F8827B85F39F0B93FCCF38695779572
+:104AD0006795B395D9F73EF490958095709561955B
+:104AE0007F4F8F4F9F4F0895E89409C097FB3EF486
+:104AF00090958095709561957F4F8F4F9F4F99232B
+:104B0000A9F0F92F96E9BB279395F69587957795A8
+:104B10006795B795F111F8CFFAF4BB0F11F460FF68
+:104B20001BC06F5F7F4F8F4F9F4F16C0882311F0C0
+:104B300096E911C0772321F09EE8872F762F05C0D4
+:104B4000662371F096E8862F70E060E02AF09A956F
+:104B5000660F771F881FDAF7880F9695879597F964
+:104B6000089557FD9058440F551F59F05F3F71F05D
+:104B70004795880F97FB991F61F09F3F79F08795C4
+:104B80000895121613061406551FF2CF4695F1DF4D
+:104B900008C0161617061806991FF1CF86957105DD
+:104BA000610508940895E894BB2766277727CB0111
+:104BB00097F908950BD078C069D028F06ED018F01E
+:104BC000952309F05AC05FC01124EECFCADFA0F3CD
+:104BD000959FD1F3950F50E0551F629FF001729F92
+:104BE000BB27F00DB11D639FAA27F00DB11DAA1FB1
+:104BF000649F6627B00DA11D661F829F2227B00DFE
+:104C0000A11D621F739FB00DA11D621F839FA00D88
+:104C1000611D221F749F3327A00D611D231F849FD8
+:104C2000600D211D822F762F6A2F11249F5750402F
+:104C30008AF0E1F088234AF0EE0FFF1FBB1F661FCA
+:104C4000771F881F91505040A9F79E3F510570F083
+:104C500014C0AACF5F3FECF3983EDCF386957795BE
+:104C60006795B795F795E7959F5FC1F7FE2B880F7E
+:104C7000911D9695879597F9089597F99F6780E814
+:104C800070E060E008959FEF80EC089500240A949E
+:104C90001616170618060906089500240A94121617
+:104CA0001306140605060895092E0394000C11F44A
+:104CB000882352F0BB0F40F4BF2B11F460FF04C0F7
+:104CC0006F5F7F4F8F4F9F4F089597FB072E16F40E
+:104CD000009407D077FD09D00E947F2607FC05D0FD
+:104CE0003EF4909581959F4F0895709561957F4F03
+:104CF0000895EE0FFF1F0590F491E02D0994AA1B73
+:104D0000BB1B51E107C0AA1FBB1FA617B70710F0B6
+:104D1000A61BB70B881F991F5A95A9F780959095E8
+:104D2000BC01CD010895F999FECF92BD81BDF89ADD
+:104D3000992780B50895A8E1B0E042E050E00C94D6
+:104D4000BB26262FF999FECF92BD81BDF89A019717
+:104D500000B4021639F01FBA20BD0FB6F894FA9AC3
+:104D6000F99A0FBE08950196272F0E94A2260C944F
+:104D7000A126DC01CB01FC01F999FECF06C0F2BDF2
+:104D8000E1BDF89A319600B40D9241505040B8F709
+:064D90000895F894FFCF26
+:104D96002002EB0A790B560B220BEE0A0101BC012D
+:104DA60028080A03140A3F4D3639E10794075E07BF
+:104DB6002507B806D106EA0603070102030405061D
+:044DC60007080900D1
+:00000001FF
index 29f1099d06dd5e3d927acc7fbdef27315e9c6dbe..031d874a7ba8229f3ed2f568785befa0e3dee1fc 100644 (file)
Binary files a/keyboard/ergodox_ez/keymaps/osx_de_experimental/osx_de_experimental_highres.png and b/keyboard/ergodox_ez/keymaps/osx_de_experimental/osx_de_experimental_highres.png differ
diff --git a/keyboard/ergodox_ez/keymaps/osx_de_experimental/readme.md b/keyboard/ergodox_ez/keymaps/osx_de_experimental/readme.md
new file mode 100644 (file)
index 0000000..e6a1018
--- /dev/null
@@ -0,0 +1,22 @@
+
+# Ergodox und Ergodox-EZ experimentelles Layout
+
+dieses layout ist experimentell und wird im Lufe der Zeit viele Änderungen und Verbesserungen durchlaufen. Falls diese sich als vorteilhaft erweisen, werden sie evtl. auch in das `osx_de` layout übernommen.
+
+
+
+# Erstellt Mit Dem ErgodoxLayoutGenerator
+
+Der ErgodoxLayoutGenerator (ELG) ist ein kleines Werkzeug, welches die Erstellung und Pflege der eigenen Keymaps erleichtern soll. Es ist in java geschrieben und kann [hier](https://github.com/sboesebeck/ErgodoxLayoutGenerator/releases) heruntergeladen werden. Damit das Tool funktioniert sollte das offizielle Oracle JDK in aktueller Version installiert sein.
+Die Dokumentation für den ELG kann man [hier](https://boesebeck.name/2016/04/16/ergodoxlayoutgenerator-documentation/) nachlesen (momentan leider nur in Englisch verfügbar).
+---------------------------------------------------------------------------------------------------------------------
+
+# Ergodox and Ergodox-EZ experimental layout
+
+This is an experimental layout which will undergo heavy changes over time. If changes prove to be good, they might also move into the `osx_de` layout.
+
+Created Using the ErgodoxLayoutGenerator
+
+The ErgodoxLayoutGenerator (ELG) is a little tool, which makes the creation and maintenance of keycaps a lot easier. It was written in Java and can be downloaded  [here](https://github.com/sboesebeck/ErgodoxLayoutGenerator/releases). To use the tool, you need to have a current version of Oracles JDK installed.
+
+The documentation of the ELG can be viewed [here](https://boesebeck.name/2016/04/16/ergodoxlayoutgenerator-documentation/).
\ No newline at end of file
diff --git a/keyboard/ergodox_ez/keymaps/townk_osx/config.h b/keyboard/ergodox_ez/keymaps/townk_osx/config.h
new file mode 100644 (file)
index 0000000..78aa3ee
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0x1307
+#define DEVICE_VER      0x0001
+#define MANUFACTURER    ErgoDox EZ
+#define PRODUCT         ErgoDox EZ
+#define DESCRIPTION     t.m.k. keyboard firmware for Ergodox
+
+/* key matrix size */
+#define MATRIX_ROWS 14
+#define MATRIX_COLS 6
+
+#define MOUSEKEY_DELAY          100
+#define MOUSEKEY_INTERVAL       20
+#define MOUSEKEY_MAX_SPEED      3
+#define MOUSEKEY_TIME_TO_MAX    10
+
+#define TAPPING_TOGGLE  1
+
+#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 }
+#define ROWS (int []){ D0, D5, B5, B6 }
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+#define BACKLIGHT_LEVELS 3
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE    2
+#define TAPPING_TERM    200
+#define IGNORE_MOD_TAP_INTERRUPT // this makes it possible to do rolling combos (zx) with keys that convert to other keys on hold (z becomes ctrl when you hold it, and when this option isn't enabled, z rapidly followed by x actually sends Ctrl-x. That's bad.)
+
+/* 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 */
+#define IS_COMMAND() ( \
+    keyboard_report->mods == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) || \
+    keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \
+)
+
+/*
+ * 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
+//#define DEBUG_MATRIX_SCAN_RATE
+#define ONESHOT_TAP_TOGGLE 2
+#define ONESHOT_TIMEOUT 3000
+
+#endif
diff --git a/keyboard/ergodox_ez/keymaps/townk_osx/keymap.c b/keyboard/ergodox_ez/keymaps/townk_osx/keymap.c
new file mode 100644 (file)
index 0000000..b63698e
--- /dev/null
@@ -0,0 +1,285 @@
+#include "ergodox_ez.h"
+#include "debug.h"
+#include "action_layer.h"
+#include "action_util.h"
+#include "led.h"
+#include "keymap_common.h"
+#include "timer.h"
+
+/*
+
+# Why this Layout
+
+This layout was based on Kinesis layout and other ErgoDox user layouts
+available. It's target to be used on a MacOS but I'm pretty sure it can be
+addapted to Windows and/or Linux easily.
+
+## Function Key
+
+The `fn` key work almost like it would in any other keyboard with the exception
+it has a semi-sticky behavior. What does that mean?
+
+Well, if you press the `fn` and release it, the keyboard will be put on the
+_function layout_ and the next key stroke will be processed as if the `fn` key
+was pressed. Aftwards, the leyout get back to _normal_. If you hold `fn` and
+press any other key, when you release them, the keyboard leyout is back to
+_normal_.
+
+While pressing the `fn` with the left hand and strikeing the other keys on the
+right hand is farly easy, the same cannot being said for the other keys on the
+left side. So, instead of trying to do contorcionism with my left hand, I
+decided to do a semi-sticky version of `fn`. This way, I can press the  `fn`
+key with my pinky, release it and press the `1` key to issue an `F1` to the
+operating system.
+
+## Key-Pad Key
+
+The `key pad` key is a layout switch key. If pressed, it will put the keyboard
+on the _key pad layout_ and stay there until key is pressed again.
+
+This is used to make the keyboard behave mostly like a **num pad keyboard**.
+
+## Notes
+- Regardless in which layout you are, keys from other layouts are not
+  accessible. This means that if you are on the _key pad layout_, the left hand
+  will be pretty much unusable.
+  Of course that like anything else, there are exceptions to this rule.
+  Modifiers should remain accessible throughout the layers.
+- The _shift key_ is, like the _function key_, also configured to have a sticky
+  behavior.
+- All sticky keys have a timeout of 3 seconds.
+
+*/
+#define BASE   0
+#define KEYPAD 1
+#define FN     2
+
+#define MACRO_TMUX_ESC        10
+#define MACRO_TMUX_PASTE      11
+#define MACRO_OSX_COPY        12
+#define MACRO_OSX_PASTE       13
+
+#define M_TESC   M(MACRO_TMUX_ESC)
+#define M_TPASTE M(MACRO_TMUX_PASTE)
+#define M_OSXCPY M(MACRO_OSX_COPY)
+#define M_OSXPST M(MACRO_OSX_PASTE)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Base Layer
+ *
+ * ,-----------------------------------------------------.           ,-----------------------------------------------------.
+ * |        `~ |   1  |   2  |   3  |   4  |   5  | ESC  |           | Pwr  |   6  |   7  |   8  |   9  |   0  | - _       |
+ * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
+ * | Tab       |   Q  |   W  |   E  |   R  |   T  | F16  |           | F17  |   Y  |   U  |   I  |   O  |   P  | = +       |
+ * |-----------+------+------+------+------+------| Meh  |           | Meh  |------+------+------+------+------+-----------|
+ * | \ (Ctrl)  |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   ;  | ' " (Ctrl)|
+ * |-----------+------+------+------+------+------| F18  |           | F19  |------+------+------+------+------+-----------|
+ * |  LShift   |   Z  |   X  |   C  |   V  |   B  | Hyper|           | Hyper|   N  |   M  |   ,  |   .  |   /  |   RShift  |
+ * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
+ *     | FN    | KPAD |LCtrl | LAlt | LGui |                                       | RGui | RAlt | RCtrl| KPAD |    FN |
+ *     `-----------------------------------'                                       `-----------------------------------'
+ *                                         ,-------------.           ,-------------.
+ *                                         | M(0) | M(1) |           | M(2) | M(3) |
+ *                                  ,------|------|------|           |------+------+------.
+ *                                  |      |      | Home |           | PgUp |      |      |
+ *                                  |Backsp| Del  |------|           |------| Enter| Space|
+ *                                  |      |      | End  |           | PgDn |      |      |
+ *                                  `--------------------'           `--------------------'
+ *
+ * M(0) = Ctrk+A Esc
+ *        (this is used to issue the Esc key to the Tmux application)
+ * M(1) = Ctrk+A P
+ *        (this is used to issue the Paste key to the Tmux application)
+ * M(2) = Cmd+C
+ * M(3) = Cmd+V
+ */
+[BASE]=KEYMAP(//left half
+              KC_GRV,         KC_1,       KC_2,     KC_3,           KC_4,       KC_5,     KC_ESC,
+              KC_TAB,         KC_Q,       KC_W,     KC_E,           KC_R,       KC_T,     MEH_T(KC_F16),
+              CTL_T(KC_BSLS), KC_A,       KC_S,     KC_D,           KC_F,       KC_G,
+              KC_FN2,         KC_Z,       KC_X,     KC_C,           KC_V,       KC_B,     ALL_T(KC_F18),
+              KC_FN1,         TG(KEYPAD), KC_LCTRL, KC_LALT,        KC_LGUI,
+                                                                                M_TESC,   M_TPASTE,
+                                                                                          KC_HOME,
+                                                                    KC_BSPC,    KC_DELT,  KC_END,
+              //right half
+              KC_POWER,       KC_6,       KC_7,     KC_8,           KC_9,       KC_0,     KC_MINS,
+              MEH_T(KC_F17),  KC_Y,       KC_U,     KC_I,           KC_O,       KC_P,     KC_EQL,
+                              KC_H,       KC_J,     KC_K,           KC_L,       KC_SCLN,  CTL_T(KC_QUOT),
+              ALL_T(KC_F19),  KC_N,       KC_M,     KC_COMM,        KC_DOT,     KC_SLSH,  KC_FN2,
+                              KC_RGUI,    KC_RALT,  CTL_T(KC_LBRC), KC_FN3,     KC_FN1,
+              M_OSXCPY,       M_OSXPST,
+              KC_PGUP,
+              KC_PGDN,        KC_ENT,     KC_SPC),
+
+/* Keymap 1: KeyPad Layer
+ *
+ * ,-----------------------------------------------------.           ,-----------------------------------------------------.
+ * |           |      | LClk | RClk | MClk |      |      |           | BTab | Clear|   /  |   *  |   ^  |   (  |           |
+ * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
+ * | M.Accel 2 |      |ScrlUp|  U   |ScrlDn|      |      |           | Tab  |   7  |   8  |   9  |   +  |   )  |           |
+ * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
+ * | M.Accel 1 |      |   L  |  D   |  R   |      |------|           |------|   4  |   5  |   6  |   -  |      |           |
+ * |-----------+------+------+------+------+------|      |           |Return|------+------+------+------+------+-----------|
+ * | M.Accel 0 |      |ScrlL |      |ScrlR |      |      |           |      |   1  |   2  |   3  |   =  |      |           |
+ * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
+ *     |       | XXXX |      |      |      |                                       |   0  |   .  |   ,  | XXXX |       |
+ *     `-----------------------------------'                                       `-----------------------------------'
+ *                                         ,-------------.           ,-------------.
+ *                                         |      |      |           |      |      |
+ *                                  ,------|------|------|           |------+------+------.
+ *                                  |      |      |      |           |      | XXXX |      |
+ *                                  |      |      |------|           |------| XXXX |      |
+ *                                  |      |      |      |           |      | XXXX |      |
+ *                                  `--------------------'           `--------------------'
+ */
+[KEYPAD]=KEYMAP(//left half
+                KC_NO,        KC_NO,    KC_MS_BTN1,    KC_MS_BTN2,     KC_MS_BTN3,     KC_NO,   KC_NO,
+                KC_MS_ACCEL2, KC_NO,    KC_MS_WH_UP,   KC_MS_U,        KC_MS_WH_DOWN,  KC_NO,   KC_NO,
+                KC_MS_ACCEL1, KC_NO,    KC_MS_L,       KC_MS_D,        KC_MS_R,        KC_NO,
+                KC_MS_ACCEL0, KC_NO,    KC_MS_WH_LEFT, KC_NO,          KC_MS_WH_RIGHT, KC_NO,   KC_NO,
+                KC_NO,        KC_TRNS,  KC_NO,         KC_NO,          KC_NO,
+                                                                                       KC_NO,   KC_NO,
+                                                                                                KC_NO,
+                                                                       KC_NO,          KC_NO,   KC_NO,
+                //right half
+                LSFT(KC_TAB), KC_CLEAR, KC_KP_SLASH,   KC_KP_ASTERISK, KC_CIRCUMFLEX,  KC_LPRN, KC_NO,
+                KC_TAB,       KC_KP_7,  KC_KP_8,       KC_KP_9,        KC_KP_PLUS,     KC_RPRN, KC_NO,
+                              KC_KP_4,  KC_KP_5,       KC_KP_6,        KC_KP_MINUS,    KC_NO,   KC_NO,
+                KC_KP_ENTER,  KC_KP_1,  KC_KP_2,       KC_KP_3,        KC_KP_EQUAL,    KC_NO,   KC_NO,
+                                        KC_KP_0,       KC_KP_DOT,      KC_KP_COMMA,    KC_TRNS, KC_NO,
+                KC_NO,        KC_NO,
+                KC_NO,
+                KC_NO,        KC_TRNS,  KC_NO),
+
+/* Keymap 2: Functions Layer
+ *
+ * ,-----------------------------------------------------.           ,-----------------------------------------------------.
+ * |           |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |           |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |  Vol. Up  |
+ * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
+ * |           | Stop |  Rw  |  Rec |  FF  |      | XXXX |           | XXXX |      |      |      |      |      | Vol. Down |
+ * |-----------+------+------+------+------+------| XXXX |           | XXXX |------+------+------+------+------+-----------|
+ * |  CapsLock | Eject| Prev | Play | Next |      |------|           |------| Left | Down |  Up  | Right|      |   Mute    |
+ * |-----------+------+------+------+------+------| XXXX |           | XXXX |------+------+------+------+------+-----------|
+ * |  L Shift  |      |      |      |      |      | XXXX |           | XXXX |      |      |      |      |      |  R Shift  |
+ * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
+ *     | XXXXX |      | XXXX | XXXX | XXXX |                                       | XXXX | XXXX | XXXX |      | XXXXX |
+ *     `-----------------------------------'                                       `-----------------------------------'
+ *                                         ,-------------.           ,-------------.
+ *                                         |      |      |           |      |      |
+ *                                  ,------|------|------|           |------+------+------.
+ *                                  |      |      |      |           |      |      |      |
+ *                                  |      |      |------|           |------|      |      |
+ *                                  |      |      |      |           |      |      |      |
+ *                                  `--------------------'           `--------------------'
+ *
+ * XXX = These keys are transparent keys that, when pressed, they issue the key from the previous layer.
+ */
+[FN]=KEYMAP(//left half
+            KC_NO,   KC_F1,          KC_F2,               KC_F3,               KC_F4,                 KC_F5,  KC_F6,
+            KC_NO,   KC_MEDIA_STOP,  KC_MEDIA_REWIND,     KC_MEDIA_SELECT,     KC_MEDIA_FAST_FORWARD, KC_NO,  KC_TRNS,
+            KC_CAPS, KC_MEDIA_EJECT, KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK,   KC_NO,
+            KC_LSFT, KC_NO,          KC_NO,               KC_NO,               KC_NO,                 KC_NO,  KC_TRNS,
+            KC_TRNS, KC_NO,          KC_TRNS,             KC_TRNS,             KC_TRNS,
+                                                                                                      KC_NO,  KC_NO,
+                                                                                                              KC_NO,
+                                                                               KC_NO,                 KC_NO,  KC_NO,
+            //right half
+            KC_F7,   KC_F8,          KC_F9,               KC_F10,              KC_F11,                KC_F12, KC_VOLU,
+            KC_TRNS, KC_NO,          KC_NO,               KC_NO,               KC_NO,                 KC_NO,  KC_VOLD,
+                     KC_LEFT,        KC_DOWN,             KC_UP,               KC_RIGHT,              KC_NO,  KC_MUTE,
+            KC_TRNS, KC_NO,          KC_NO,               KC_NO,               KC_NO,                 KC_NO,  KC_RSFT,
+                                     KC_TRNS,             KC_TRNS,             KC_TRNS,               KC_NO,  KC_TRNS,
+            KC_NO,   KC_NO,
+            KC_NO,
+            KC_NO,   KC_NO,          KC_NO)};
+
+const uint16_t PROGMEM fn_actions[] = {
+  [1] = ACTION_LAYER_ONESHOT(FN),
+  [2] = ACTION_MODS_ONESHOT(MOD_LSFT),  // Sticky shift light. Tap for the next keypress to be shifted. Hold for regular shift.
+  [3] = ACTION_LAYER_TAP_KEY(KEYPAD, KC_RBRC),
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
+  // MACRODOWN only works in this function
+  switch(id) {
+    case MACRO_TMUX_ESC:
+      if (record->event.pressed) {
+        return MACRO(D(LCTRL), T(A), U(LCTRL), D(ESC), END);
+      }
+      return MACRO(U(ESC), END);
+    case MACRO_TMUX_PASTE:
+      if (record->event.pressed) {
+        return MACRO(D(LCTRL), T(A), U(LCTRL), D(P), END);
+      }
+      return MACRO(U(P), END);
+    case MACRO_OSX_COPY:
+      if (record->event.pressed) {
+        return MACRO(D(LGUI), D(C), END);
+      }
+      return MACRO(U(C), U(LGUI), END);
+    case MACRO_OSX_PASTE:
+      if (record->event.pressed) {
+        return MACRO(D(LGUI), D(V), END);
+      }
+      return MACRO(U(V), U(LGUI), END);
+  }
+  return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+};
+
+uint8_t current_layer = BASE;
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+  uint8_t layer = biton32(layer_state);
+
+  ergodox_led_all_off();
+  ergodox_led_all_set(LED_BRIGHTNESS_LO);
+
+  switch (layer) {
+  case BASE:
+    current_layer = BASE;
+    break;
+  case KEYPAD:
+    current_layer = KEYPAD;
+    break;
+  default:
+    // none
+    break;
+  }
+
+  // layer leds
+  if (current_layer == KEYPAD) {
+    ergodox_right_led_3_on();
+  }
+
+  // capslock
+  if (host_keyboard_leds() & (3<<USB_LED_CAPS_LOCK)) {
+    ergodox_right_led_1_on();
+  }
+
+  // Temporary leds
+
+  // The function layer takes over other layers and we need to reflect that on the leds.
+  // If the current layer is the BASE, we simply turn on the FN led, but if the current
+  // layer is the KEYPAD, than we must turn it off before turning on the FN led.
+  if (layer == FN && !has_oneshot_layer_timed_out()) {
+    ergodox_right_led_3_off();
+    ergodox_right_led_2_on();
+  }
+
+  // if the shifted is pressed I show the case led in a brighter color. This is nice to
+  // differenciate the shift from the capslock.
+  // Notice that I make sure that we're not using the shift on a chord shortcut (pressing
+  // shift togather with other modifiers).
+  if((keyboard_report->mods & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) &&                                 // is shift pressed and there is no other
+      !(keyboard_report->mods & (~MOD_BIT(KC_LSFT) & ~MOD_BIT(KC_RSFT)))) ||                           //    modifier being pressed as well
+     (get_oneshot_mods() & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) && !has_oneshot_mods_timed_out())) {  // or the one shot shift didn't timed out
+    ergodox_right_led_1_set(LED_BRIGHTNESS_HI);
+    ergodox_right_led_1_on();
+  }
+};
diff --git a/keyboard/ergodox_ez/keymaps/townk_osx/makefile.mk b/keyboard/ergodox_ez/keymaps/townk_osx/makefile.mk
new file mode 100644 (file)
index 0000000..e757557
--- /dev/null
@@ -0,0 +1,4 @@
+# I don't want my keyboard blinking lights when is suppose to be asleep.
+SLEEP_LED_ENABLE = no
+
+CONFIG_H = keymaps/$(KEYMAP)/config.h
diff --git a/keyboard/ergodox_ez/keymaps/townk_osx/readme.md b/keyboard/ergodox_ez/keymaps/townk_osx/readme.md
new file mode 100644 (file)
index 0000000..c2853ca
--- /dev/null
@@ -0,0 +1,77 @@
+# Townk's Keymap
+
+Trying to take care of an enjury on my arm I borrow an ergonomic keyboard from
+a frient ([Kinesis Advantage](http://www.kinesis-ergo.com/shop/advantage-pro-for-pc-mac/)).
+
+I really enjoyed my time with it but there were some anoyancies:
+
+* The curvature on the keys bothered me since I'm a Vim user and using the
+  motion keys on my editor was awkard.
+* I had to spend too much time remapping the keyboard to make some symbol keys
+  more accessible to me.
+* The fact that my hands had to stay close to each other was a bit stressfull
+  to my sholders.
+
+After a long research I find out that Ergodox EZ would be perfect for my needs
+and purchase one. Before the keyboard even got in my hands I started to think
+on the layout I would use on it and soon enough I planed couple adjustments
+from the Kinesis I was using so far.
+
+## The layout
+
+Here are the layout mapping in images so you can have a glimpse on it:
+
+![Base Layout](townk_osx_base.png)
+![fn Layout](townk_osx_fn.png)
+![Keypad & Mouse Layout](townk_osx_keypad.png)
+
+Notice that, differently from the default behavior, my layer keys are not transparent
+by default, which means that if you press any non-labeled white key, nothing will be
+handled to the OS.
+
+### One shot keys
+
+It all started with the access to the function keys (F1, F2, F3...), since
+those keys are located on a different layer I needed a way to press them with
+minimal effort without disrupting my flow.
+
+For me, togglihg a layer to press a button and than toggle it back is a waste
+of time (although I admit it's a single tap from what I have), so I decided to
+do it as a one shot key. I could press it and the next pressed key would be
+handled by the target layer which just after it delivers the key to the OS it
+would get back to the previous layer.
+
+After setting up my layout to do just that I realized that occasionally I
+would stop myseld on the middle of the process and the one shot layer would be
+still triggered until I press any other key. So to prevent me from tapping
+keys I don't want I added a timeout of 3 seconds for the one shot actions.
+
+Ultimately I tested the shift key as a one shot one and really like it, so
+here you have it, all the one shot keys on my layout.
+
+## Glossary
+
+If you're not familiar with the Mac symbols used on some keys, here is a
+reference to them:
+
+| Symbol | Description         |
+| :----: | ------------------- |
+|   ⌘    | Command             |
+|   ⇪    | Caps Lock           |
+|   ⇧    | Shift               |
+|   ⌥    | Option (alt)        |
+|   ⎋    | Esc                 |
+|   ⇥    | Tab forward         |
+|   ⇤    | Tab backward        |
+|   ⌃    | Control             |
+|   ␣    | Space               |
+|   ⌫    | Backspace           |
+|   ⌦    | Delete              |
+|   ⏎    | Enter               |
+|   ⌤    | Return              |
+|   ⌽    | Power on/off button |
+|   ↖    | Home                |
+|   ↘    | End                 |
+|   ⇞    | Page up             |
+|   ⇟    | Page down           |
+|   ⌧    | Clear               |
diff --git a/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx.hex b/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx.hex
new file mode 100644 (file)
index 0000000..868d86e
--- /dev/null
@@ -0,0 +1,1166 @@
+:100000000C9474020C94B8020C94B8020C94B802CC\r
+:100010000C94B8020C94B8020C94B8020C94B80278\r
+:100020000C94B8020C94B8020C94ED0C0C94BF0D17\r
+:100030000C94141C0C94B8020C94B8020C94B802E2\r
+:100040000C94B8020C94B8020C94B8020C94B80248\r
+:100050000C94B8020C947C1C0C94B8020C94B8025A\r
+:100060000C94B8020C94B8020C94B8020C94B80228\r
+:100070000C94B8020C94B8020C94B8020C94B80218\r
+:100080000C94B8020C94B8020C94B8020C94B80208\r
+:100090000C94B8020C94B8020C94B8020C94B802F8\r
+:1000A0000C94B8020C94B8020C94B8022C0E4E0EAC\r
+:1000B0003C0F4E0E3C0F930EB60E3C0F0B0F1E0F57\r
+:1000C00029122912551255129D12BB1237143714DA\r
+:1000D000C61237147B137B132814371437143114CA\r
+:1000E0008813881388138813881388138813881338\r
+:1000F0008813881388138813881388138813881328\r
+:100100009913A713AE13B513BF13021902E300012D\r
+:10011000E3011900020602E30001E30106000213F5\r
+:100120000001E00104020402E001130002290001C1\r
+:10013000E00104020402E00129000000F4A2002210\r
+:1001400030A135002B003171C200C10000001E003B\r
+:10015000140004001D0001544D001F001A00160079\r
+:100160001B00E0004C002000080007000600E20031\r
+:100170002A002100150009001900E3004A002200AE\r
+:1001800017000A00050000000A3029006B77000004\r
+:100190006D7F00000B3066006C7700006E7F000002\r
+:1001A0000C3023001C000B00110000000D30240057\r
+:1001B00018000D001000E7004B0025000C000E0099\r
+:1001C0003600E6002C00260012000F0037002F71C9\r
+:1001D00028002700130033003800C3004E002D0014\r
+:1001E0002E003471C200C10000000000FF00FE00BC\r
+:1001F000FD00000000000000000000000000010001\r
+:100200000000F400F900F200FB0000000000F5001F\r
+:10021000F000F100000000000000F600FA00F3001A\r
+:10022000FC000000000000000000000000000000D2\r
+:1002300000000000000000000000000000002B0291\r
+:100240002B0000005800000000009C005F005C00D4\r
+:10025000590000000000540060005D005A00620078\r
+:100260000000550061005E005B0063000000230297\r
+:100270005700560067008500010026022702000093\r
+:10028000000001000000000000000000000000006D\r
+:100290000000000000003900E100010000003A0009\r
+:1002A000AD00B0000000000000003B00BC00AC004E\r
+:1002B0000000010000003C00AF00AE0000000100A3\r
+:1002C00000003D00BB00AB000000010000003E004C\r
+:1002D000000000000000000000003F0001000000DE\r
+:1002E00001000000000040000100000001000000CB\r
+:1002F000000041000000500000000000000042002B\r
+:100300000000510000000100000043000000520006\r
+:10031000000001000000440000004F000000010048\r
+:100320000000450000000000000000000000A900DF\r
+:10033000AA00A800E50001000000160345007200B5\r
+:1003400067006F0044006F007800200045005A00ED\r
+:10035000000016034500720067006F0044006F0044\r
+:100360007800200045005A00000004030904090237\r
+:100370006D00040100A0FA0904000001030101005E\r
+:10038000092111010001223F000705810308000A2D\r
+:1003900009040100010301020009211101000122E9\r
+:1003A0004D000705820308000A090402000103004A\r
+:1003B000000009211101000122360007058303080E\r
+:1003C000000A0904030001030000000921110100D3\r
+:1003D00001223900070584031000011201100100F9\r
+:1003E000000008EDFE0713010001020001050109EC\r
+:1003F00006A101050719E029E715002501950875F3\r
+:1004000001810205081901290595057501910295DB\r
+:10041000017503910105071900297715002501953C\r
+:100420007875018102C005010980A10185021601CC\r
+:100430000026B7001A01002AB70075109501810047\r
+:10044000C0050C0901A1018503160100269C021AB2\r
+:1004500001002A9C02751095018100C00501090266\r
+:10046000A1010901A10005091901290515002501AE\r
+:10047000950575018102950175038101050109301A\r
+:1004800009311581257F9502750881060938158186\r
+:10049000257F950175088106050C0A38021581250E\r
+:1004A0007F950175088106C0C005010906A10105F7\r
+:1004B0000719E029E71500250195087501810295C6\r
+:1004C0000175088101050819012905950575019136\r
+:1004D000029501750391010507190029FF150025F3\r
+:1004E000FF950675088100C011241FBECFEFDAE02A\r
+:1004F000DEBFCDBF04B603FE24C08091F30190910E\r
+:10050000F401A091F501B091F6018730904BA7401E\r
+:10051000B04BB9F41092F3011092F4011092F5016E\r
+:100520001092F60114BE84B7877F84BF88E10FB6AE\r
+:10053000F89480936000109260000FBEE0E0FFE34B\r
+:10054000099511E0A0E0B1E0E0E9F8E402C005900F\r
+:100550000D92A433B107D9F711E0A4E3B1E001C0D3\r
+:100560001D92A33FB107E1F70E94330A0C94462481\r
+:100570000C940000FC016B3079F018F46A3031F013\r
+:100580001DC06C3079F06D3099F018C082818111F6\r
+:1005900018C08CE291E008958281811115C08EE12E\r
+:1005A00091E008958281811112C084E191E0089563\r
+:1005B000828181110FC08AE091E0089580E090E08F\r
+:1005C00008958FE291E0089581E291E0089589E134\r
+:1005D00091E008958FE091E008950895CF936091A0\r
+:1005E000B2017091B3018091B4019091B5010E9464\r
+:1005F0007F1BC82F56985E9825982D9826982E9880\r
+:1006000027982F988FE090E090938900809388003E\r
+:1006100090938B0080938A0090938D0080938C0040\r
+:10062000CC2329F0C13029F4C093340102C01092C8\r
+:10063000340180913401813011F4279A2F9A0E945D\r
+:10064000750F867011F0259A2D9AC23041F40E94E0\r
+:10065000081A811104C027982F98269A2E9AE091A3\r
+:100660000E01F0910F018081982F927259F08D7DCB\r
+:1006700049F48FEF90E09093890080938800259A49\r
+:100680002D9A08C00E94351B827221F00E94DB194E\r
+:10069000882379F3CF9108950C94EE0256985E98D2\r
+:1006A00025982D9826982E9827982F988FEF90E0D0\r
+:1006B000909389008093880090938B0080938A00A8\r
+:1006C00090938D0080938C00259A2D9A2FEF80E7D0\r
+:1006D00092E0215080409040E1F700C00000269A4F\r
+:1006E0002E9A2FEF80E792E0215080409040E1F772\r
+:1006F00000C00000279A2F9A2FEF80E792E0215048\r
+:1007000080409040E1F700C0000025982D982FEF21\r
+:1007100080E792E0215080409040E1F700C0000067\r
+:1007200026982E982FEF80E792E02150804090404D\r
+:10073000E1F700C0000027982F9856985E982598FA\r
+:100740002D9826982E9827982F98089589EA8093B7\r
+:10075000800089E08093810024982C983F988AB18A\r
+:100760008F748AB96E98479A8BB1806B8BB9769AE1\r
+:100770000E944E030C94ED0280E280930001809170\r
+:10078000350181110EC00E940B0481E08093350178\r
+:100790002FEF83ED90E3215080409040E1F700C0BF\r
+:1007A000000080E40E9411048093000181112EC09A\r
+:1007B0000E943B0480930001811128C00E943B04E9\r
+:1007C00080930001811122C08FE30E943B0480933B\r
+:1007D000000181111BC00E94330480E40E941104B7\r
+:1007E00080930001811112C08CE00E943B04809331\r
+:1007F000000181110BC00E943B0480930001811114\r
+:1008000005C08FE30E943B04809300010E943304E3\r
+:100810008091000108951092B9008AE08093B80099\r
+:10082000089594EA9093BC009091BC0097FFFCCF90\r
+:100830009091B900987F983021F0903111F081E0CB\r
+:1008400008958093BB0084E88093BC008091BC0035\r
+:1008500087FFFCCF8091B900887F883111F0803408\r
+:1008600071F780E0089584E98093BC008091BC001A\r
+:1008700084FDFCCF08958093BB0084E88093BC0086\r
+:100880008091BC0087FFFCCF9091B900987F81E0F8\r
+:10089000983209F480E0089584E88093BC00809148\r
+:1008A000BC0087FFFCCF8091BB00089580910001C0\r
+:1008B000811115C080E40E94110480930001811110\r
+:1008C0000CC082E10E943B0480930001811105C0AD\r
+:1008D0008FEF0E943B04809300010E94330484B197\r
+:1008E000807F84B985B1807F85B98AB1837F8AB9D9\r
+:1008F0008BB1837F8BB93E98469808950E94BC03C4\r
+:10090000809300010E94560480B38C7080BB81B339\r
+:10091000836F81BBA7E3B1E0E5E4F1E08EE08E0FE9\r
+:1009200011921D928E13FCCF0C94A603BF92CF920E\r
+:10093000DF92EF92FF920F931F93CF93DF938091FB\r
+:100940000001882379F0809136018F5F8093360112\r
+:10095000811108C00E94BC0380930001811102C074\r
+:100960000E944E0307E311E0C0E0D0E0DD24D39401\r
+:1009700082E0C82EEE24E394F12CC730D10500F5B7\r
+:1009800080910001811164C080E40E941104809371\r
+:100990000001811112C082E10E943B04809300019A\r
+:1009A00081110BC0C7010C2E01C0880F0A94EAF711\r
+:1009B00080950E943B04809300010E94330448C04C\r
+:1009C000CA30A1F028F4C83059F0C93061F005C030\r
+:1009D000CC3089F070F0CD3089F0209A289810C082\r
+:1009E000219A29980DC0229A2A980AC0239A2B98F6\r
+:1009F00007C0529A01C0539A5B9802C03E9A46982B\r
+:100A000090EA9A95F1F79FB1799902C082E001C00E\r
+:100A100080E091709D25982B7C9902C084E001C0F4\r
+:100A200080E0892B7D9902C038E001C030E0832B43\r
+:100A30007E9902C020E101C020E0822B9FB19095F9\r
+:100A4000991F9927991F9295990F907E892B0FC016\r
+:100A500080910001811149C080E40E9411048093BB\r
+:100A60000001882379F1B12C0E9433048B2DF80109\r
+:100A70009081981719F08083C09201010E9456045A\r
+:100A800021960F5F1F4FCE30D10509F076CF8091B0\r
+:100A90000101882361F1815080930101882339F09D\r
+:100AA0008FE99FE00197F1F700C0000020C0A5E4A6\r
+:100AB000B1E0E7E3F1E0CF01825F91919D938E1366\r
+:100AC000FCCF15C083E10E943B048093000181119B\r
+:100AD000CACF81E40E941104809300018111C3CF29\r
+:100AE0000E944C04B82EB094BFCF80E0C0CF0E94CB\r
+:100AF0004C0381E0DF91CF911F910F91FF90EF9018\r
+:100B0000DF90CF90BF900895E82FF0E0EB5BFE4FB1\r
+:100B1000808108950895089596E0799FF001112449\r
+:100B200094E5899FE00DF11D1124E60FF11DEE0FF4\r
+:100B3000FF1FEE5BFE4F859194910895880F991FDA\r
+:100B4000FC01E654F040859194910895880F991F17\r
+:100B5000FC01E65CFE4F8591949108950F931F93DD\r
+:100B6000CF93DF93EC018115904350F5C11580E2DE\r
+:100B7000D80708F0B3C0CB3BD10590F4C83AD105F3\r
+:100B800008F05AC0C53AD10508F04BC0C430D105B1\r
+:100B900008F0CCC1219709F0C6C101E010E006C2FF\r
+:100BA000CF3FD10511F008F0C1C1C03FD10508F019\r
+:100BB00092C0CE01805E9109089708F4B7C1B3C115\r
+:100BC000C11591E5D907A8F4C23020E5D20708F095\r
+:100BD0009EC0C11580E5D80709F485C008F091C012\r
+:100BE000C11520E4D20708F09EC1DD278E01106CEC\r
+:100BF000DDC1C11580E8D80758F4C11590E7D907C1\r
+:100C000008F08DC1C11520E6D20708F422C18BC1BE\r
+:100C1000C11580E9D80708F086C1DF708E01106A1F\r
+:100C2000C5C1C53AD10509F483C1C63AD10509F059\r
+:100C300082C102E810E4BAC1C83AD10509F47EC104\r
+:100C4000C93AD10509F47DC1CA3AD10509F47CC17C\r
+:100C5000CB3AD10509F47BC1CC3AD10509F47AC16C\r
+:100C6000CD3AD10509F479C1C03BD10509F478C169\r
+:100C7000CE3AD10509F477C1CF3AD10509F476C14E\r
+:100C8000C13BD10509F475C1C23BD10509F474C15A\r
+:100C9000C33BD10509F473C1C43BD10509F472C14A\r
+:100CA000C53BD10509F471C1C63BD10509F470C13A\r
+:100CB000C73BD10509F46FC1C83BD10509F46EC12A\r
+:100CC000C93BD10509F46DC1CA3BD10509F46CC11A\r
+:100CD00000E014E46BC18E01106568C1CE019F7005\r
+:100CE0000E94A60564C10E948B149FEF24E38CE050\r
+:100CF000915020408040E1F700C000000E94A11CFC\r
+:100D000055C18091D40181608093D4014FC10E946C\r
+:100D10004A1E811102C00E94301E0E94671E90E090\r
+:100D20009093F3018093F201C23090E5D90721F44A\r
+:100D30008091F201816086C0C43020E5D20721F4A1\r
+:100D40008091F20182607EC0C63080E5D80721F430\r
+:100D50008091F201846076C0C83090E5D90719F41B\r
+:100D60008091F20127C0CA3020E5D20721F480919A\r
+:100D7000F201806167C0CC3080E5D80721F4809112\r
+:100D8000F20180625FC0CE3090E5D90721F48091F6\r
+:100D9000F201806457C0C03120E5D20721F4809170\r
+:100DA000F20180684FC0C23180E5D80729F48091F4\r
+:100DB000F2018460886046C0C33090E5D90721F411\r
+:100DC0008091F2018E7F3EC0C53020E5D20721F42C\r
+:100DD0008091F2018D7F36C0C73080E5D80721F4BD\r
+:100DE0008091F2018B7F2EC0C93090E5D90719F4AC\r
+:100DF0008091F20126C0CB3020E5D20721F480910A\r
+:100E0000F2018F7E1FC0CD3080E5D80721F480919C\r
+:100E1000F2018F7D17C0CF3090E5D90721F4809182\r
+:100E2000F2018F7B0FC0C13120E5D20721F4809100\r
+:100E3000F2018F7707C0C331D04531F48091F201C0\r
+:100E40008B7F877F8093F2018091F2010E946B1E5D\r
+:100E5000ADC08D2F99278F70992781309105D9F4D6\r
+:100E60009E012370332702C0880F991F2A95E2F74D\r
+:100E70009C688E0144E0000F111F4A95E1F700279E\r
+:100E80001370802B912B53E0CC0FDD1F5A95E1F7A7\r
+:100E9000C076DD272FC08230910531F4DC2FCC27BE\r
+:100EA0008E01016F106A82C08330910569F4CE0112\r
+:100EB0008370992701E010E002C0000F111F8A958E\r
+:100EC000E2F7C8019C680FC084309105B9F4CE01E7\r
+:100ED0008370992701E010E002C0000F111F8A956E\r
+:100EE000E2F7C8019A6823E0CC0FDD1F2A95E1F7ED\r
+:100EF000C07ED7708C010C2B1D2B58C085309105FE\r
+:100F000031F4DC2FCC278E01046F106A4FC0069796\r
+:100F100009F04CC0CF71DD27DC2FCC2701C0DF707A\r
+:100F20008E01106243C000E010E040C08E013EC060\r
+:100F300001E810E43BC003E810E438C002EE14E41A\r
+:100F400035C009EE14E432C00AEE14E42FC005EBFC\r
+:100F500014E42CC006EB14E429C007EB14E426C00B\r
+:100F60000CEC14E423C00DEC14E420C003E815E4F9\r
+:100F70001DC00AE815E41AC002E915E417C004E927\r
+:100F800015E414C001E216E411C003E216E40EC039\r
+:100F900004E216E40BC005E216E408C006E216E41B\r
+:100FA00005C007E216E402C00AE216E4C801DF91B8\r
+:100FB000CF911F910F91089596E0799FF001112430\r
+:100FC00094E5899FE00DF11D1124E60FF11DEE0F50\r
+:100FD000FF1FEE5BFE4F85919491803E9105E0F4FA\r
+:100FE000803C910558F58133910509F46FC048F4B0\r
+:100FF0008932910509F463C08A32910509F46DC004\r
+:1010000072C089339105E9F082389105D1F08533BA\r
+:10101000910509F44DC067C0833E910581F138F414\r
+:10102000803E9105B9F0823E9105D9F05CC0863EC4\r
+:10103000910561F1873E9105A1F155C00E949E0581\r
+:1010400008952091F20120FD02C021FF4CC080EEE6\r
+:1010500090E049C08091F20180FFF9CF89E390E0F0\r
+:1010600042C08091F20182FF0EC08091F20184FFA4\r
+:1010700003C080E090E037C083EE90E034C0809100\r
+:10108000F20182FFF2CF82EE90E02DC08091F2015A\r
+:1010900083FF0BC08091F20184FDEBCF87EE90E0DF\r
+:1010A00022C08091F20183FFF5CF86EE90E01BC055\r
+:1010B0008091F20185FF07C089E290E014C0809121\r
+:1010C000F20185FFF9CF85E390E00DC08091F20138\r
+:1010D00086FF07C08AE290E006C08091F20186FF99\r
+:1010E000F9CF81E390E00E94AE05089508950C9435\r
+:1010F0007608809163010895CF93DF9300D01F920B\r
+:10110000CDB7DEB79C018091E901843019F593E0F9\r
+:1011100099833B832A839093E9008FEF9091E800B5\r
+:10112000815095FD06C095ED9A95F1F7000081116B\r
+:10113000F5CF8091E80085FF0DC040E050E063E00E\r
+:1011400070E0CE0101960E94DD0A8091E8008E7762\r
+:101150008093E8000F900F900F90DF91CF9108954A\r
+:10116000CF93DF9300D01F92CDB7DEB72091E90176\r
+:10117000243021F522E029839B838A8383E08093B6\r
+:10118000E9008FEF9091E800815095FD06C095ED44\r
+:101190009A95F1F700008111F5CF8091E80085FF65\r
+:1011A0000DC040E050E063E070E0CE0101960E9487\r
+:1011B000DD0A8091E8008E778093E8000F900F9011\r
+:1011C0000F90DF91CF9108952091E9012430F1F43F\r
+:1011D00022E02093E9002FEF3091E800215035FD07\r
+:1011E00006C035ED3A95F1F700002111F5CF2091B9\r
+:1011F000E80025FF0BC040E050E065E070E00E9491\r
+:10120000DD0A8091E8008E778093E8000895CF93FF\r
+:10121000DF93EC019091E901943009F046C0809190\r
+:101220000C018823D9F080910D018823B9F09093A7\r
+:10123000E9008FEF9091E800815095FD06C095E19F\r
+:101240009A95F1F700008111F5CF8091E80085FFB4\r
+:101250002CC040E050E060E170E017C081E0809376\r
+:10126000E9008FEF9091E800815095FD06C095ED63\r
+:101270009A95F1F700008111F5CF8091E80085FF84\r
+:1012800014C040E050E068E070E0CE010E94DD0A4A\r
+:101290008091E8008E778093E80080E1FE01A3E56D\r
+:1012A000B1E001900D928A95E1F7DF91CF91089519\r
+:1012B0008091E801811109C00E94720C0E94CF0C3C\r
+:1012C0008091E20084608093E20008951092E8012A\r
+:1012D0000895089508950C940E1C42E061EC81E09D\r
+:1012E0000E94EC0B42E061EC82E00E94EC0B42E0D9\r
+:1012F00061EC83E00E94EC0B42E161EC84E00C9431\r
+:10130000EC0B8091EB01833009F455C030F481304F\r
+:1013100071F0823009F48EC008958A3009F47AC0E1\r
+:101320008B3009F460C0893009F09CC020C08091E6\r
+:10133000EA01813A09F096C08091E800877F8093A6\r
+:10134000E8008091EE019091EF01892B21F460E19A\r
+:1013500083E591E003C060E080E090E070E00E94EF\r
+:10136000280B8091E8008B778093E80008958091A6\r
+:10137000EA01813209F076C08091EE019091EF018F\r
+:10138000009719F0039709F06DC08091E800877FFE\r
+:101390008093E8008091E80082FD05C08091E9011A\r
+:1013A0008111F8CF5FC08091F1008093630180913B\r
+:1013B000E8008B7753C08091EA01813A09F052C06E\r
+:1013C0008091EE019091EF01892B09F04BC0809143\r
+:1013D000E800877F8093E8008091E80080FFFCCFE1\r
+:1013E00080910C0136C08091EA018132D9F580915B\r
+:1013F000EE019091EF01892BA9F58091E800877F9C\r
+:101400008093E8000E94210C8091EC0180930C01F4\r
+:101410000C948B148091EA01813221F58091E800CF\r
+:10142000877F8093E8000E94210C8091ED018093DA\r
+:10143000640108958091EA01813AA1F48091E80065\r
+:10144000877F8093E8008091E80080FFFCCF809147\r
+:1014500064018093F1008091E8008E778093E8002A\r
+:101460000C94210C089584B7877F84BF88E10FB660\r
+:10147000F89480936000109260000FBE90E080E8C6\r
+:101480000FB6F89480936100909361000FBE0E94A4\r
+:10149000C40F0E94720C0E94CF0C8091E200846005\r
+:1014A0008093E20078940E94550F0E94C60F82E05C\r
+:1014B00091E00E94700F8091E901853069F40E94EB\r
+:1014C000CF1B8091E7018823B1F30E94FA1B882388\r
+:1014D00091F30E94C70AEFCF0E94CC0FECCF292FC7\r
+:1014E000332723303105C9F064F42130310581F010\r
+:1014F0002230310509F043C08DE690E02EE633E05E\r
+:1015000042C021323105F1F02232310541F137C0BC\r
+:1015100082E190E02BED33E036C0992781309105D0\r
+:1015200041F08230910541F0892B49F5EAE6F3E07C\r
+:1015300005C0E2E5F3E002C0EAE3F3E0849190E065\r
+:101540009F0121C06430D8F4E62FF0E0EE0FFF1FBA\r
+:10155000EE5DFE4F2081318189E090E014C064305F\r
+:1015600070F470E0FB01EE0FFF1FE65EFE4F20817E\r
+:101570003181FB01EA5EFE4F808190E004C080E093\r
+:1015800090E020E030E0FA0131832083089580E18B\r
+:1015900089BD82E189BD09B400FEFDCF8091D800EC\r
+:1015A0008F7D8093D8008091E00082608093E0007E\r
+:1015B0008091E00081FDFCCF0895CF92DF92EF9201\r
+:1015C000FF920F931F93CF93DF93EC018B016A017E\r
+:1015D0000E94400C811133C0C114D10439F0F601CE\r
+:1015E00080819181081B190BC80FD91FE12CF12CA8\r
+:1015F0000115110519F18091E80085FD16C0809153\r
+:10160000E8008E778093E800C114D10449F0F60118\r
+:1016100080819181E80EF91EF182E08285E00FC0A1\r
+:101620000E94400C882321F30AC089918093F10025\r
+:1016300001501109FFEFEF1AFF0ADACF80E0DF91C6\r
+:10164000CF911F910F91FF90EF90DF90CF90089571\r
+:101650002091F0013091F1012617370748F061150C\r
+:10166000710539F42091E8002E772093E80001C03D\r
+:10167000B90140E061157105A9F12091E90122232A\r
+:1016800009F443C0253009F442C02091E80023FD4D\r
+:1016900040C02091E80022FD32C02091E80020FFE8\r
+:1016A000E9CF4091F3002091F20030E0342BFC01AF\r
+:1016B000CF016115710559F02830310540F4819151\r
+:1016C0008093F100615071092F5F3F4FF1CF41E0EE\r
+:1016D0002830310509F040E02091E8002E77209372\r
+:1016E000E800C8CF4111C9CF0AC08091E901882321\r
+:1016F00061F0853061F08091E80083FD0AC080913F\r
+:10170000E80082FFF2CF80E0089582E0089583E050\r
+:10171000089581E008952091F0013091F10126179C\r
+:10172000370748F06115710539F42091E8002E77EC\r
+:101730002093E80001C0B901FC0120E061157105AA\r
+:1017400091F18091E901882309F440C0853009F4C2\r
+:101750003FC08091E80083FD3DC08091E80082FD9C\r
+:101760002FC08091E80080FFE9CF2091F3008091A5\r
+:10177000F20090E0922B6115710559F088309105C7\r
+:1017800040F424912093F100319661507109019643\r
+:10179000F2CF21E0089709F020E08091E8008E77F1\r
+:1017A0008093E800CBCF2111CCCF0AC08091E90112\r
+:1017B000882361F0853061F08091E80083FD0AC0E4\r
+:1017C0008091E80082FFF2CF80E0089582E00895E2\r
+:1017D00083E0089581E00895982F973058F590930D\r
+:1017E000E900981739F07091EC002091ED005091CC\r
+:1017F000F00003C0242F762F50E021FF19C0309154\r
+:10180000EB003E7F3093EB003091ED003D7F309355\r
+:10181000ED003091EB0031603093EB007093EC0001\r
+:101820002093ED005093F0002091EE0027FF07C0B9\r
+:101830009F5FD3CF8F708093E90081E0089580E0AF\r
+:1018400008958091EA0187FF11C08091E80082FD30\r
+:1018500005C08091E9018111F8CF11C08091E800A5\r
+:101860008B770BC08091E901882349F08091E800D3\r
+:1018700080FFF8CF8091E8008E778093E80008958C\r
+:101880002091E4003091E50095E64091EC00842F32\r
+:10189000817040FF22C08091E80080FD1CC08091D3\r
+:1018A000E901882391F0853091F08091EB0085FD6E\r
+:1018B00010C04091E4005091E5004217530729F30E\r
+:1018C0009A01915011F784E0089582E0089583E031\r
+:1018D000089581E0089580E008954091E80042FF76\r
+:1018E000DECF08950E94E00C0E94E80CE0EEF0E0EC\r
+:1018F000808181608083E8EDF0E080818F77808354\r
+:1019000019BCA7EDB0E08C918E7F8C9380818F7E87\r
+:1019100080831092E80108950F931F93CF93DF9374\r
+:101920000E94E00C0E94E80CC8EDD0E088818F771F\r
+:10193000888388818068888388818F7D888319BCAB\r
+:101940001092E9011092E5011092E7011092E60170\r
+:1019500000EE10E0F80180818B7F808388818160B8\r
+:10196000888342E060E080E00E94EC0BE1EEF0E072\r
+:1019700080818E7F8083E2EEF0E0808181608083D1\r
+:10198000808188608083F80180818E7F8083888158\r
+:1019900080618883DF91CF911F910F910895E8EDC9\r
+:1019A000F0E080818F7E8083E7EDF0E080818160D0\r
+:1019B000808384E082BF81E08093E8010C948C0CEA\r
+:1019C000E8EDF0E080818E7F80831092E200089540\r
+:1019D0001092DA001092E10008951F920F920FB654\r
+:1019E0000F9211242F933F934F935F936F937F93A5\r
+:1019F0008F939F93AF93BF93EF93FF938091E100F9\r
+:101A000082FF0BC08091E20082FF07C08091E1005D\r
+:101A10008B7F8093E1000E94540F8091DA0080FF59\r
+:101A20001FC08091D80080FF1BC08091DA008E7F9C\r
+:101A30008093DA008091D90080FF0DC080E189BDDC\r
+:101A400082E189BD09B400FEFDCF81E08093E90108\r
+:101A50000E94580905C019BC1092E9010E9466094C\r
+:101A60008091E10080FF19C08091E20080FF15C0E5\r
+:101A70008091E2008E7F8093E2008091E20080619D\r
+:101A80008093E2008091D80080628093D80019BCD6\r
+:101A900085E08093E9010E946A098091E10084FF5A\r
+:101AA00030C08091E20084FF2CC080E189BD82E1DA\r
+:101AB00089BD09B400FEFDCF8091D8008F7D809351\r
+:101AC000D8008091E1008F7E8093E1008091E20058\r
+:101AD0008F7E8093E2008091E20081608093E2003B\r
+:101AE0008091E501882311F084E007C08091E30034\r
+:101AF00087FD02C081E001C083E08093E9010E947C\r
+:101B00006B098091E10083FF29C08091E20083FF8F\r
+:101B100025C08091E100877F8093E10082E080937F\r
+:101B2000E9011092E5018091E1008E7F8093E10050\r
+:101B30008091E2008E7F8093E2008091E2008061DC\r
+:101B40008093E20042E060E080E00E94EC0B809134\r
+:101B5000F00088608093F0000E946909FF91EF9186\r
+:101B6000BF91AF919F918F917F916F915F914F91B5\r
+:101B70003F912F910F900FBE0F901F9018951F92BD\r
+:101B80000F920FB60F9211242F933F934F935F93B1\r
+:101B90006F937F938F939F93AF93BF93CF93DF9375\r
+:101BA000EF93FF93C091E900CF708091EC00D82FA4\r
+:101BB000D17080FDD0E81092E9008091F000877F1D\r
+:101BC0008093F00078940E94030E1092E9008091B7\r
+:101BD000F00088608093F000CD2BCF70C093E900B7\r
+:101BE000FF91EF91DF91CF91BF91AF919F918F9135\r
+:101BF0007F916F915F914F913F912F910F900FBE09\r
+:101C00000F901F9018951F93CF93DF93CDB7DEB73A\r
+:101C1000AA970FB6F894DEBF0FBECDBFEAEEF1E093\r
+:101C200088E08E0F9091F10091938E13FBCF0E946C\r
+:101C300081098091E80083FF1FC18091EA019091A2\r
+:101C4000EB01492F50E04A30510508F015C1FA0167\r
+:101C5000EA5AFF4F0C94F623803881F0823809F05D\r
+:101C60000BC18091EE018F708093E9008091EB00B1\r
+:101C700085FB882780F91092E90006C08091E60173\r
+:101C80009091E701911182609091E800977F909385\r
+:101C9000E8008093F1001092F100C8C0282F2D7F3A\r
+:101CA00009F0EAC0882319F0823061F0E5C0809124\r
+:101CB000EC01813009F0E0C0933009F080E08093BE\r
+:101CC000E7012BC08091EC01811127C08091EE01CA\r
+:101CD0008F7009F4D1C08093E9002091EB0020FFC0\r
+:101CE0001CC0933021F48091EB00806214C090916D\r
+:101CF000EB0090619093EB0021E030E0A90102C07D\r
+:101D0000440F551F8A95E2F74093EA001092EA00CB\r
+:101D10008091EB0088608093EB001092E900809145\r
+:101D2000E800877F86C08111A7C01091EC011F7762\r
+:101D30008091E3008078812B8093E3008091E8001C\r
+:101D4000877F8093E8000E94210C8091E80080FF4B\r
+:101D5000FCCF8091E30080688093E300111102C002\r
+:101D600082E001C083E08093E90186C08058823020\r
+:101D700008F082C08091EC019091ED018C3D53E020\r
+:101D8000950779F583E08A838AE289834FB7F894CF\r
+:101D9000DE01139620E03EE051E2E32FF0E05093A5\r
+:101DA0005700E49120FF03C0E295EF703F5FEF70B2\r
+:101DB0008E2F90E0EA3010F0C79601C0C0968D9348\r
+:101DC0009D932F5F243149F74FBF8091E800877FB3\r
+:101DD0008093E8006AE270E0CE0101960E94280B31\r
+:101DE00014C0AE014F5F5F4F6091EE010E946F0A19\r
+:101DF000BC01892B09F440C09091E800977F909333\r
+:101E0000E80089819A810E948B0B8091E8008B7792\r
+:101E10008093E80031C0803879F58091E800877FB1\r
+:101E20008093E8008091E5018093F1008091E800C3\r
+:101E30008E778093E8000E94210C1EC081111CC087\r
+:101E40009091EC019230C0F48091E800877F8093FC\r
+:101E5000E8009093E5010E94210C8091E501811139\r
+:101E600006C08091E30087FD02C081E001C084E0EC\r
+:101E70008093E9010E946D098091E80083FF0AC008\r
+:101E80008091E800877F8093E8008091EB0080627A\r
+:101E90008093EB00AA960FB6F894DEBF0FBECDBFBD\r
+:101EA000DF91CF911F9108950895CF938091E9011B\r
+:101EB0008823A1F0C091E900CF709091EC00892FA8\r
+:101EC000817090FD80E8C82B1092E9008091E800B5\r
+:101ED00083FD0E94030ECF70C093E900CF91089557\r
+:101EE00090936A01809369010895E0916901F091EE\r
+:101EF0006A01309721F00190F081E02D099480E093\r
+:101F00000895E0916901F0916A01309721F0028013\r
+:101F1000F381E02D09940895E0916901F0916A013F\r
+:101F2000309721F00480F581E02D099408952091E7\r
+:101F30006701309168018217930771F090936801EF\r
+:101F400080936701E0916901F0916A01309721F077\r
+:101F50000680F781E02D0994089520916501309164\r
+:101F600066018217930771F0909366018093650173\r
+:101F7000E0916901F0916A01309721F00084F185C8\r
+:101F8000E02D0994089508950C94C30F0E943D1C00\r
+:101F90000E947E040C94031DCF92DF92EF92FF9279\r
+:101FA0000F931F93CF93DF93CDB7DEB72B970FB669\r
+:101FB000F894DEBF0FBECDBF0E9496048CE6C82EFB\r
+:101FC00081E0D82E00E010E0E02E802F0E948405F2\r
+:101FD000F60141916F01F42EF826B1F40F5F1F4F07\r
+:101FE0000E30110589F78FEF89838A831B820E9447\r
+:101FF000461C8160782F9D838C8349815A816B8137\r
+:102000008D810E946F1040C09091D40191FF04C057\r
+:102010008B870E948A058B8520E030E04F2D50E0B1\r
+:10202000922FBA01022E02C0759567950A94E2F7C5\r
+:1020300060FF24C02E83EF8221E030E0690102C0FE\r
+:10204000CC0CDD1C9A95E2F790E08C219D21892B28\r
+:1020500009F420E028870E94461C8160782F9A8727\r
+:1020600089874E815F8168858A850E946F10F8019B\r
+:10207000E459FE4F8081C826C08206C02F5F3F4FC3\r
+:102080002630310569F6AACF0E94EA1F10916B0134\r
+:102090000E94750F1817A1F00E94750F80936B01B5\r
+:1020A0002B960FB6F894DEBF0FBECDBFDF91CF9158\r
+:1020B0001F910F91FF90EF90DF90CF900C947708D5\r
+:1020C0002B960FB6F894DEBF0FBECDBFDF91CF9138\r
+:1020D0001F910F91FF90EF90DF90CF900895CF93D5\r
+:1020E000DF93CDB7DEB72B970FB6F894DEBF0FBEE8\r
+:1020F000CDBF4F83588769877A878B87DE0111961A\r
+:1021000086E0FD0111928A95E9F785E0FE01379698\r
+:1021100001900D928A95E1F749815A816B817C810A\r
+:102120008D819E810E9429172B960FB6F894DEBFF1\r
+:102130000FBECDBFDF91CF9108950895CF9388232F\r
+:1021400009F4C2C0C82F823859F40E94750F81FD6E\r
+:10215000BBC089E30E946C1A0E94491B89E30CC032\r
+:10216000833879F40E94750F80FDAEC083E50E942C\r
+:102170006C1A0E94491B83E50E94AE1ACF910C9401\r
+:10218000491B843859F40E94750F82FD9DC087E475\r
+:102190000E946C1A0E94491B87E4EECF8CEF8C0FD3\r
+:1021A000813A48F48C2F0E94252281118DC08C2FFA\r
+:1021B0000E946C1AE3CF80E28C0F883048F4C7701D\r
+:1021C00081E001C0880FCA95EAF70E94F51AD6CFC0\r
+:1021D0008BE58C0F833078F4C53A29F0C63A31F09C\r
+:1021E00083E890E005C081E890E002C082E890E0DA\r
+:1021F000CF910C94970F88E58C0F833108F064C061\r
+:10220000C83A39F1C93A41F1CA3A49F1CB3A51F1E8\r
+:10221000CC3A59F1CD3A61F1C03B69F1CE3A71F156\r
+:10222000CF3A79F1C13B81F1C23B89F1C33B91F1D6\r
+:10223000C43B99F1C53BA1F1C63BA9F1C73BB1F144\r
+:10224000C83BB9F1C93BC1F1CA3BC9F180E090E09C\r
+:1022500038C082EE90E035C089EE90E032C08AEE60\r
+:1022600090E02FC085EB90E02CC086EB90E029C079\r
+:1022700087EB90E026C08CEC90E023C08DEC90E0E2\r
+:1022800020C083E891E01DC08AE891E01AC082E98D\r
+:1022900091E017C084E991E014C081E292E011C09E\r
+:1022A00083E292E00EC084E292E00BC085E292E00D\r
+:1022B00008C086E292E005C087E292E002C08AE2AE\r
+:1022C00092E0CF910C94AD0FCF910895882309F43B\r
+:1022D0004BC0823859F40E94750F81FF45C089E3D5\r
+:1022E0000E946C1A0E94491B89E30CC0833871F468\r
+:1022F0000E94750F80FF38C083E50E946C1A0E940F\r
+:10230000491B83E50E94AE1A0C94491B843859F48A\r
+:102310000E94750F82FF28C087E40E946C1A0E94F9\r
+:10232000491B87E4EFCF9CEF980F913A58F390E266\r
+:10233000980F983050F4877091E001C0990F8A95FA\r
+:10234000EAF7892F0E94FB1ADFCF9BE5980F9330A5\r
+:1023500020F480E090E00C94970F885A833120F4A9\r
+:1023600080E090E00C94AD0F0895882321F00E9446\r
+:10237000F51A0C94491B0895882321F00E94FB1A3A\r
+:102380000C94491B08952F923F924F925F927F9237\r
+:102390008F929F92AF92BF92CF92DF92EF92FF9275\r
+:1023A0000F931F93CF93DF9300D000D01F92CDB730\r
+:1023B000DEB725E0FC01DE01119601900D922A9511\r
+:1023C000E1F7FC0100811181F280E580E2943FE0B9\r
+:1023D000E32223813481232B09F472C21F3F19F4B5\r
+:1023E0000F3F09F46DC26C010E94081A882319F08E\r
+:1023F00082E00E944A1AC6010E949D1009831A8336\r
+:1024000069817A818F2D0E94CE198C010E948319D7\r
+:102410000E944A18F1100E94121B0E94651A88231C\r
+:1024200079F0FF2069F080E2800F883048F082E088\r
+:102430000E944A1A0E94651A91E0782E792601C0FE\r
+:10244000712CE12FE295EF70F0E0E05AFF4F0C9411\r
+:10245000F623812F807F1F70882311F01295107F43\r
+:10246000FF2089F0112309F4E8C180E2800F883051\r
+:1024700020F4812F0E94F51A03C0812F0E94051BB2\r
+:102480000E94491BDAC1802F0E946611112309F4B2\r
+:10249000EEC1005E812F083018F40E94FB1A02C0C2\r
+:1024A0000E940B1B0E94491BE2C1812F807F1F707D\r
+:1024B000803211F01295107F002319F0013049F19C\r
+:1024C00032C0FF2091F0EE2091F1F1E0EF1204C054\r
+:1024D000812F0E94251BCBC122E0E21228C00E945E\r
+:1024E0002E1B812F0E94D51922C0EE2079F031E0F9\r
+:1024F000E31208C00E94F21A812309F4B8C10E94B5\r
+:10250000D81904C042E0E41609F4B1C10E942E1BA0\r
+:1025100012C0FF2029F051E05E1508F4A8C107C0E1\r
+:10252000E110A5C108C0FF2021F0E11086C1812F74\r
+:10253000F7C0E11089C1812FF9C0812F869586955A\r
+:10254000837090E0009719F0019759F090C1FF2037\r
+:1025500019F0C801937002C080E090E00E94970FCC\r
+:1025600086C1FF2019F0C801937002C080E090E09E\r
+:102570000E94AD0F7CC1802FFF2019F00E94F21E37\r
+:1025800002C00E945A1F0E94DF1F71C1812F8370F9\r
+:1025900009F055C0F1106BC1802F82958695877028\r
+:1025A000880F880F902F9F70492F50E060E070E0F7\r
+:1025B0001A012B01082E04C0220C331C441C551C8C\r
+:1025C0000A94D2F704FF15C02FE0822E912CA12C83\r
+:1025D000B12CA501940104C0220F331F441F551FC5\r
+:1025E0008A95D2F7CA01B90160957095809590954A\r
+:1025F00003C060E070E0CB01169516951370412F73\r
+:1026000050E04230510569F04330510589F06229AC\r
+:102610007329842995294130510571F00E94711860\r
+:1026200026C162297329842995290E948D181FC10A\r
+:102630000E947118C201B1010E94551818C1FF20F3\r
+:1026400019F0812F817001C08695882309F40FC18C\r
+:10265000802F829586958770880F880F902F9F70A6\r
+:10266000492F50E060E070E01A012B01082E04C0F1\r
+:10267000220C331C441C551C0A94D2F704FF15C0CD\r
+:102680009FE0892E912CA12CB12CA501940104C0AE\r
+:10269000220F331F441F551F8A95D2F7CA01B90173\r
+:1026A000609570958095909503C060E070E0CB01D7\r
+:1026B000169516951370412F50E04230510569F080\r
+:1026C0004330510589F062297329842995294130C5\r
+:1026D000510571F00E944B19CAC0622973298429DF\r
+:1026E00095290E946719C3C00E944B19C201B1010C\r
+:1026F0000E942F19BCC0802F90E0FC01E05EF10920\r
+:10270000E531F10508F094C0E059FF4F0C94F62331\r
+:102710000F70812F8F71FF2031F00E94C818802F19\r
+:102720000E94B511A4C00E94E918802F0E94BC111C\r
+:102730009EC0FF2039F0E1109AC0812F8F710E9456\r
+:102740000E1995C031E03E1508F491C0F6CFFF2078\r
+:1027500039F0812F8F710E94C81889C0FF20C9F3FA\r
+:10276000812F8F710E94E91882C0FF2029F0812FEC\r
+:102770008F710E94B3187BC00E94A91878C0FF20F7\r
+:10278000C1F00E94D2190E94FB1A0E94041A8430E0\r
+:1027900029F40E94431A812F8F717AC041E04E15AF\r
+:1027A00008F48EC01F71812F0E94C81863E0812F2A\r
+:1027B0000EC00E94D2190E94F51A51E05E15F8F47D\r
+:1027C0000E94431A0E94D81964E0812F8F710F90E4\r
+:1027D0000F900F900F900F90DF91CF911F910F915D\r
+:1027E000FF90EF90DF90CF90BF90AF909F908F9031\r
+:1027F0007F905F904F903F902F900C94331A81E020\r
+:102800000F900F900F900F900F90DF91CF911F912D\r
+:102810000F91FF90EF90DF90CF90BF90AF909F907F\r
+:102820008F907F905F904F903F902F900C944A1A1A\r
+:10283000FF2039F0EE2009F48CCF802F0E949E10EB\r
+:1028400016C0EE2009F48CCF802F0E9466110FC0B5\r
+:10285000412F4F70602FC6010E94BA020E94CD170F\r
+:1028600006C0412F4F70602FC6010E948B05772054\r
+:1028700039F10E94041A80FD23C0F60112820E94E1\r
+:10288000FE190E94C818C6010E94C3110E94FE19B9\r
+:102890000F900F900F900F900F90DF91CF911F919D\r
+:1028A0000F91FF90EF90DF90CF90BF90AF909F90EF\r
+:1028B0008F907F905F904F903F902F900C94E918ED\r
+:1028C0000F900F900F900F900F90DF91CF911F916D\r
+:1028D0000F91FF90EF90DF90CF90BF90AF909F90BF\r
+:1028E0008F907F905F904F903F902F9008950E941F\r
+:1028F000121B0E94221B0E94E41A0E94491B0E9484\r
+:1029000090200E94DF1F80E090E00E94970F80E0FF\r
+:1029100090E00C94AD0F0E94021B0C9477140E945F\r
+:10292000C319292F22952F7030E02C3031054CF43B\r
+:102930002A3031056CF42250310922303105A8F4D7\r
+:1029400007C02C30310569F02F30310551F00DC032\r
+:10295000803F69F018F4803E40F409C0843F29F4B8\r
+:1029600006C093FB882780F9089580E0089581E0F0\r
+:102970000895CF93DF9300D000D01F92CDB7DEB77C\r
+:102980000F900F900F900F900F90DF91CF910895BF\r
+:10299000CF93DF9300D000D000D0CDB7DEB726961E\r
+:1029A0000FB6F894DEBF0FBECDBFDF91CF91089573\r
+:1029B0001F93CF93DF93C0917A0116E080917B0142\r
+:1029C000C81799F0D0E01C9FF0011D9FF00D112455\r
+:1029D000E458FE4F408151816281738184819581E9\r
+:1029E0000E94C8142196C770E9CFDF91CF911F9143\r
+:1029F00008954091AC015091AD016091AE0170918C\r
+:102A0000AF018091B0019091B1010C94C8148091F4\r
+:102A1000B10182958F7009F054C08091AE01882376\r
+:102A200009F44FC080917A01A0917B016091AC01C3\r
+:102A30007091AD014091AF015091B001B6E08A179D\r
+:102A400009F43FC090E041155105C1F17F3F11F4F9\r
+:102A50006F3FA1F1B89FF001B99FF00D1124E45828\r
+:102A6000FE4F218172132AC02081621327C0228168\r
+:102A7000211124C0238134812417350710F42150FB\r
+:102A80003109241B350B283C3105C0F42091B101DC\r
+:102A90002F7020612093B10126E0289FF001299F2B\r
+:102AA000F00D1124EF57FE4F80818F70806180837D\r
+:102AB0008CEA91E00E94C3110C94D814019687709F\r
+:102AC000BECF0895CF92DF92EF92FF920F931F93A4\r
+:102AD000CF93DF93CDB7DEB762970FB6F894DEBF22\r
+:102AE0000FBECDBF8C0185E0F801DE011D9601907F\r
+:102AF0000D928A95E1F7D8014C9111965C9111974E\r
+:102B000012966C9112971396CD90DC901497309199\r
+:102B1000AC017091AD018091AF019091B00100972F\r
+:102B200009F46BC17F3F19F43F3F09F466C1E0909F\r
+:102B3000AE01EE2009F4C0C02091B101C816D9063B\r
+:102B400028F0F601E81BF90BCF0104C080959095A1\r
+:102B50008C0D9D1DFF24F394883C910578F0F12C99\r
+:102B6000207F09F0C6C07C2DD98AC88A89890E9435\r
+:102B7000B9148CEA91E00E94C311B1C0822F807F0A\r
+:102B800009F046C0751314C0341312C0611110C08F\r
+:102B90002F7020612093B1010E94F9148CEA91E01A\r
+:102BA0000E94C3118091B101D80115968C932EC05B\r
+:102BB000CD2819F15F3F11F44F3FF9F0F62E611166\r
+:102BC0001CC080917A0120917B0136E0821709F4C4\r
+:102BD0005AC090E0389FF001399FF00D1124E4585D\r
+:102BE000FE4F7181571306C07081471303C0728175\r
+:102BF000711103C001968770E9CFF62E662309F4A0\r
+:102C000018C18091B10181608093B101F12C11C193\r
+:102C1000751308C0341306C0611104C08091B1015E\r
+:102C2000D801C3C04D875E878D859E856A8B0E94C3\r
+:102C30008F146A898823E1F16623D1F12091B101D3\r
+:102C4000822F82958F7090E0029774F08091AC0192\r
+:102C50009091AD0198878F831986DB86CA862C8771\r
+:102C6000CE0107960E94C31186E0F801ACEAB1E0FC\r
+:102C700001900D928A95E1F70E9407150E94F914C0\r
+:102C8000FF24F394D6C04D875E878D859E850E9474\r
+:102C9000C319292F22952F7030E0223031050CF016\r
+:102CA000BCC09F7009F0B6C0805E883008F4C1C017\r
+:102CB000C8010E94C311E4CFC816D90608F453C056\r
+:102CC000F601E81BF90BCF01883C910508F450C0D0\r
+:102CD000F12C7C2DD98AC88A89890E94B914ECEA22\r
+:102CE000F1E086E0DF011D928A95E9F70E94F91470\r
+:102CF000A0C0751314C0341312C0611110C08091AC\r
+:102D0000B101F8018583C8010E94C31186E0ECEA95\r
+:102D1000F1E0DF011D928A95E9F7FE2C8AC04D870C\r
+:102D20005E878D859E856A8B0E948F146A898823B1\r
+:102D300009F4BECF662309F4BBCF2091B101822FE5\r
+:102D400082958F7090E002970CF48ECF8091AC0149\r
+:102D50009091AD019A8389831B82DD82CC822E8380\r
+:102D6000CE0101967FCF809590958C0D9D1DACCFA7\r
+:102D7000F62E662309F49CCF75132EC034132CC095\r
+:102D80002091B10120FD1FC0822F82958F70D9F054\r
+:102D9000D80115962C9315978F3049F08F5F982F97\r
+:102DA0009295907F822F8F70892B15968C93C801F6\r
+:102DB0000E94C31186E0F801ACEAB1E001900D92E7\r
+:102DC0008A95E1F793CF86E0F801ACEAB1E0019093\r
+:102DD0000D928A95E1F72DC04D875E878D859E8582\r
+:102DE0000E948F14811140CF8091B1018160809346\r
+:102DF000B101C8010E94C3111CC0662309F458CF59\r
+:102E00004D875E878D859E850E948F14882309F4E7\r
+:102E10004FCF2ACF811148CF0CC0243031050CF0A0\r
+:102E200047CF9F7009F440CFF8019581907F09F05A\r
+:102E30003BCF8F2D62960FB6F894DEBF0FBECDBF8D\r
+:102E4000DF91CF911F910F91FF90EF90DF90CF9086\r
+:102E500008951F93CF93DF93CDB7DEB72C970FB6AE\r
+:102E6000F894DEBF0FBECDBF4F83588769877A873E\r
+:102E70008B879C87CE0107960E946215882369F094\r
+:102E80008F8198852A853B85232BF1F19F3F09F09F\r
+:102E900063C08F3F09F060C037C086E0FE013796FF\r
+:102EA000DE01119601900D928A95E1F76F81788588\r
+:102EB000EA85FB85309741F17F3F11F46F3F21F1A7\r
+:102EC00020917B0130E0C9010196877099274091DC\r
+:102ED0007A0150E08417950709F447C069837A8323\r
+:102EE000FD83EC8396E0929FD001939FB00D112457\r
+:102EF000A458BE4FFE01319601900D929A95E1F7CC\r
+:102F000080937B010E94D81416E080917A01909101\r
+:102F10007B018917C1F1189FC001112484589E4F6D\r
+:102F20000E946215882379F1E0917A011E9FF001D9\r
+:102F30001124E458FE4F4081518162817381848164\r
+:102F400095810E94C81480917A0190E00196877063\r
+:102F5000992780937A01D9CF4F81588569857A85E1\r
+:102F60008B859C850E94C814CFCF0E948B14109231\r
+:102F70007B0110927A01ECEAF1E086E0DF011D921C\r
+:102F80008A95E9F7C1CF2C960FB6F894DEBF0FBE35\r
+:102F9000CDBFDF91CF911F910895EF92FF920F93D4\r
+:102FA0001F93CF93DF938C01892B09F46CC0F12C14\r
+:102FB000EE24E394E8012196F8018491843740F4EB\r
+:102FC000843008F051C0813081F0823019F15BC04B\r
+:102FD000853709F444C0A8F19CE7980F903708F0B2\r
+:102FE00052C08F770E94661141C00E5F1F4FFE01D5\r
+:102FF000C49180E28C0F883048F4C7708E2D01C0D8\r
+:10300000880FCA95EAF70E94151B14C08C2F0E94E6\r
+:103010009E102DC00E5F1F4FFE01C49180E28C0FE9\r
+:10302000883058F4C7708E2D01C0880FCA95EAF712\r
+:103030000E941B1B0E94491B1AC08C2F0E94661104\r
+:1030400016C00E5F1F4FFE01C491CC2381F08FE9A3\r
+:103050009FE00197F1F700C00000C150F6CF0E5F6E\r
+:103060001F4FFE01F49003C00E949E108E018F2D11\r
+:10307000882309F49FCFEFE9FFE03197F1F700C013\r
+:1030800000008150F5CFDF91CF911F910F91FF90FC\r
+:10309000EF90089508956093B6017093B7018093FF\r
+:1030A000B8019093B9010C9477140F931F9300917A\r
+:1030B000B6011091B7012091B8013091B901DC013E\r
+:1030C000CB01802B912BA22BB32B8093B601909335\r
+:1030D000B701A093B801B093B9011F910F910C945F\r
+:1030E00077140F931F930091B6011091B7012091AF\r
+:1030F000B8013091B901DC01CB0180239123A223D7\r
+:10310000B3238093B6019093B701A093B801B09315\r
+:10311000B9011F910F910C9477140F931F93009195\r
+:10312000B6011091B7012091B8013091B901DC01CD\r
+:10313000CB0180279127A227B3278093B6019093D4\r
+:10314000B701A093B801B093B9011F910F910C94EE\r
+:1031500077141092B2011092B3011092B401109240\r
+:10316000B5010C94771441E050E060E070E004C0D9\r
+:10317000440F551F661F771F8A95D2F74093B201FF\r
+:103180005093B3016093B4017093B5010C9477141C\r
+:1031900041E050E060E070E004C0440F551F661F3E\r
+:1031A000771F8A95D2F78091B2019091B301A091D7\r
+:1031B000B401B091B501482B592B6A2B7B2B40935E\r
+:1031C000B2015093B3016093B4017093B5010C94B4\r
+:1031D000771441E050E060E070E004C0440F551FF8\r
+:1031E000661F771F8A95D2F7409550956095709528\r
+:1031F0008091B2019091B301A091B401B091B50159\r
+:10320000482359236A237B234093B2015093B3018F\r
+:103210006093B4017093B5010C94771441E050E0D1\r
+:1032200060E070E004C0440F551F661F771F8A9549\r
+:10323000D2F78091B2019091B301A091B401B09105\r
+:10324000B501482759276A277B274093B20150933D\r
+:10325000B3016093B4017093B5010C9477140F938C\r
+:103260001F930091B2011091B3012091B4013091EC\r
+:10327000B501DC01CB01802B912BA22BB32B8093CA\r
+:10328000B2019093B301A093B401B093B5011F9123\r
+:103290000F910C9477140F931F930091B20110912A\r
+:1032A000B3012091B4013091B501DC01CB01802341\r
+:1032B0009123A223B3238093B2019093B301A093EF\r
+:1032C000B401B093B5011F910F910C9477140F9333\r
+:1032D0001F930091B2011091B3012091B40130917C\r
+:1032E000B501DC01CB0180279127A227B32780936A\r
+:1032F000B2019093B301A093B401B093B5011F91B3\r
+:103300000F910C9477140895CF92DF92EF92FF9271\r
+:103310000F931F93CF93DF938C01C090B601D09091\r
+:10332000B701E090B801F090B9018091B20190919D\r
+:10333000B301A091B401B091B501C82AD92AEA2AF3\r
+:10334000FB2ACFE1D0E0D701C6010C2E04C0B69510\r
+:10335000A795979587950A94D2F780FF06C0B80184\r
+:103360008C2F0E94DC07019721F4219760F780E001\r
+:1033700001C08C2FDF91CF911F910F91FF90EF90A3\r
+:10338000DF90CF900895CF93DF93EC010E948419D2\r
+:10339000BE010E94DC07DF91CF910895CB010E940E\r
+:1033A000C31908958091BF0108958093BF010895C6\r
+:1033B0001092BF0108950E94461C2091BD013091DA\r
+:1033C000BE018217930750F00E94461C2091BD0158\r
+:1033D0003091BE01821B930B9C010AC00E94461CC7\r
+:1033E0002091BD013091BE0120953095280F391FE5\r
+:1033F00081E0283B3B4008F480E008958091BC01C7\r
+:1034000085958595859508958091BC01877008956F\r
+:103410000E94461C2091BA013091BB01821793078C\r
+:10342000A8F00E94461C2091BA013091BB01821B7A\r
+:10343000930B883B9B4010F480E013C08091BC014B\r
+:1034400082FB882780F991E089270BC00E94461CE7\r
+:103450002091BA013091BB0120953095820F931FC6\r
+:10346000E8CF8170089598E0899F90011124262B60\r
+:103470002093BC010E94C8180E94461C9093BB0177\r
+:103480008093BA0108951092BC011092BB01109272\r
+:10349000BA0108952091BC01809582238093BC01DC\r
+:1034A000982F977089F430E0482F552747FD5095A5\r
+:1034B0002417350749F08595859585950E94E9186B\r
+:1034C0001092BB011092BA0108959091BC019770BF\r
+:1034D00081E009F480E0089590910C01992321F096\r
+:1034E00090910D01911109C020910E0130910F01B1\r
+:1034F000F90132969FEF40E01FC0982F9695969560\r
+:1035000096959F3050F5E0910E01F0910F01E90F73\r
+:10351000F11D877021E030E0A90102C0440F551F62\r
+:103520008A95E2F7CA019181892B818308959F3F93\r
+:1035300039F04F5F4E3041F051915813F8CF0DC024\r
+:103540005111F7CF942FF5CF9F3F39F0F901E90FD3\r
+:10355000F11D97FDFA9582830895089590910C01CD\r
+:10356000992321F090910D01911109C020910E0134\r
+:1035700030910F01F9013296205F3F4F1FC0982F05\r
+:103580009695969596959F30F0F4E0910E01F09106\r
+:103590000F01E90FF11D877021E030E0A90102C0A1\r
+:1035A000440F551F8A95E2F7CA01809591818923BE\r
+:1035B000818308953196E217F30729F090819813DB\r
+:1035C000F9CF1082F7CF089581E090E0E0910E01ED\r
+:1035D000F0910F01E80FF91F1082019680319105DB\r
+:1035E000A9F708958091D30108959091D301892B73\r
+:1035F0008093D301089580959091D301892380937E\r
+:10360000D30108951092D30108959091D201892B8E\r
+:103610008093D201089580959091D201892380935F\r
+:10362000D20108951092D20108959091D101892B71\r
+:103630008093D101089580959091D1018923809341\r
+:10364000D10108951092D10108958093C0010E9484\r
+:10365000461C9093BE018093BD0108951092C00155\r
+:103660001092BE011092BD0108958091C00108958D\r
+:1036700080910E0190910F01FC0131969C01205F19\r
+:103680003F4F80E0919191118F5FE217F307D1F7DF\r
+:103690000895E0910E01F0910F018091D301808394\r
+:1036A000E0910E01F0910F0190818091D201892B60\r
+:1036B0008083E0910E01F0910F0190818091D10102\r
+:1036C000892B80838091C001882399F00E94DB19A7\r
+:1036D00081110E942E1BE0910E01F0910F0190814B\r
+:1036E0008091C001892B80830E94381B81110E9428\r
+:1036F0002E1B80910E0190910F010C94810FCF929F\r
+:10370000DF92EF92FF926C01EE24FF24C114D104EA\r
+:10371000E104F10421F0C701B60120E101C020E07D\r
+:10372000C72ED82EE92EFF24C114D104E104F104E0\r
+:1037300019F0285FC701B6016B017C0154E0F694D3\r
+:10374000E794D794C7945A95D1F7C114D104E104F2\r
+:10375000F10419F02C5FC701B6016B017C0142E056\r
+:10376000F694E794D794C7944A95D1F7C114D1043D\r
+:10377000E104F10419F02E5FC701B601DC01CB01B1\r
+:10378000B695A79597958795892B8A2B8B2B09F052\r
+:103790002F5F822FFF90EF90DF90CF900895809160\r
+:1037A000E901843021F11092D50120E488E190E014\r
+:1037B0000FB6F894A895809360000FBE2093600028\r
+:1037C00080E00E94770883B7817F846083BF83B7DE\r
+:1037D000816083BF7894889583B78E7F83BF88E1AB\r
+:1037E0000FB6F89480936000109260000FBE0895A9\r
+:1037F00008950895CF930E94F81B0E9496040E949A\r
+:10380000F91BC0E08C2F0E948405811104C0CF5F9A\r
+:10381000CE30C1F701C081E0CF9108950E948B1492\r
+:103820000E94750F0C9477081F920F920FB60F929B\r
+:1038300011248F939F93AF93BF938091D5018111F2\r
+:1038400013C08091D6019091D701A091D801B09179\r
+:10385000D9014196A11DB11D8093D6019093D70146\r
+:10386000A093D801B093D901BF91AF919F918F914F\r
+:103870000F900FBE0F901F90189582E084BD93E0CB\r
+:1038800095BD9AEF97BD80936E0008952FB7F89479\r
+:103890008091D6019091D701A091D801B091D90122\r
+:1038A0002FBF0895CF92DF92EF92FF920F931F9355\r
+:1038B0002FB7F8944091D6015091D7016091D8016B\r
+:1038C0007091D9012FBF6A017B01EE24FF248C0186\r
+:1038D00020E030E0C016D106E206F30610F44150B5\r
+:1038E00051099A01281B390BC9011F910F91FF90B3\r
+:1038F000EF90DF90CF9008951F920F920FB60F9226\r
+:1039000011248F939F93AF93BF938091D601909191\r
+:10391000D701A091D801B091D9010196A11DB11D87\r
+:103920008093D6019093D701A093D801B093D90189\r
+:10393000BF91AF919F918F910F900FBE0F901F90ED\r
+:1039400018950E94720CF8942FEF87EA91E62150A7\r
+:1039500080409040E1F700C0000087E090EBDC0180\r
+:103960008093F3019093F401A093F501B093F601D5\r
+:103970009CE088E10FB6F894A895809360000FBE94\r
+:1039800090936000FFCFEF92FF920F931F93CF931E\r
+:10399000DF93D82FC0E08C2F0E94840500E010E058\r
+:1039A000E82EF12CC701002E02C0959587950A9448\r
+:1039B000E2F780FD06C00F5F1F4F0630110591F73B\r
+:1039C00009C0602F7C2F80E00E948C05D813F3CFB4\r
+:1039D00081E004C0CF5FCE30F1F680E0DF91CF917F\r
+:1039E0001F910F91FF90EF900895CF93C82F8CE215\r
+:1039F0000E94C31C882321F08C2FCF910C94C31CF0\r
+:103A000080E0CF910895CF930E944A1E811102C099\r
+:103A10000E94301EC5E6C15049F00E9496048FE313\r
+:103A20009CE90197F1F700C00000F5CF89E20E9400\r
+:103A3000F51C811113C18AE20E94F51C81110E94BC\r
+:103A4000301E85E00E94F51C81110E94A11C0E947D\r
+:103A5000551E8093D40187E00E94F51C8823A9F1AC\r
+:103A60008BE10E94F51C882351F08091D40181FBE9\r
+:103A7000222720F991E0922790FB81F90EC08EE079\r
+:103A80000E94F51C882361F08091D40182FB2227DB\r
+:103A900020F991E0922790FB82F98093D40115C020\r
+:103AA00080E10E94F51C9091D401882341F093FBA2\r
+:103AB000222720F981E0822780FB93F904C0892F17\r
+:103AC000809580FB90F99093D4018091D4010E945D\r
+:103AD000591E0E94671E8093F20180EE0E94F51C21\r
+:103AE000882341F08091F201982F909590FB80F906\r
+:103AF0008093F20189E30E94F51C882359F080919C\r
+:103B0000F20181FB222720F991E0922790FB81F9B5\r
+:103B10008093F20182EE0E94F51C882359F0809177\r
+:103B2000F20182FB222720F991E0922790FB82F993\r
+:103B30008093F20186EE0E94F51C882359F0809153\r
+:103B4000F20183FB222720F991E0922790FB83F971\r
+:103B50008093F20183EE0E94F51C882359F0809136\r
+:103B6000F20184FB222720F991E0922790FB84F94F\r
+:103B70008093F20185E30E94F51C882359F080911F\r
+:103B8000F20185FB222720F991E0922790FB85F92D\r
+:103B90008093F20181E30E94F51C882359F0809103\r
+:103BA000F20186FB222720F991E0922790FB86F90B\r
+:103BB0008093F20181E10E94F51C882359F08091E5\r
+:103BC000F20187FB222720F991E0922790FB87F9E9\r
+:103BD0008093F2018091F2010E946B1E8091F201AC\r
+:103BE00087FB882780F980930D0187E20E94F51CEE\r
+:103BF000C82F8EE10E94F51C8111C2608FE10E94E6\r
+:103C0000F51C8111C46080E20E94F51C8111C8601E\r
+:103C100081E20E94F51C8111C06182E20E94F51CC4\r
+:103C20008111C06283E20E94F51C8111C06484E2AC\r
+:103C30000E94F51C882311F0C06802C0CC2329F033\r
+:103C40008C2F0E94621E6C2F03C00E945E1E682F84\r
+:103C500070E080E090E0CF910C944B18CF910895E4\r
+:103C60006DEE7EEF80E090E00E94302460E082E024\r
+:103C700090E00E941E2460E083E090E00E941E24F9\r
+:103C800060E084E090E00E941E2460E085E090E027\r
+:103C90000C941E2480E090E00E94182421E08D3EC8\r
+:103CA0009E4F09F020E0822F089582E090E00C946E\r
+:103CB0001024682F82E090E00C941E2483E090E0B2\r
+:103CC0000C941024682F83E090E00C941E2484E070\r
+:103CD00090E00C941024682F84E090E00C941E2453\r
+:103CE0008091DC0180FF0BC06091130185E0689F2B\r
+:103CF000B001112475956795759567952BC081FF67\r
+:103D000009C06091130185E0689FB0011124759589\r
+:103D1000679520C082FF07C06091130185E0689F0E\r
+:103D2000B001112417C09091DD019923D1F0609169\r
+:103D30001201961788F72091130185E0289F9001C2\r
+:103D40001124929FA001939F500D112470E0CA018D\r
+:103D50000E94E2236038710540F46115710539F065\r
+:103D600002C065E070E0862F08958FE7089581E036\r
+:103D700008958091DC0180FF08C06091110170E01E\r
+:103D8000759567957595679521C081FF06C060910F\r
+:103D9000110170E07595679519C082FF04C06091AC\r
+:103DA000110170E010C09091DD019923C1F0609184\r
+:103DB00010019617A0F780911101899FC00111246D\r
+:103DC00070E00E94E2236038710528F461157105E6\r
+:103DD00021F0862F08958FE7089581E0089561E02E\r
+:103DE00070E0F4CF803F21F40E94701E819504C0E2\r
+:103DF000813F29F40E94701E8093E0010895823F64\r
+:103E000021F40E94701E819504C0833F29F40E9412\r
+:103E1000701E8093DF010895893F19F40E94B91E36\r
+:103E200005C08A3F31F40E94B91E81958093E1015B\r
+:103E300008958B3F21F40E94B91E819504C08C3FE8\r
+:103E400029F40E94B91E8093E2010895843F21F471\r
+:103E50008091DE01816017C0853F21F48091DE01F1\r
+:103E6000826011C0863F21F48091DE0184600BC026\r
+:103E7000873F21F48091DE01886005C0883F31F4DE\r
+:103E80008091DE0180618093DE0108958D3F21F4F1\r
+:103E90008091DC0181600BC08E3F21F48091DC01B8\r
+:103EA000826005C08F3F29F48091DC01846080939B\r
+:103EB000DC010895803F39F48091E00187FF6CC0F8\r
+:103EC0001092E00169C0813F29F48091E001181649\r
+:103ED000BCF362C09091DF01823F29F497FF5CC080\r
+:103EE0001092DF0159C0833F19F41916CCF354C066\r
+:103EF000893F41F48091E10118160CF04DC01092F9\r
+:103F0000E1014AC08A3F29F48091E10187FF44C062\r
+:103F1000F6CF8B3F39F48091E20187FF3DC01092CC\r
+:103F2000E2013AC08C3F29F48091E2011816BCF3FB\r
+:103F300033C0843F21F48091DE018E7F17C0853F1E\r
+:103F400021F48091DE018D7F11C0863F21F48091A4\r
+:103F5000DE018B7F0BC0873F21F48091DE01877FDC\r
+:103F600005C0883F31F48091DE018F7E8093DE01B1\r
+:103F700013C08D3F21F48091DC018E7F0BC08E3FFA\r
+:103F800021F48091DC018D7F05C08F3F29F4809161\r
+:103F9000DC018B7F8093DC018091DF0181110EC0F9\r
+:103FA0008091E00181110AC08091E101811106C078\r
+:103FB0008091E201811102C01092DD0108958EED21\r
+:103FC00091E00E948C0F0E94461C9093DB0180932D\r
+:103FD000DA0108951F93CF93DF938091DA019091D6\r
+:103FE000DB010E94521CAC019091DD01992321F06C\r
+:103FF0002091140130E006C0209115018AE0289F2D\r
+:10400000900111244217530708F486C08091DF0104\r
+:10401000C091E001D091E1011091E201811107C04E\r
+:10402000C11176C0D11174C0111172C075C09F3F0B\r
+:1040300019F09F5F9093DD01181624F40E94701E02\r
+:104040008093DF018091DF0187FF05C00E94701E11\r
+:1040500081958093DF011C1624F40E94701E8093CA\r
+:10406000E0018091E00187FF05C00E94701E8195EC\r
+:104070008093E0016091DF01662339F1C091E00196\r
+:10408000CC2319F1772767FD7095872F972F0E9412\r
+:10409000F32223E333E343E35FE30E9457230E94C9\r
+:1040A000C0226093DF016C2F772767FD7095872F03\r
+:1040B000972F0E94F32223E333E343E35FE30E945D\r
+:1040C00057230E94C0226093E0011D1624F40E9431\r
+:1040D000B91E8093E1018091E10187FF05C00E9434\r
+:1040E000B91E81958093E101111624F40E94B91E36\r
+:1040F0008093E2018091E20187FF05C00E94B91E12\r
+:1041000081958093E201DF91CF911F910C94DF1F85\r
+:104110009F3F09F08ECF96CFDF91CF911F910895E9\r
+:10412000EEEDF1E085E0DF011D928A95E9F710924E\r
+:10413000DD011092DC010895833081F128F4813093\r
+:1041400059F08230D1F00895853009F449C0B8F1B2\r
+:10415000863009F456C0089580911501262F30E06D\r
+:10416000280F311D2F3F310524F4680F609315018E\r
+:1041700008958FEF80931501089580911401262FE3\r
+:1041800030E0280F311D2F3F310524F4680F609374\r
+:10419000140108958FEF8093140108958091130105\r
+:1041A000262F30E0280F311D2F3F310524F4680FF2\r
+:1041B0006093130108958FEF809313010895809108\r
+:1041C0001201262F30E0280F311D2F3F310524F436\r
+:1041D000680F6093120108958FEF80931201089584\r
+:1041E00080911101262F30E0280F311D2F3F31051E\r
+:1041F00024F4680F6093110108958FEF80931101EB\r
+:10420000089580911001262F30E0280F311D2F3F97\r
+:10421000310524F4680F6093100108958FEF8093A7\r
+:1042200010010895833011F128F4813049F0823073\r
+:1042300091F00895853081F120F18630C1F1089523\r
+:1042400080911501681720F4861B8093150108954D\r
+:1042500010921501089580911401681720F4861BAF\r
+:104260008093140108951092140108958091130110\r
+:10427000681720F4861B8093130108951092130190\r
+:10428000089580911201681720F4861B8093120113\r
+:10429000089510921201089580911101681720F479\r
+:1042A000861B809311010895109211010895809149\r
+:1042B0001001681720F4861B809310010895109256\r
+:1042C000100108950F931F938B3109F475C0A0F569\r
+:1042D0008E3009F484C0C0F4873009F45BC068F400\r
+:1042E000863009F0AAC08091D401817F8E7F8093AF\r
+:1042F000D40181E08093E401A1C0883009F496C024\r
+:104300008B3009F493C099C0813109F472C068F40C\r
+:10431000803109F092C08091D40183FB222720F9DB\r
+:1043200091E0922790FB83F950C0863109F47EC05A\r
+:10433000893109F47BC081C0853309F479C068F400\r
+:10434000873209F475C028F48E3108F476C08D5197\r
+:104350005AC0893209F46CC070C0833438F48A338F\r
+:1043600008F050C0883309F461C067C0833409F491\r
+:104370005FC0883409F061C00E948B140FEF13ED09\r
+:1043800020E3015010402040E1F700C000000E94EF\r
+:10439000A11C4CC09091D401892F8095817080FB25\r
+:1043A00090F929F0966098609093D40147C0997F66\r
+:1043B000977F9093D4013AC08091D40181FB22274A\r
+:1043C00020F991E0922790FB81F98093D401992301\r
+:1043D00069F18091D40181608093D40127C08091DC\r
+:1043E000D40182FB222720F991E0922790FB82F9E9\r
+:1043F000ECCF0E948B1490910D0181E0892780936E\r
+:104400000D0114C0895341E050E060E070E08A0182\r
+:104410009B0104C0000F111F221F331F8A95D2F782\r
+:10442000C901B8010E944B180E948B1481E006C09C\r
+:1044300061E070E080E090E0F5CF80E01F910F91A7\r
+:10444000089580E0089580E00895CF93C82F80916B\r
+:10445000E401813079F018F08230E9F187C0E09111\r
+:104460000E01F0910F018081813169F0823209F0F3\r
+:104470007FC009C0E0910E01F0910F018081813170\r
+:1044800011F0823261F48C2F0E942122811104C02C\r
+:104490008C2F0E9462211DC081E090E01AC08C2FF9\r
+:1044A0000E942322811114C0C43179F048F4CB302A\r
+:1044B00079F0C03109F060C082E08093E40108C067\r
+:1044C000C93219F0C83321F057C01092E40154C02A\r
+:1044D00081E0817053C0C93289F118F5C43171F19E\r
+:1044E000A8F4C73009F046C08AE08093150194E132\r
+:1044F0009093140193E0909313018093120188E04C\r
+:104500008093110188E28093100134C0CE51C630EF\r
+:1045100088F5EC2FF0E0E65DFE4F80818093E301AB\r
+:1045200029C0CE34E9F020F4CB3421F56AE013C081\r
+:10453000C13579F0C235F1F461E00DC08091E3013D\r
+:10454000882319F01092E30115C081E08093E40103\r
+:1045500015C061E006C08091E3010E949C200AC062\r
+:104560006AE08091E3010E94122104C01092E401EC\r
+:1045700080E004C081E002C080E0ABCFCF9108951D\r
+:1045800004D06894B1118DC0089570D088F09F5701\r
+:1045900090F0B92F9927B751A0F0D1F0660F771F8F\r
+:1045A000881F991F1AF0BA95C9F712C0B13081F06F\r
+:1045B00077D0B1E0089574C0672F782F8827B85F4F\r
+:1045C00039F0B93FCCF3869577956795B395D9F7D0\r
+:1045D0003EF490958095709561957F4F8F4F9F4FDA\r
+:1045E0000895E89409C097FB3EF4909580957095E6\r
+:1045F00061957F4F8F4F9F4F9923A9F0F92F96E92F\r
+:10460000BB279395F695879577956795B795F111A3\r
+:10461000F8CFFAF4BB0F11F460FF1BC06F5F7F4F40\r
+:104620008F4F9F4F16C0882311F096E911C0772352\r
+:1046300021F09EE8872F762F05C0662371F096E85B\r
+:10464000862F70E060E02AF09A95660F771F881F2A\r
+:10465000DAF7880F9695879597F9089557FD905842\r
+:10466000440F551F59F05F3F71F04795880F97FB36\r
+:10467000991F61F09F3F79F08795089512161306F0\r
+:104680001406551FF2CF4695F1DF08C0161617061F\r
+:104690001806991FF1CF8695710561050894089554\r
+:1046A000E894BB2766277727CB0197F908950BD0AD\r
+:1046B00078C069D028F06ED018F0952309F05AC060\r
+:1046C0005FC01124EECFCADFA0F3959FD1F3950F01\r
+:1046D00050E0551F629FF001729FBB27F00DB11D86\r
+:1046E000639FAA27F00DB11DAA1F649F6627B00D16\r
+:1046F000A11D661F829F2227B00DA11D621F739FFF\r
+:10470000B00DA11D621F839FA00D611D221F749F0C\r
+:104710003327A00D611D231F849F600D211D822F53\r
+:10472000762F6A2F11249F5750408AF0E1F088239A\r
+:104730004AF0EE0FFF1FBB1F661F771F881F9150A7\r
+:104740005040A9F79E3F510570F014C0AACF5F3FBB\r
+:10475000ECF3983EDCF3869577956795B795F795DA\r
+:10476000E7959F5FC1F7FE2B880F911D9695879562\r
+:1047700097F9089597F99F6780E870E060E00895E1\r
+:104780009FEF80EC089500240A9416161706180669\r
+:104790000906089500240A94121613061406050645\r
+:1047A0000895092E0394000C11F4882352F0BB0FD6\r
+:1047B00040F4BF2B11F460FF04C06F5F7F4F8F4F39\r
+:1047C0009F4F089597FB072E16F4009407D077FDAE\r
+:1047D00009D00E94FC2307FC05D03EF490958195FA\r
+:1047E0009F4F0895709561957F4F0895EE0FFF1FBD\r
+:1047F0000590F491E02D0994AA1BBB1B51E107C061\r
+:10480000AA1FBB1FA617B70710F0A61BB70B881F60\r
+:10481000991F5A95A9F780959095BC01CD010895EF\r
+:10482000F999FECF92BD81BDF89A992780B5089578\r
+:10483000A8E1B0E042E050E00C943824262FF9992A\r
+:10484000FECF92BD81BDF89A019700B4021639F0EF\r
+:104850001FBA20BD0FB6F894FA9AF99A0FBE0895C0\r
+:104860000196272F0E941F240C941E24DC01CB01EB\r
+:10487000FC01F999FECF06C0F2BDE1BDF89A319670\r
+:1048800000B40D9241505040B8F70895F894FFCF0E\r
+:10489000200279080709E408B0087C080101C10179\r
+:1048A00028080A03140A3F4D3639A9045C0426047B\r
+:1048B000ED0380039903B203CB0301020304050651\r
+:0448C00007080900DC\r
+:00000001FF\r
diff --git a/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx_base.png b/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx_base.png
new file mode 100644 (file)
index 0000000..f9bc8b4
Binary files /dev/null and b/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx_base.png differ
diff --git a/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx_fn.png b/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx_fn.png
new file mode 100644 (file)
index 0000000..983b723
Binary files /dev/null and b/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx_fn.png differ
diff --git a/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx_keypad.png b/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx_keypad.png
new file mode 100644 (file)
index 0000000..8f04b43
Binary files /dev/null and b/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx_keypad.png differ
index dec9f92f145847c56bf922dc9db2e5c9fb460303..019930f2a2d824d506e2038dd6fd30d30bebfc52 100644 (file)
@@ -49,9 +49,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                           KC_D,   KC_H,   KC_T,   KC_N,   KC_S,    KC_MINS,
              KC_ENT,      KC_B,   KC_M,   KC_W,   KC_V,   KC_Z   , KC_RSFT,
                                   KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC, MO(SYMB),
-             KC_HOME,KC_END,
+             KC_HOME, KC_END,
              KC_RALT,
-             KC_FN1,KC_SPC,KC_RCTL
+             MO(MDIA),KC_SPC,KC_RCTL
     ),
 /* Keymap 1: Symbol Layer
  *
@@ -102,7 +102,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
         KC_NO,  PV_NUM, PV_NUM, PV_NUM,  PV_NUM, PV_NUM,  PV_STAR,
         KC_NO,  PV_LS,  PV_LT,  PV_LP,   PV_LH,  PV_STAR,
         KC_NO,  PV_LS,  PV_LK,  PV_LW,   PV_LR,  PV_STAR, PV_STAR,
-        KC_NO,  KC_NO,  KC_NO,  KC_TRNS, KC_TRNS,
+        KC_TRNS,KC_NO,  KC_NO,  KC_TRNS, KC_TRNS,
                                           KC_NO, KC_NO,
                                                  KC_NO,
                                    PV_A,  PV_O,  KC_NO,
@@ -111,10 +111,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
         PV_STAR,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,
                  PV_STAR,   PV_RF,   PV_RP,   PV_RL,   PV_RT,   PV_RD,
         PV_STAR, PV_STAR,   PV_RR,   PV_RB,   PV_RG,   PV_RS,   PV_RZ,
-                          KC_TRNS, KC_TRNS,   KC_NO,   KC_NO,   KC_NO,
+                          KC_TRNS, KC_TRNS,   KC_NO,   KC_NO, KC_TRNS,
         KC_NO,  KC_NO,
         KC_NO,
-        KC_FN1, PV_E,    PV_U
+        KC_TRNS,PV_E,    PV_U
 ),
 
 /* Keymap 3: Media and mouse keys
@@ -122,19 +122,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * ,--------------------------------------------------.           ,--------------------------------------------------.
  * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
- * |        |      |      | MsUp |      |      |      |           |      |      |      |      |      |      |        |
+ * |        |      |      | MsUp |      |      |      |           |      |      | Back |      | Frwd |      |        |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |      |MsLeft|MsDown|MsRght|      |------|           |------|      |      |      |      |      |  Play  |
+ * |        |      |MsLeft|MsDown|MsRght|      |------|           |------|      | Prev | Play | Next |      |        |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |      |      |      |      |      |      |           |      |      |      | Prev | Next |      |        |
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
  *   |      |      |      | Lclk | Rclk |                                       |VolUp |VolDn | Mute |      |      |
  *   `----------------------------------'                                       `----------------------------------'
  *                                        ,-------------.       ,-------------.
  *                                        |      |      |       |      |      |
  *                                 ,------|------|------|       |------+------+------.
- *                                 |      |      |      |       |      |      |Brwser|
- *                                 |      |      |------|       |------|      |Back  |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |------|       |------|      |      |
  *                                 |      |      |      |       |      |      |      |
  *                                 `--------------------'       `--------------------'
  */
@@ -150,9 +150,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                   KC_TRNS, KC_TRNS, KC_TRNS,
     // right hand
        KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS,  KC_TRNS, KC_WBAK, KC_TRNS, KC_WFWD, KC_TRNS, KC_TRNS,
+                 KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, 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_MPLY,
-       KC_TRNS,  KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
                           KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
        KC_TRNS, KC_TRNS,
        KC_TRNS,
@@ -171,15 +171,19 @@ void toggle_steno(int pressed)
   if (pressed) {
     if (layer != STEN) layer_on(STEN); else layer_off(STEN);
 
-    register_code(PV_LS);
+    register_code(PV_LP);
     register_code(PV_LH);
-    register_code(PV_RF);
-    register_code(PV_RT);
+    register_code(PV_LR);
+    register_code(PV_O);
+    register_code(PV_RL);
+    register_code(PV_RG);
   } else {
-    unregister_code(PV_LS);
+    unregister_code(PV_LP);
     unregister_code(PV_LH);
-    unregister_code(PV_RF);
-    unregister_code(PV_RT);
+    unregister_code(PV_LR);
+    unregister_code(PV_O);
+    unregister_code(PV_RL);
+    unregister_code(PV_RG);
   }
 }
 
index d44c0a2382257ed54ff12d2e9287ac0992790dc8..979e4261e580620a942d7b8a045012ab4385da84 100644 (file)
@@ -3,8 +3,8 @@
 - Layer 0: Non-ANSI Dvorak layout, with modified modifiers — all
   modifiers on thumb keys, as well as return and space.
 - Layer 1: Default symbol layout.
-- Layer 2: Default media/mouse layout.
-- Layer 3: Plover-oriented stenography layer.
+- Layer 2: Plover-oriented stenography layer.
+- Layer 3: Extended media/mouse layout.
 
 ## Unusual features
 The Plover key (top right key on the left half) also sends my Plover
@@ -12,8 +12,6 @@ The Plover key (top right key on the left half) also sends my Plover
 layer, so you can toggle between steno and typing modes with a single
 keypress.
 
-If you want to use this feature, you'll need to add:
-
-    "SH-FT": "{PLOVER:TOGGLE}"
-
-to your Plover dictionary.
+If you want to use this feature, you'll need to add the
+`commands.json` dictionary to your Plover dictionaries, or define the
+toggle stroke (`PHROLG`) yourself.
index d019b731f21c0ae168b9ec276ebb070672efad5f..e9963886be3100800a77d150cdfaf3db0153ad74 100644 (file)
@@ -55,11 +55,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * ,--------------------------------------------------.           ,--------------------------------------------------.
  * |        |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
- * |        |   !  |   @  |   {  |   }  |   |  |      |           |      |   /  |   7  |   8  |   9  |   *  |   F12  |
+ * |        |   [  |   ]  |   {  |   }  |      |      |           |      |   /  |   7  |   8  |   9  |   *  |   F12  |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |   #  |   $  |   (  |   )  |   `  |------|           |------|   -  |   4  |   5  |   6  |   +  |        |
+ * |        |   <  |   >  |   (  |   )  |      |------|           |------|   -  |   4  |   5  |   6  |   +  |        |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |   %  |   ^  |   [  |   ]  |   ~  |      |           |      |   &  |   1  |   2  |   3  |   =  |        |
+ * |        |      |      |      |      |      |      |           |      |   &  |   1  |   2  |   3  |   =  |        |
  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
  *   |      |      |      |      |      |                                       |   0  |   .  |   ←  |   →  |      |
  *   `----------------------------------'                                       `----------------------------------'
@@ -75,9 +75,9 @@ 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,KC_EXLM,KC_AT,  KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
-       KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
-       KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
+       KC_TRNS,KC_LBRC,KC_RBRC,KC_LCBR,KC_RCBR,KC_TRNS,KC_TRNS,
+       KC_TRNS,KC_LABK,KC_RABK,KC_LPRN,KC_RPRN,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,
@@ -109,8 +109,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  *                                        |      |      |       |      |      |
  *                                 ,------|------|------|       |------+------+------.
  *                                 |      |      |      |       |      |      |      |
- *                                 |      |      |------|       |------|      |      |
- *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |------|       |------|  ⌘C  |  ⌘V  |
+ *                                 |      |      |      |       |  ⌘X  |      |      |
  *                                 `--------------------'       `--------------------'
  */
 // MEDIA AND MOUSE
@@ -129,9 +129,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                     LGUI(KC_LBRC),  KC_LEFT,            KC_DOWN,        KC_RGHT,                KC_TRNS,        KC_MPLY,
        KC_TRNS,     LSFT(KC_SPC),   KC_SPC ,            KC_MPRV,        KC_MNXT,                KC_TRNS,        KC_TRNS,
                                     KC_VOLU,            KC_VOLD,        KC_MUTE,                KC_TRNS,        KC_TRNS,
-       KC_TRNS, KC_TRNS,
+       KC_TRNS,     KC_TRNS,
        KC_TRNS,
-       KC_TRNS, KC_TRNS, KC_TRNS
+       LGUI(KC_X),  LGUI(KC_C),     LGUI(KC_V)
 ),
 };
 
@@ -139,6 +139,8 @@ const uint16_t PROGMEM fn_actions[] = {
     [1] = ACTION_LAYER_TAP_TOGGLE(SYMB)                // FN1 - Momentary Layer 1 (Symbols)
 };
 
+// action_get_macro() is unused — remove the “#if 0” and “#endif” lines to reenable
+#if 0
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 {
   // MACRODOWN only works in this function
@@ -153,6 +155,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
       }
     return MACRO_NONE;
 };
+#endif
 
 // Runs just one time when the keyboard initializes.
 void matrix_init_user(void) {
index 8e7219bfe8c8aec3cf26f84c4d95991e54358444..6da4d8ee3e1d291d62f998f365d289fc94771f35 100644 (file)
@@ -12,8 +12,9 @@ void matrix_scan_user(void) {
 }\r
 \r
 __attribute__ ((weak))\r
-void process_action_user(keyrecord_t *record) {\r
+bool process_action_user(keyrecord_t *record) {\r
        // leave this function blank - it can be defined in a keymap file\r
+       return true;\r
 }\r
 \r
 __attribute__ ((weak))\r
@@ -35,11 +36,11 @@ void matrix_scan_kb(void) {
        matrix_scan_user();\r
 }\r
 \r
-void process_action_kb(keyrecord_t *record) {\r
+bool process_action_kb(keyrecord_t *record) {\r
        // put your per-action keyboard code here\r
        // runs for every action, just before processing by the firmware\r
 \r
-       process_action_user(record);\r
+       return process_action_user(record);\r
 }\r
 \r
 void led_set_kb(uint8_t usb_led) {\r
index 2373ad333c3cb378997c414d5cc722404af55462..95e5e1ebc72734e27feee6b94849e643c1c3d7cd 100644 (file)
@@ -75,7 +75,7 @@ inline void gh60_wasd_leds_off(void)          { DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
 \r
 void matrix_init_user(void);\r
 void matrix_scan_user(void);\r
-void process_action_user(keyrecord_t *record);\r
+bool process_action_user(keyrecord_t *record);\r
 void led_set_user(uint8_t usb_led);\r
 \r
 #endif\r
diff --git a/keyboard/planck/keymaps/alexey.c b/keyboard/planck/keymaps/alexey.c
deleted file mode 100644 (file)
index 89af411..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#include "keymap_common.h"
-#include "planck.h"
-#include "backlight.h"
-
-#define _QW 0
-#define _LW 1
-#define _RS 2
-
-// This layout tries to imitate the Atreus keyboard
-
-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, MO(_LW)},
-  {KC_TRNS, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_TRNS},
-  {M(0),    KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_SPC,  KC_SPC,  MO(_RS), KC_MINS, KC_QUOT, KC_ENT,  KC_TRNS}
-},
-[_RS] = { /* RAISE */
-  {KC_TRNS, KC_EXLM, KC_AT,   KC_LCBR, KC_RCBR, KC_PIPE, KC_PGUP, KC_7,    KC_8,    KC_9, KC_ASTR, KC_TRNS},
-  {KC_TRNS, KC_HASH, KC_DLR,  KC_LPRN, KC_RPRN, KC_GRV,  KC_PGDN, KC_4,    KC_5,    KC_6, KC_PLUS, KC_TRNS},
-  {KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_AMPR, KC_1,    KC_2,    KC_3, KC_BSLS, KC_TRNS},
-  {KC_TRNS, KC_TRNS, KC_INS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_0, KC_EQL,  KC_TRNS}
-},
-[_LW] = { /* LOWER */
-  {KC_TRNS, KC_INS,    KC_HOME, KC_UP,   KC_END,  KC_PGUP, KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_TRNS},
-  {KC_TRNS, KC_DELETE, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_TRNS, KC_F4,   KC_F5,   KC_F6,   KC_F11,  KC_TRNS},
-  {KC_TRNS, KC_TRNS,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F12,  KC_TRNS},
-  {KC_TRNS, KC_TRNS,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MNXT, KC_MPLY, 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);
-            backlight_step();
-          } else {
-            unregister_code(KC_RSFT);
-          }
-        break;
-      }
-    return MACRO_NONE;
-};
-
diff --git a/keyboard/planck/keymaps/alexey/alexey.c b/keyboard/planck/keymaps/alexey/alexey.c
new file mode 100644 (file)
index 0000000..89af411
--- /dev/null
@@ -0,0 +1,51 @@
+#include "keymap_common.h"
+#include "planck.h"
+#include "backlight.h"
+
+#define _QW 0
+#define _LW 1
+#define _RS 2
+
+// This layout tries to imitate the Atreus keyboard
+
+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, MO(_LW)},
+  {KC_TRNS, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_TRNS},
+  {M(0),    KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_SPC,  KC_SPC,  MO(_RS), KC_MINS, KC_QUOT, KC_ENT,  KC_TRNS}
+},
+[_RS] = { /* RAISE */
+  {KC_TRNS, KC_EXLM, KC_AT,   KC_LCBR, KC_RCBR, KC_PIPE, KC_PGUP, KC_7,    KC_8,    KC_9, KC_ASTR, KC_TRNS},
+  {KC_TRNS, KC_HASH, KC_DLR,  KC_LPRN, KC_RPRN, KC_GRV,  KC_PGDN, KC_4,    KC_5,    KC_6, KC_PLUS, KC_TRNS},
+  {KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_AMPR, KC_1,    KC_2,    KC_3, KC_BSLS, KC_TRNS},
+  {KC_TRNS, KC_TRNS, KC_INS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_0, KC_EQL,  KC_TRNS}
+},
+[_LW] = { /* LOWER */
+  {KC_TRNS, KC_INS,    KC_HOME, KC_UP,   KC_END,  KC_PGUP, KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_TRNS},
+  {KC_TRNS, KC_DELETE, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_TRNS, KC_F4,   KC_F5,   KC_F6,   KC_F11,  KC_TRNS},
+  {KC_TRNS, KC_TRNS,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F12,  KC_TRNS},
+  {KC_TRNS, KC_TRNS,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MNXT, KC_MPLY, 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);
+            backlight_step();
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+      }
+    return MACRO_NONE;
+};
+
diff --git a/keyboard/planck/keymaps/angerthosenear.c b/keyboard/planck/keymaps/angerthosenear.c
deleted file mode 100644 (file)
index cdf6063..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#include "keymap_common.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = { /* Qwerty */
-  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_BSPC},
-  {KC_TAB,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN,  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_QUOT},
-  {KC_LCTL, KC_LGUI, KC_LALT, BL_STEP, 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] = { /* WASD + NumPad */
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P7,   KC_P8,   KC_P9,   KC_PSLS, KC_PMNS, KC_TRNS},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P4,   KC_P5,   KC_P6,   KC_PAST, KC_PPLS, KC_TRNS},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P1,   KC_P2,   KC_P3,   KC_PDOT, KC_PENT, KC_TRNS},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_SPC,  KC_P0,   FUNC(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
-},
-[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_TRNS},
-  {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
-  {KC_TRNS, KC_F11,  KC_F12,  KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20, KC_TRNS},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,    KC_TRNS,   KC_MPRV,  FUNC(1),   KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
-},
-[3] = { /* LOWER */
-  {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_DEL},
-  {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), 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_HOME, KC_PGDN, KC_PGUP, KC_END}
-}
-};
-
-
-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(T(CM_T), END);
-      break;
-    } 
-    return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/angerthosenear/angerthosenear.c b/keyboard/planck/keymaps/angerthosenear/angerthosenear.c
new file mode 100644 (file)
index 0000000..cdf6063
--- /dev/null
@@ -0,0 +1,50 @@
+#include "keymap_common.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = { /* Qwerty */
+  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_BSPC},
+  {KC_TAB,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN,  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_QUOT},
+  {KC_LCTL, KC_LGUI, KC_LALT, BL_STEP, 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] = { /* WASD + NumPad */
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P7,   KC_P8,   KC_P9,   KC_PSLS, KC_PMNS, KC_TRNS},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P4,   KC_P5,   KC_P6,   KC_PAST, KC_PPLS, KC_TRNS},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P1,   KC_P2,   KC_P3,   KC_PDOT, KC_PENT, KC_TRNS},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_SPC,  KC_P0,   FUNC(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
+},
+[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_TRNS},
+  {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
+  {KC_TRNS, KC_F11,  KC_F12,  KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20, KC_TRNS},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,    KC_TRNS,   KC_MPRV,  FUNC(1),   KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+[3] = { /* LOWER */
+  {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_DEL},
+  {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), 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_HOME, KC_PGDN, KC_PGUP, KC_END}
+}
+};
+
+
+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(T(CM_T), END);
+      break;
+    } 
+    return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/austin.c b/keyboard/planck/keymaps/austin.c
deleted file mode 100644 (file)
index 49fc98a..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#include "keymap_common.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = { /* 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},
-  {BL_STEP, KC_LGUI, KC_LALT, KC_LCTL, 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_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_LGUI, KC_LALT, KC_LCTL,  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_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
-  {KC_TRNS, KC_F11,  KC_F12,  KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20, 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 */
-  {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), LSFT(RSFT(KC_PAUSE)), 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}
-}
-};
-
-
-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(T(CM_T), END);
-      break;
-    } 
-    return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/austin/austin.c b/keyboard/planck/keymaps/austin/austin.c
new file mode 100644 (file)
index 0000000..49fc98a
--- /dev/null
@@ -0,0 +1,50 @@
+#include "keymap_common.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = { /* 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},
+  {BL_STEP, KC_LGUI, KC_LALT, KC_LCTL, 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_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_LGUI, KC_LALT, KC_LCTL,  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_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
+  {KC_TRNS, KC_F11,  KC_F12,  KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20, 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 */
+  {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), LSFT(RSFT(KC_PAUSE)), 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}
+}
+};
+
+
+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(T(CM_T), END);
+      break;
+    } 
+    return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/bone2planck.c b/keyboard/planck/keymaps/bone2planck.c
deleted file mode 100644 (file)
index a99e771..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-
-#include "planck.h"
-#ifdef BACKLIGHT_ENABLE
-#include "backlight.h"
-#endif
-#include "..\..\quantum\keymap_extras\keymap_german.h"
-
-/* This Layout tries to emulate the Bone2 Variant of Neo2, and is intended to be used with a German QWERTZ Softwarelayout.
-   It has Umlauts and "ß" as it is optimized for a mix of German & English.
-   My favourite features are the placement of the special characters often used for programming right on the home row 
-   and the number & navigation block combo, so you never have to move your hands from their home position.
-   
-   Bone2 wiki page: http://wiki.neo-layout.org/wiki/Bone
-*/
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-
-       /* Bone2
-       * ,-----------------------------------------------------------------------------------.
-       * | Q    |   J  |   D  |   U  |   A  |   X  |   P  |   H  |   L  |   M  |   W  |  ẞ   |
-       * |------+------+------+------+------+-------------+------+------+------+------+------|
-       * | M1   |   C  |   T  |   I  |   E  |   O  |   B  |   N  |   R  |   S  |   G  |  M1  |
-       * |------+------+------+------+------+------|------+------+------+------+------+------|
-       * | Shift|   F  |   V  |   Ü  |   Ä  |   Ö  |   Y  |   Z  |   ,  |   .  |   K  |Shift |
-       * |------+------+------+------+------+------+------+------+------+------+------+------|
-       * | Ctrl | GUI  | Alt  |  M3  |  M2  |    Space    |  M2  |  M3  |  Esc |  Tab |Enter |
-       * `-----------------------------------------------------------------------------------'
-       */
-       [0] = {
-               { DE_Q,    DE_J,        DE_D,    DE_U,    DE_A,    DE_X,    DE_P,    DE_H,    DE_L,    DE_M,    DE_W,    DE_SS  },
-               { MO(1),   DE_C,    DE_T,    DE_I,    DE_E,    DE_O,    DE_B,    DE_N,    DE_R,    DE_S,    DE_G,    MO(1)  },
-               { DE_S,    DE_F,    DE_V,    DE_UE,   DE_AE,   DE_OE,   DE_Y,    DE_Z,    DE_COMM, DE_DOT,  DE_K,    DE_S   },
-               { KC_LCTL, KC_LGUI, KC_LALT, MO(3),   MO(2),   KC_SPC,  KC_SPC,  MO(2),   MO(3),   KC_ESC,  KC_TAB,  KC_ENT }
-       },
-
-       /* M1 Special Characters
-       * ,-----------------------------------------------------------------------------------.
-       * | °    |   @  |   _  |   [  |   ]  |   ^  |   !  |   <  |   >  |   =  |   &  |      |
-       * |------+------+------+------+------+-------------+------+------+------+------+------|
-       * | M1   |   \  |   /  |   {  |   }  |   *  |   ?  |   (  |   )  |   -  |   :  |  M1  |
-       * |------+------+------+------+------+------|------+------+------+------+------+------|
-       * |      |   #  |   $  |   |  |   ~  |   €  |   +  |   %  |   "  |   '  |   ;  |      |
-       * |------+------+------+------+------+------+------+------+------+------+------+------|
-       * | Ctrl | GUI  | Alt  |  M3  |  M2  |    Space    |  M2  |  M3  |  Esc |  Tab |Enter |
-       * `-----------------------------------------------------------------------------------'
-       */
-       [1] = {
-               { DE_RING, DE_AT,   DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LESS, DE_MORE, DE_EQL,  DE_AMPR, KC_NO   },
-               { KC_TRNS, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QST,  DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, KC_TRNS },
-               { KC_NO  , DE_HASH, DE_DLR,  DE_PIPE, DE_TILD, DE_EURO, DE_PLUS, DE_PERC, DE_DQOT, DE_QUOT, DE_SCLN, 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 }
-       },
-
-       /* Navigation & Number Blocks
-       * ,-----------------------------------------------------------------------------------.
-       * |      | PgUp | Bksp |  Up  |  DEL | PgDn |      |   7  |   8  |   9  |      |      |
-       * |------+------+------+------+------+-------------+------+------+------+------+------|
-       * |      | Home |  Lft | Down | Right| End  |   .  |   4  |   5  |   6  |   ,  |      |
-       * |------+------+------+------+------+------|------+------+------+------+------+------|
-       * | Shift|      |  Tab | Ins  | Enter|      |   0  |   1  |   2  |   3  |   ;  |Shift |
-       * |------+------+------+------+------+------+------+------+------+------+------+------|
-       * | Ctrl | GUI  | Alt  |  M3  |  M2  |    Space    |  M2  |  M3  |  Esc |  Tab |Enter |
-       * `-----------------------------------------------------------------------------------'
-       */
-       [2] = {
-               { KC_NO,   KC_PGUP, KC_BSPC, KC_UP,   KC_DEL,  KC_PGDN, KC_NO,   DE_7,    DE_8,    DE_9,    KC_NO,   KC_NO   },
-               { KC_NO,   KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END,  DE_DOT,  DE_4,    DE_5,    DE_6,    DE_COMM, KC_NO   },
-               { DE_S,    KC_NO,   KC_TAB,  KC_INS,  KC_ENT,  KC_NO,   KC_0,    DE_1,    DE_2,    DE_3,    DE_SCLN, DE_S    },
-               { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
-       },
-
-       /* Function & Media Keys
-       * ,-----------------------------------------------------------------------------------.
-       * |      |      | Print|Scroll|Pause |      |      |  F7  |  F8  |  F9  |  F12 |      |
-       * |------+------+------+------+------+-------------+------+------+------+------+------|
-       * |      |      | Mute | Vol- | Vol+ |      |   ³  |  F4  |  F5  |  F6  |  F11 |      |
-       * |------+------+------+------+------+------|------+------+------+------+------+------|
-       * | Shift|      | Prev | Play | Next |      |   ²  |  F1  |  F2  |  F3  |  F10 |Shift |
-       * |------+------+------+------+------+------+------+------+------+------+------+------|
-       * | Ctrl | GUI  | Alt  |  M3  |      |    Space    |      |  M3  |  Esc |  Tab |Enter |
-       * `-----------------------------------------------------------------------------------'
-       */
-       [3] = {
-               { KC_NO,   KC_NO,   KC_PSCR, KC_SLCK, KC_PAUS, KC_NO,   KC_NO,   KC_F7,   KC_F8,   KC_F9,   KC_F12,  KC_NO      },
-               { KC_NO,   KC_NO,   KC_MUTE, KC_VOLD, KC_VOLU, KC_NO,   DE_SQ3,  KC_F4,   KC_F5,   KC_F6,   KC_F11,  KC_NO  },
-               { KC_TRNS, KC_NO,   KC_MPRV, KC_MPLY, KC_MNXT, KC_NO,   DE_SQ2,  KC_F1,   KC_F2,   KC_F3,   KC_F10,  KC_TRNS},
-               { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO,   KC_TRNS, KC_TRNS, KC_NO,   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);
-#ifdef BACKLIGHT_ENABLE
-                       backlight_step();
-#endif
-               }
-               else {
-                       unregister_code(KC_RSFT);
-               }
-               break;
-       }
-       return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/bone2planck/bone2planck.c b/keyboard/planck/keymaps/bone2planck/bone2planck.c
new file mode 100644 (file)
index 0000000..a99e771
--- /dev/null
@@ -0,0 +1,112 @@
+
+#include "planck.h"
+#ifdef BACKLIGHT_ENABLE
+#include "backlight.h"
+#endif
+#include "..\..\quantum\keymap_extras\keymap_german.h"
+
+/* This Layout tries to emulate the Bone2 Variant of Neo2, and is intended to be used with a German QWERTZ Softwarelayout.
+   It has Umlauts and "ß" as it is optimized for a mix of German & English.
+   My favourite features are the placement of the special characters often used for programming right on the home row 
+   and the number & navigation block combo, so you never have to move your hands from their home position.
+   
+   Bone2 wiki page: http://wiki.neo-layout.org/wiki/Bone
+*/
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+       /* Bone2
+       * ,-----------------------------------------------------------------------------------.
+       * | Q    |   J  |   D  |   U  |   A  |   X  |   P  |   H  |   L  |   M  |   W  |  ẞ   |
+       * |------+------+------+------+------+-------------+------+------+------+------+------|
+       * | M1   |   C  |   T  |   I  |   E  |   O  |   B  |   N  |   R  |   S  |   G  |  M1  |
+       * |------+------+------+------+------+------|------+------+------+------+------+------|
+       * | Shift|   F  |   V  |   Ü  |   Ä  |   Ö  |   Y  |   Z  |   ,  |   .  |   K  |Shift |
+       * |------+------+------+------+------+------+------+------+------+------+------+------|
+       * | Ctrl | GUI  | Alt  |  M3  |  M2  |    Space    |  M2  |  M3  |  Esc |  Tab |Enter |
+       * `-----------------------------------------------------------------------------------'
+       */
+       [0] = {
+               { DE_Q,    DE_J,        DE_D,    DE_U,    DE_A,    DE_X,    DE_P,    DE_H,    DE_L,    DE_M,    DE_W,    DE_SS  },
+               { MO(1),   DE_C,    DE_T,    DE_I,    DE_E,    DE_O,    DE_B,    DE_N,    DE_R,    DE_S,    DE_G,    MO(1)  },
+               { DE_S,    DE_F,    DE_V,    DE_UE,   DE_AE,   DE_OE,   DE_Y,    DE_Z,    DE_COMM, DE_DOT,  DE_K,    DE_S   },
+               { KC_LCTL, KC_LGUI, KC_LALT, MO(3),   MO(2),   KC_SPC,  KC_SPC,  MO(2),   MO(3),   KC_ESC,  KC_TAB,  KC_ENT }
+       },
+
+       /* M1 Special Characters
+       * ,-----------------------------------------------------------------------------------.
+       * | °    |   @  |   _  |   [  |   ]  |   ^  |   !  |   <  |   >  |   =  |   &  |      |
+       * |------+------+------+------+------+-------------+------+------+------+------+------|
+       * | M1   |   \  |   /  |   {  |   }  |   *  |   ?  |   (  |   )  |   -  |   :  |  M1  |
+       * |------+------+------+------+------+------|------+------+------+------+------+------|
+       * |      |   #  |   $  |   |  |   ~  |   €  |   +  |   %  |   "  |   '  |   ;  |      |
+       * |------+------+------+------+------+------+------+------+------+------+------+------|
+       * | Ctrl | GUI  | Alt  |  M3  |  M2  |    Space    |  M2  |  M3  |  Esc |  Tab |Enter |
+       * `-----------------------------------------------------------------------------------'
+       */
+       [1] = {
+               { DE_RING, DE_AT,   DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LESS, DE_MORE, DE_EQL,  DE_AMPR, KC_NO   },
+               { KC_TRNS, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QST,  DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, KC_TRNS },
+               { KC_NO  , DE_HASH, DE_DLR,  DE_PIPE, DE_TILD, DE_EURO, DE_PLUS, DE_PERC, DE_DQOT, DE_QUOT, DE_SCLN, 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 }
+       },
+
+       /* Navigation & Number Blocks
+       * ,-----------------------------------------------------------------------------------.
+       * |      | PgUp | Bksp |  Up  |  DEL | PgDn |      |   7  |   8  |   9  |      |      |
+       * |------+------+------+------+------+-------------+------+------+------+------+------|
+       * |      | Home |  Lft | Down | Right| End  |   .  |   4  |   5  |   6  |   ,  |      |
+       * |------+------+------+------+------+------|------+------+------+------+------+------|
+       * | Shift|      |  Tab | Ins  | Enter|      |   0  |   1  |   2  |   3  |   ;  |Shift |
+       * |------+------+------+------+------+------+------+------+------+------+------+------|
+       * | Ctrl | GUI  | Alt  |  M3  |  M2  |    Space    |  M2  |  M3  |  Esc |  Tab |Enter |
+       * `-----------------------------------------------------------------------------------'
+       */
+       [2] = {
+               { KC_NO,   KC_PGUP, KC_BSPC, KC_UP,   KC_DEL,  KC_PGDN, KC_NO,   DE_7,    DE_8,    DE_9,    KC_NO,   KC_NO   },
+               { KC_NO,   KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END,  DE_DOT,  DE_4,    DE_5,    DE_6,    DE_COMM, KC_NO   },
+               { DE_S,    KC_NO,   KC_TAB,  KC_INS,  KC_ENT,  KC_NO,   KC_0,    DE_1,    DE_2,    DE_3,    DE_SCLN, DE_S    },
+               { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
+       },
+
+       /* Function & Media Keys
+       * ,-----------------------------------------------------------------------------------.
+       * |      |      | Print|Scroll|Pause |      |      |  F7  |  F8  |  F9  |  F12 |      |
+       * |------+------+------+------+------+-------------+------+------+------+------+------|
+       * |      |      | Mute | Vol- | Vol+ |      |   ³  |  F4  |  F5  |  F6  |  F11 |      |
+       * |------+------+------+------+------+------|------+------+------+------+------+------|
+       * | Shift|      | Prev | Play | Next |      |   ²  |  F1  |  F2  |  F3  |  F10 |Shift |
+       * |------+------+------+------+------+------+------+------+------+------+------+------|
+       * | Ctrl | GUI  | Alt  |  M3  |      |    Space    |      |  M3  |  Esc |  Tab |Enter |
+       * `-----------------------------------------------------------------------------------'
+       */
+       [3] = {
+               { KC_NO,   KC_NO,   KC_PSCR, KC_SLCK, KC_PAUS, KC_NO,   KC_NO,   KC_F7,   KC_F8,   KC_F9,   KC_F12,  KC_NO      },
+               { KC_NO,   KC_NO,   KC_MUTE, KC_VOLD, KC_VOLU, KC_NO,   DE_SQ3,  KC_F4,   KC_F5,   KC_F6,   KC_F11,  KC_NO  },
+               { KC_TRNS, KC_NO,   KC_MPRV, KC_MPLY, KC_MNXT, KC_NO,   DE_SQ2,  KC_F1,   KC_F2,   KC_F3,   KC_F10,  KC_TRNS},
+               { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO,   KC_TRNS, KC_TRNS, KC_NO,   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);
+#ifdef BACKLIGHT_ENABLE
+                       backlight_step();
+#endif
+               }
+               else {
+                       unregister_code(KC_RSFT);
+               }
+               break;
+       }
+       return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/brandon.c b/keyboard/planck/keymaps/brandon.c
deleted file mode 100644 (file)
index 2b89f86..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
-// this is the style you want to emulate.
-
-#include "planck.h"
-#ifdef BACKLIGHT_ENABLE
-  #include "backlight.h"
-#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 _TK 2
-#define _LW 3
-#define _RS 4
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[_QW] = { /* Qwerty */
-/* MIT Layout (QWERTY layer)
- *
- * ,-----------------------------------------------------------------------.
- * | esc |  q  |  w  |  e  |  r  |  t  |  y  |  u  |  i  |  o  |  p  | bspc|
- * |-----------------------------------------------------------------------|
- * | tab |  a  |  s  |  d  |  f  |  g  |  h  |  j  |  k  |  l  |  ;  |  '  |
- * |-----------------------------------------------------------------------|
- * |shift|  z  |  x  |  c  |  v  |  b  |  n  |  m  |  ,  |  .  |  /  |enter|
- * |-----------------------------------------------------------------------|
- * | ctl | alt | win | TK  |lower|    spc    |raise|left |down | up  |right|
- * `-----------------------------------------------------------------------'
- */
-  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
-  {KC_TAB,  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, MT(MOD_LSFT, KC_ENT) },
-  {KC_LCTL, KC_LALT, KC_LGUI, TG(_TK), MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
-},
-[_CM] = { /* Colemak */
-/* MIT Layout (Colemak layer)
- *
- * ,-----------------------------------------------------------------------.
- * | esc |  q  |  w  |  f  |  p  |  g  |  j  |  l  |  u  |  y  |  ;  | bspc|
- * |-----------------------------------------------------------------------|
- * | tab |  a  |  r  |  s  |  t  |  d  |  h  |  n  |  e  |  i  |  o  |  '  |
- * |-----------------------------------------------------------------------|
- * |shift|  z  |  x  |  c  |  v  |  b  |  k  |  m  |  ,  |  .  |  /  |enter|
- * |-----------------------------------------------------------------------|
- * | ctl | alt | win | TK  |lower|    spc    |raise|left |down | up  |right|
- * `-----------------------------------------------------------------------'
- */
-  {KC_ESC,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
-  {KC_TAB,  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, MT(MOD_LSFT, KC_ENT)},
-  {KC_LCTL, KC_LALT, KC_LGUI, TG(_TK), MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
-},
-[_RS] = { /* RAISE */
-/* MIT Layout (RAISE layer)
- *
- * ,-----------------------------------------------------------------------.
- * |  `  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  0  | bspc|
- * |-----------------------------------------------------------------------|
- * | tab | F1  | F2  | F3  |  F4 |  F5 |  F6 |  -  |  =  |  [  |  ]  |  \  |
- * |-----------------------------------------------------------------------|
- * |shift|  F7 |  F8 |  F9 | F10 | F11 | F12 |  QW |  CM |  BL | RST |enter|
- * |-----------------------------------------------------------------------|
- * | ctl | alt | win | del |lower|    spc    |raise|next |vold |volu |PLAY |
- * `-----------------------------------------------------------------------'
- */
-
-  {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), M(0),    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 */
-/* MIT Layout (Colemak layer)
- *
- * ,-----------------------------------------------------------------------.
- * | esc |  q  |  w  |  f  |  p  |  g  |  j  |  l  |  u  |  y  |  ;  | bspc|
- * |-----------------------------------------------------------------------|
- * | tab | F1  | F2  | F3  |  F4 |  F5 |  F6 |  _  |  +  |  {  |  }  |  |  |
- * |-----------------------------------------------------------------------|
- * |shift|  F7 |  F8 |  F9 | F10 | F11 | F12 |  QW |  CM |  BL | RST |enter|
- * |-----------------------------------------------------------------------|
- * | ctl | alt | win | TK  |lower|    spc    |raise|next |vold |volu |PLAY |
- * `-----------------------------------------------------------------------'
- */
-  {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), M(0),    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}
-},
-[_TK] = { /* Ten Key*/
-/* MIT Layout (Ten Key layer)
- *
- * ,-----------------------------------------------------------------------.
- * | esc |  F9 | F10 | F11 | F12 | PGUP|  %  |  /  |  7  |  8  |  9  | bspc|
- * |-----------------------------------------------------------------------|
- * | tab |  F5 |  F6 | F7  |  F8 | PGDN| HOME|  *  |  4  |  5  |  6  |  \  |
- * |-----------------------------------------------------------------------|
- * |shift|  F1 |  F2 | F3  |  F4 | DEL | END |  0  |  1  |  2  |  3  |enter|
- * |-----------------------------------------------------------------------|
- * | ctl | alt | win | TK  |lower|    spc    |raise|left |down | up  |right|
- * `-----------------------------------------------------------------------'
- */
-  {KC_TRNS, KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_PGUP, KC_PERC, KC_SLSH, KC_7,    KC_8,    KC_9,  KC_BSPC},
-  {KC_TRNS, KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_PGDN, KC_HOME, KC_ASTR, KC_4,    KC_5,    KC_6,  KC_PIPE},
-  {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_DEL,  KC_END,  KC_0,    KC_1,    KC_2,    KC_3,  KC_TRNS},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
-}
-
-};
-
-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);
-            #ifdef BACKLIGHT_ENABLE
-              backlight_step();
-            #endif
-          } else {
-            unregister_code(KC_RSFT);
-          }
-        break;
-      }
-    return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/brandon/brandon.c b/keyboard/planck/keymaps/brandon/brandon.c
new file mode 100644 (file)
index 0000000..2b89f86
--- /dev/null
@@ -0,0 +1,134 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "planck.h"
+#ifdef BACKLIGHT_ENABLE
+  #include "backlight.h"
+#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 _TK 2
+#define _LW 3
+#define _RS 4
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[_QW] = { /* Qwerty */
+/* MIT Layout (QWERTY layer)
+ *
+ * ,-----------------------------------------------------------------------.
+ * | esc |  q  |  w  |  e  |  r  |  t  |  y  |  u  |  i  |  o  |  p  | bspc|
+ * |-----------------------------------------------------------------------|
+ * | tab |  a  |  s  |  d  |  f  |  g  |  h  |  j  |  k  |  l  |  ;  |  '  |
+ * |-----------------------------------------------------------------------|
+ * |shift|  z  |  x  |  c  |  v  |  b  |  n  |  m  |  ,  |  .  |  /  |enter|
+ * |-----------------------------------------------------------------------|
+ * | ctl | alt | win | TK  |lower|    spc    |raise|left |down | up  |right|
+ * `-----------------------------------------------------------------------'
+ */
+  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
+  {KC_TAB,  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, MT(MOD_LSFT, KC_ENT) },
+  {KC_LCTL, KC_LALT, KC_LGUI, TG(_TK), MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+[_CM] = { /* Colemak */
+/* MIT Layout (Colemak layer)
+ *
+ * ,-----------------------------------------------------------------------.
+ * | esc |  q  |  w  |  f  |  p  |  g  |  j  |  l  |  u  |  y  |  ;  | bspc|
+ * |-----------------------------------------------------------------------|
+ * | tab |  a  |  r  |  s  |  t  |  d  |  h  |  n  |  e  |  i  |  o  |  '  |
+ * |-----------------------------------------------------------------------|
+ * |shift|  z  |  x  |  c  |  v  |  b  |  k  |  m  |  ,  |  .  |  /  |enter|
+ * |-----------------------------------------------------------------------|
+ * | ctl | alt | win | TK  |lower|    spc    |raise|left |down | up  |right|
+ * `-----------------------------------------------------------------------'
+ */
+  {KC_ESC,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
+  {KC_TAB,  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, MT(MOD_LSFT, KC_ENT)},
+  {KC_LCTL, KC_LALT, KC_LGUI, TG(_TK), MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+[_RS] = { /* RAISE */
+/* MIT Layout (RAISE layer)
+ *
+ * ,-----------------------------------------------------------------------.
+ * |  `  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  0  | bspc|
+ * |-----------------------------------------------------------------------|
+ * | tab | F1  | F2  | F3  |  F4 |  F5 |  F6 |  -  |  =  |  [  |  ]  |  \  |
+ * |-----------------------------------------------------------------------|
+ * |shift|  F7 |  F8 |  F9 | F10 | F11 | F12 |  QW |  CM |  BL | RST |enter|
+ * |-----------------------------------------------------------------------|
+ * | ctl | alt | win | del |lower|    spc    |raise|next |vold |volu |PLAY |
+ * `-----------------------------------------------------------------------'
+ */
+
+  {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), M(0),    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 */
+/* MIT Layout (Colemak layer)
+ *
+ * ,-----------------------------------------------------------------------.
+ * | esc |  q  |  w  |  f  |  p  |  g  |  j  |  l  |  u  |  y  |  ;  | bspc|
+ * |-----------------------------------------------------------------------|
+ * | tab | F1  | F2  | F3  |  F4 |  F5 |  F6 |  _  |  +  |  {  |  }  |  |  |
+ * |-----------------------------------------------------------------------|
+ * |shift|  F7 |  F8 |  F9 | F10 | F11 | F12 |  QW |  CM |  BL | RST |enter|
+ * |-----------------------------------------------------------------------|
+ * | ctl | alt | win | TK  |lower|    spc    |raise|next |vold |volu |PLAY |
+ * `-----------------------------------------------------------------------'
+ */
+  {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), M(0),    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}
+},
+[_TK] = { /* Ten Key*/
+/* MIT Layout (Ten Key layer)
+ *
+ * ,-----------------------------------------------------------------------.
+ * | esc |  F9 | F10 | F11 | F12 | PGUP|  %  |  /  |  7  |  8  |  9  | bspc|
+ * |-----------------------------------------------------------------------|
+ * | tab |  F5 |  F6 | F7  |  F8 | PGDN| HOME|  *  |  4  |  5  |  6  |  \  |
+ * |-----------------------------------------------------------------------|
+ * |shift|  F1 |  F2 | F3  |  F4 | DEL | END |  0  |  1  |  2  |  3  |enter|
+ * |-----------------------------------------------------------------------|
+ * | ctl | alt | win | TK  |lower|    spc    |raise|left |down | up  |right|
+ * `-----------------------------------------------------------------------'
+ */
+  {KC_TRNS, KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_PGUP, KC_PERC, KC_SLSH, KC_7,    KC_8,    KC_9,  KC_BSPC},
+  {KC_TRNS, KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_PGDN, KC_HOME, KC_ASTR, KC_4,    KC_5,    KC_6,  KC_PIPE},
+  {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_DEL,  KC_END,  KC_0,    KC_1,    KC_2,    KC_3,  KC_TRNS},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+}
+
+};
+
+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);
+            #ifdef BACKLIGHT_ENABLE
+              backlight_step();
+            #endif
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+      }
+    return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/charlie.c b/keyboard/planck/keymaps/charlie.c
deleted file mode 100644 (file)
index 88f454d..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#include "keymap_common.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-    [0] = { /* Native */
-      {KC_ESC,     KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    FUNC(2)}, 
-      {KC_BSPC,    KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
-     {KC_TAB,     KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT},
-      {KC_DEL,     KC_LCTL, KC_NO,   KC_LSFT, KC_LALT, KC_SPC,        KC_NO,   KC_LEFT, KC_DOWN, KC_UP,  KC_RGHT}
-},       
-    [1] = { /* QWERTY->PHOTOSHOP */
-      {KC_DELETE,  KC_0,    KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    FUNC(1)},
-      {KC_O,       KC_G,    KC_S,    KC_U,    KC_T,    FUNC(27),  KC_F21,  KC_F10,  KC_F11,  KC_F7,   KC_F8,   KC_F9},
-      {KC_TAB,     FUNC(4), FUNC(5),  FUNC(6),  KC_F1,   FUNC(7),  KC_F18,  KC_F19,  KC_F23,  KC_F20,  KC_F22,  FUNC(9)},
-      {KC_COMM,    KC_DOT,  KC_R, FUNC(11), FUNC(3),  KC_SPC,        FUNC(12), KC_F2,   FUNC(8),  KC_F3,   KC_F14}
-         },
-    [2] = { /* 2: FUNC(3 PHOTOSHOP */
-      {KC_ESC,    FUNC(25), FUNC(26),   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO},
-      {KC_NO,      KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   FUNC(19), FUNC(20), FUNC(21)}, 
-      {KC_C,       KC_NO,  FUNC(22),  FUNC(5),   KC_NO,   FUNC(23), KC_NO,   KC_NO,   KC_NO,   KC_NO,   FUNC(13), KC_NO},
-      {FUNC(14),    FUNC(15), FUNC(16), FUNC(17), FUNC(3),   KC_SPC,        FUNC(18), KC_NO,   KC_NO,   KC_F24,  KC_NO}
-         }
-};
-
-const uint16_t PROGMEM fn_actions[] = {
-    [1] = ACTION_DEFAULT_LAYER_SET(0),                             // set Qwerty layout
-    [2] = ACTION_DEFAULT_LAYER_SET(1),                             // set Photoshop presets
-    [3] = ACTION_LAYER_MOMENTARY(2),                                  // Photoshop function layer
-    [4] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F9),   // photo folder AHK
-    [5] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_I),              // select inverse
-    [6] = ACTION_MODS_KEY(MOD_LSFT, KC_M),                         // marquee select
-    [7] = ACTION_MODS_KEY(MOD_LALT, KC_BSPC),                      // fill 
-    [8] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_X),    // warp
-    [9] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT | MOD_LSFT, KC_F12),  // merge all new layer
-    [10] = ACTION_MODS_KEY(MOD_LCTL, KC_MINS),                     // zoom out
-    [11] = ACTION_MODS_KEY(MOD_LCTL, KC_H),                        // RBG sliders
-    [12] = ACTION_MODS_KEY(MOD_LCTL, KC_S),                        // save
-    [13] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_F5),           // layer mask from transparancy 
-    [14] = ACTION_MODS_KEY(MOD_LCTL, KC_F2),                     // stroke
-    [15] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_F2),                     // stroke layer
-    [16] = ACTION_MODS_KEY(MOD_LCTL, KC_0),                      // zoom 0
-    [17] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_H),             // HSV sliders
-    [18] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_S),         // save as 
-    [19] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F7),  // gaussian blur
-    [20] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F8),  // motion blur
-    [21] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_X),            // liquify filter
-    [22] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS),                     // prev layer blending
-    [23] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_BSPC),             // KC_NOrmal layer blending
-    [24] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL),                      // next layer blending
-    [25] = ACTION_MODS_KEY(MOD_LCTL, KC_Z),                        // step back
-    [26] = ACTION_MODS_KEY(MOD_LCTL, KC_Y),                        // step forward
-    [27] = ACTION_MODS_KEY(MOD_LCTL, KC_R),                        // rasterize
-     
-};
diff --git a/keyboard/planck/keymaps/charlie/charlie.c b/keyboard/planck/keymaps/charlie/charlie.c
new file mode 100644 (file)
index 0000000..88f454d
--- /dev/null
@@ -0,0 +1,54 @@
+#include "keymap_common.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    [0] = { /* Native */
+      {KC_ESC,     KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    FUNC(2)}, 
+      {KC_BSPC,    KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
+     {KC_TAB,     KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT},
+      {KC_DEL,     KC_LCTL, KC_NO,   KC_LSFT, KC_LALT, KC_SPC,        KC_NO,   KC_LEFT, KC_DOWN, KC_UP,  KC_RGHT}
+},       
+    [1] = { /* QWERTY->PHOTOSHOP */
+      {KC_DELETE,  KC_0,    KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    FUNC(1)},
+      {KC_O,       KC_G,    KC_S,    KC_U,    KC_T,    FUNC(27),  KC_F21,  KC_F10,  KC_F11,  KC_F7,   KC_F8,   KC_F9},
+      {KC_TAB,     FUNC(4), FUNC(5),  FUNC(6),  KC_F1,   FUNC(7),  KC_F18,  KC_F19,  KC_F23,  KC_F20,  KC_F22,  FUNC(9)},
+      {KC_COMM,    KC_DOT,  KC_R, FUNC(11), FUNC(3),  KC_SPC,        FUNC(12), KC_F2,   FUNC(8),  KC_F3,   KC_F14}
+         },
+    [2] = { /* 2: FUNC(3 PHOTOSHOP */
+      {KC_ESC,    FUNC(25), FUNC(26),   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO},
+      {KC_NO,      KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   FUNC(19), FUNC(20), FUNC(21)}, 
+      {KC_C,       KC_NO,  FUNC(22),  FUNC(5),   KC_NO,   FUNC(23), KC_NO,   KC_NO,   KC_NO,   KC_NO,   FUNC(13), KC_NO},
+      {FUNC(14),    FUNC(15), FUNC(16), FUNC(17), FUNC(3),   KC_SPC,        FUNC(18), KC_NO,   KC_NO,   KC_F24,  KC_NO}
+         }
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_DEFAULT_LAYER_SET(0),                             // set Qwerty layout
+    [2] = ACTION_DEFAULT_LAYER_SET(1),                             // set Photoshop presets
+    [3] = ACTION_LAYER_MOMENTARY(2),                                  // Photoshop function layer
+    [4] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F9),   // photo folder AHK
+    [5] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_I),              // select inverse
+    [6] = ACTION_MODS_KEY(MOD_LSFT, KC_M),                         // marquee select
+    [7] = ACTION_MODS_KEY(MOD_LALT, KC_BSPC),                      // fill 
+    [8] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_X),    // warp
+    [9] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT | MOD_LSFT, KC_F12),  // merge all new layer
+    [10] = ACTION_MODS_KEY(MOD_LCTL, KC_MINS),                     // zoom out
+    [11] = ACTION_MODS_KEY(MOD_LCTL, KC_H),                        // RBG sliders
+    [12] = ACTION_MODS_KEY(MOD_LCTL, KC_S),                        // save
+    [13] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_F5),           // layer mask from transparancy 
+    [14] = ACTION_MODS_KEY(MOD_LCTL, KC_F2),                     // stroke
+    [15] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_F2),                     // stroke layer
+    [16] = ACTION_MODS_KEY(MOD_LCTL, KC_0),                      // zoom 0
+    [17] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_H),             // HSV sliders
+    [18] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_S),         // save as 
+    [19] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F7),  // gaussian blur
+    [20] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F8),  // motion blur
+    [21] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_X),            // liquify filter
+    [22] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS),                     // prev layer blending
+    [23] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_BSPC),             // KC_NOrmal layer blending
+    [24] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL),                      // next layer blending
+    [25] = ACTION_MODS_KEY(MOD_LCTL, KC_Z),                        // step back
+    [26] = ACTION_MODS_KEY(MOD_LCTL, KC_Y),                        // step forward
+    [27] = ACTION_MODS_KEY(MOD_LCTL, KC_R),                        // rasterize
+     
+};
diff --git a/keyboard/planck/keymaps/daniel.c b/keyboard/planck/keymaps/daniel.c
deleted file mode 100644 (file)
index 234e48f..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#include "keymap_common.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = { /* Qwerty */
-  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_BSPC},
-  {KC_TAB,  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_RSFT},
-  {FUNC(3), 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] = { /* RAISE */
-  {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_EQL},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC},
-  {KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_MINS,  S(KC_MINS),  KC_BSLS, 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}
-},
-[2] = { /* LOWER */
-  {S(KC_GRV), KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,  S(KC_EQL)},
-  {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_CAPS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_ENT},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2),   KC_TRNS,   KC_TRNS,   KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
-},
-[3] = { /* Qwerty */
-  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_DEL},
-  {KC_TAB,  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_RSFT},
-  {KC_TRNS, 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
-}
-};
-
-
-const uint16_t PROGMEM fn_actions[] = {
-    [1] = ACTION_LAYER_MOMENTARY(1),  // to RAISE
-    [2] = ACTION_LAYER_MOMENTARY(2),   // to LOWER
-    [3] = ACTION_LAYER_MOMENTARY(3)   // to LOWER
-};
-
-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(T(CM_T), END);
-      break;
-    } 
-    return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/daniel/daniel.c b/keyboard/planck/keymaps/daniel/daniel.c
new file mode 100644 (file)
index 0000000..234e48f
--- /dev/null
@@ -0,0 +1,48 @@
+#include "keymap_common.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = { /* Qwerty */
+  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_BSPC},
+  {KC_TAB,  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_RSFT},
+  {FUNC(3), 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] = { /* RAISE */
+  {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_EQL},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC},
+  {KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_MINS,  S(KC_MINS),  KC_BSLS, 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}
+},
+[2] = { /* LOWER */
+  {S(KC_GRV), KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,  S(KC_EQL)},
+  {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_CAPS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_ENT},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2),   KC_TRNS,   KC_TRNS,   KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+[3] = { /* Qwerty */
+  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_DEL},
+  {KC_TAB,  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_RSFT},
+  {KC_TRNS, 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
+}
+};
+
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_LAYER_MOMENTARY(1),  // to RAISE
+    [2] = ACTION_LAYER_MOMENTARY(2),   // to LOWER
+    [3] = ACTION_LAYER_MOMENTARY(3)   // to LOWER
+};
+
+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(T(CM_T), END);
+      break;
+    } 
+    return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/david.c b/keyboard/planck/keymaps/david.c
deleted file mode 100644 (file)
index f483084..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-#include "keymap_common.h"
-#include "beeps.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = { /* Qwerty */
-  {KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_BSPC,  KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_BSPC},
-  {KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_ENT,   KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN,  KC_QUOT},
-  {KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_ESC,   KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT},
-  {M(10), 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_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_TRNS, FUNC(3), FUNC(4), RESET, M(0), M(1), M(2), KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
-  {KC_TRNS, KC_F11,  KC_F12,  M(0),   M(1),   M(2),   M(3),   M(4),   M(5),   M(6),   M(7), 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 */
-  {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, M(0), M(1), M(2), 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}
-}
-};
-
-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
-    if (record->event.pressed) {
-      switch(id) {
-        case 0:
-            true_note(12, 12, 20);
-        break;
-        case 1:
-            true_note(14, 14, 20);
-        break;
-        case 2:
-            true_note(16, 16, 20);
-        break;
-        case 3:
-            true_note(17, 17, 20);
-        break;
-        case 4:
-            true_note(19, 19, 20);
-        break;
-        case 5:
-            true_note(21, 21, 20);
-        break;
-        case 6:
-            true_note(23, 23, 20);
-        break;
-        case 7:
-            true_note(24, 24, 20);
-        break;
-        case 10:
-
-        break;
-      } 
-    }
-    return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/david/david.c b/keyboard/planck/keymaps/david/david.c
new file mode 100644 (file)
index 0000000..f483084
--- /dev/null
@@ -0,0 +1,76 @@
+#include "keymap_common.h"
+#include "beeps.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = { /* Qwerty */
+  {KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_BSPC,  KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_BSPC},
+  {KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_ENT,   KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN,  KC_QUOT},
+  {KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_ESC,   KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT},
+  {M(10), 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_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_TRNS, FUNC(3), FUNC(4), RESET, M(0), M(1), M(2), KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
+  {KC_TRNS, KC_F11,  KC_F12,  M(0),   M(1),   M(2),   M(3),   M(4),   M(5),   M(6),   M(7), 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 */
+  {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, M(0), M(1), M(2), 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}
+}
+};
+
+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
+    if (record->event.pressed) {
+      switch(id) {
+        case 0:
+            true_note(12, 12, 20);
+        break;
+        case 1:
+            true_note(14, 14, 20);
+        break;
+        case 2:
+            true_note(16, 16, 20);
+        break;
+        case 3:
+            true_note(17, 17, 20);
+        break;
+        case 4:
+            true_note(19, 19, 20);
+        break;
+        case 5:
+            true_note(21, 21, 20);
+        break;
+        case 6:
+            true_note(23, 23, 20);
+        break;
+        case 7:
+            true_note(24, 24, 20);
+        break;
+        case 10:
+
+        break;
+      } 
+    }
+    return MACRO_NONE;
+};
index ac4937b69e5697bc0579beab8e67d1181898ffdb..36d496416e971f7aad9f6d494ea5e16af5ec661a 100644 (file)
@@ -19,8 +19,7 @@ extern keymap_config_t keymap_config;
 #define _DVORAK 2
 #define _LOWER 3
 #define _RAISE 4
-#define _MUSIC 5
-#define _PLOVER 6
+#define _PLOVER 5
 #define _ADJUST 16
 
 // Macro name shortcuts
@@ -30,14 +29,9 @@ extern keymap_config_t keymap_config;
 #define LOWER M(_LOWER)
 #define RAISE M(_RAISE)
 #define M_BL 5
-#define AUD_OFF M(6)
-#define AUD_ON M(7)
-#define MUS_OFF M(8)
-#define MUS_ON M(9)
-#define VC_IN M(10)
-#define VC_DE M(11)
 #define PLOVER M(12)
 #define EXT_PLV M(13)
+#define TOG_OUT M(14)
 
 // Fillers to make layering more clear
 #define _______ KC_TRNS
@@ -105,7 +99,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * |------+------+------+------+------+-------------+------+------+------+------+------|
  * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
  * |------+------+------+------+------+------|------+------+------+------+------+------|
- * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      |      |      |      |Enter |
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | |      |      |Enter |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
  * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
  * `-----------------------------------------------------------------------------------'
@@ -113,7 +107,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 [_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,  _______, _______, _______, _______, _______},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______},
   {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
 },
 
@@ -123,7 +117,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * |------+------+------+------+------+-------------+------+------+------+------+------|
  * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
  * |------+------+------+------+------+------|------+------+------+------+------+------|
- * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      |      |      |      |Enter |
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |      |      |Enter |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
  * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
  * `-----------------------------------------------------------------------------------'
@@ -131,27 +125,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 [_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,  _______, _______, _______, _______, _______},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, _______, _______, _______},
   {_______, _______, _______, _______, _______, _______, _______, _______, 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, LOWER,   XXXXXXX, XXXXXXX, RAISE,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
-},
-
 /* Plover layer (http://opensteno.org)
  * ,-----------------------------------------------------------------------------------.
  * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |
  * |------+------+------+------+------+-------------+------+------+------+------+------|
  * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  |
  * |------+------+------+------+------+------|------+------+------+------+------+------|
- * |      |   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  |
+ * |TogOut|   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
  * | Exit |      |      |   A  |   O  |             |   E  |   U  |      |      |      |
  * `-----------------------------------------------------------------------------------'
@@ -160,7 +144,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 [_PLOVER] = {
   {KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1   },
   {XXXXXXX, KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC},
-  {XXXXXXX, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
+  {TOG_OUT, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
   {EXT_PLV, XXXXXXX, XXXXXXX, KC_C,    KC_V,    XXXXXXX, XXXXXXX, KC_N,    KC_M,    XXXXXXX, XXXXXXX, XXXXXXX}
 },
 
@@ -177,8 +161,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  */
 [_ADJUST] = {
   {_______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
-  {_______, _______, _______, AUD_ON,  AUD_OFF, AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  PLOVER,  _______},
-  {_______, VC_DE,   VC_IN,   MUS_ON,  MUS_OFF, _______, _______, _______, _______, _______, _______, _______},
+  {_______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  PLOVER,  _______},
+  {_______, MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  _______, _______, _______, _______, _______},
   {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
 }
 
@@ -204,7 +188,6 @@ 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);
 #endif
 
@@ -269,53 +252,6 @@ 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) {
-            #ifdef AUDIO_ENABLE
-              audio_off();
-            #endif
-          }
-        break;
-        case 7:
-          if (record->event.pressed) {
-            #ifdef AUDIO_ENABLE
-              audio_on();
-              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(music_scale, false, 0);
-              layer_on(_MUSIC);
-            #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;
         case 12:
           if (record->event.pressed) {
             #ifdef AUDIO_ENABLE
@@ -325,7 +261,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
             layer_off(_RAISE);
             layer_off(_LOWER);
             layer_off(_ADJUST);
-            layer_off(_MUSIC);
             layer_on(_PLOVER);
             if (!eeconfig_is_enabled()) {
                 eeconfig_init();
@@ -343,7 +278,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
             layer_off(_PLOVER);
           }
         break;
-
+        case 14:
+          if (record->event.pressed) {
+            return MACRO( D(E), D(R), D(F), D(V), D(O), D(L), U(E), U(R), U(F), U(V), U(O), U(L), END );
+          }
+        break;
       }
     return MACRO_NONE;
 };
@@ -361,19 +300,4 @@ void play_goodbye_tone()
   PLAY_NOTE_ARRAY(goodbye, false, 0);
   _delay_ms(150);
 }
-
-uint8_t starting_note = 0x0C;
-int offset = 0;
-
-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)));
-    }
-  }
-
-}
 #endif
diff --git a/keyboard/planck/keymaps/dzobert.c b/keyboard/planck/keymaps/dzobert.c
deleted file mode 100644 (file)
index 665e9c2..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-#include "keymap_common.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = { /* Qwerty */
-  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_TAB},
-  {KC_LCTL,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN,  KC_BSPC},
-  {KC_LALT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT},
-  {KC_FN4, KC_RSFT, KC_LGUI, KC_LSFT, 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_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_TAB},
-  {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,     KC_BSPC},
-  {KC_LALT, 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_RSFT, KC_LGUI, KC_LSFT, FUNC(2),    KC_SPC,   KC_SPC,    FUNC(1),   KC_LEFT, KC_DOWN, KC_UP,  KC_RGHT}
-},
-[2] = { /* RAISE */
-  {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_TRNS, KC_1,    KC_2,    KC_3,    KC_4,    KC_5,     KC_6,     KC_7,    KC_8,          KC_9,  KC_DEL},
-  {KC_TRNS, KC_GRV,  KC_MINS,  KC_EQL,  KC_QUOT,  S(KC_QUOT),  S(KC_LBRC),  S(KC_RBRC),  KC_LBRC,  KC_RBRC,  KC_BSLS, KC_TRNS},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,    KC_TRNS,   KC_TRNS,  FUNC(1),   KC_HOME, KC_PGUP, KC_PGDN, KC_END}
-},
-[3] = { /* LOWER */
-  {KC_POWER,KC_PSCR, KC_SLCK, KC_PAUSE, KC_NLCK, KC_EXECUTE, KC_MENU,   KC_APP,  KC_7,  KC_8, KC_9, KC_KP_SLASH},
-  {KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_CAPS, KC_CANCEL, KC_UNDO, KC_AGAIN, KC_4,  KC_5, KC_6, KC_KP_ASTERISK},
-  {KC_TRNS, KC_INSERT,KC_CUT,   KC_COPY,   KC_PASTE,   KC_BSLS,   KC_9,   KC_0,   KC_1,   KC_2,   KC_3,  KC_KP_MINUS},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2),   KC_TRNS,   KC_TRNS,   KC_TRNS, KC_0, KC_KP_DOT, KC_KP_ENTER, KC_KP_PLUS}
-}
-};
-
-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(T(CM_T), END);
-      break;
-    } 
-    return MACRO_NONE;
-};
\ No newline at end of file
diff --git a/keyboard/planck/keymaps/dzobert/dzobert.c b/keyboard/planck/keymaps/dzobert/dzobert.c
new file mode 100644 (file)
index 0000000..665e9c2
--- /dev/null
@@ -0,0 +1,49 @@
+#include "keymap_common.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = { /* Qwerty */
+  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_TAB},
+  {KC_LCTL,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN,  KC_BSPC},
+  {KC_LALT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT},
+  {KC_FN4, KC_RSFT, KC_LGUI, KC_LSFT, 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_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_TAB},
+  {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,     KC_BSPC},
+  {KC_LALT, 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_RSFT, KC_LGUI, KC_LSFT, FUNC(2),    KC_SPC,   KC_SPC,    FUNC(1),   KC_LEFT, KC_DOWN, KC_UP,  KC_RGHT}
+},
+[2] = { /* RAISE */
+  {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_TRNS, KC_1,    KC_2,    KC_3,    KC_4,    KC_5,     KC_6,     KC_7,    KC_8,          KC_9,  KC_DEL},
+  {KC_TRNS, KC_GRV,  KC_MINS,  KC_EQL,  KC_QUOT,  S(KC_QUOT),  S(KC_LBRC),  S(KC_RBRC),  KC_LBRC,  KC_RBRC,  KC_BSLS, KC_TRNS},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,    KC_TRNS,   KC_TRNS,  FUNC(1),   KC_HOME, KC_PGUP, KC_PGDN, KC_END}
+},
+[3] = { /* LOWER */
+  {KC_POWER,KC_PSCR, KC_SLCK, KC_PAUSE, KC_NLCK, KC_EXECUTE, KC_MENU,   KC_APP,  KC_7,  KC_8, KC_9, KC_KP_SLASH},
+  {KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_CAPS, KC_CANCEL, KC_UNDO, KC_AGAIN, KC_4,  KC_5, KC_6, KC_KP_ASTERISK},
+  {KC_TRNS, KC_INSERT,KC_CUT,   KC_COPY,   KC_PASTE,   KC_BSLS,   KC_9,   KC_0,   KC_1,   KC_2,   KC_3,  KC_KP_MINUS},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2),   KC_TRNS,   KC_TRNS,   KC_TRNS, KC_0, KC_KP_DOT, KC_KP_ENTER, KC_KP_PLUS}
+}
+};
+
+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(T(CM_T), END);
+      break;
+    } 
+    return MACRO_NONE;
+};
\ No newline at end of file
diff --git a/keyboard/planck/keymaps/experimental/README.md b/keyboard/planck/keymaps/experimental/README.md
new file mode 100644 (file)
index 0000000..de9680b
--- /dev/null
@@ -0,0 +1,2 @@
+# The Default Planck Layout
+
diff --git a/keyboard/planck/keymaps/experimental/keymap.c b/keyboard/planck/keymaps/experimental/keymap.c
new file mode 100644 (file)
index 0000000..4b9c15e
--- /dev/null
@@ -0,0 +1,333 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "planck.h"
+#include "action_layer.h"
+#ifdef AUDIO_ENABLE
+  #include "audio.h"
+#endif
+
+#include "eeconfig.h"
+
+extern keymap_config_t keymap_config;
+
+// 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 _QWERTY 0
+#define _COLEMAK 1
+#define _DVORAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _PLOVER 5
+#define _ADJUST 16
+
+// Macro name shortcuts
+#define QWERTY M(_QWERTY)
+#define COLEMAK M(_COLEMAK)
+#define DVORAK M(_DVORAK)
+#define LOWER M(_LOWER)
+#define RAISE M(_RAISE)
+#define M_BL 5
+#define PLOVER M(12)
+#define EXT_PLV M(13)
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_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(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_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 },
+  {KC_LEAD, KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   "  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |  /   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   ;  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_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(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_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,S(KC_NUHS),S(KC_NUBS),_______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_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,  KC_NUHS, KC_NUHS, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Plover layer (http://opensteno.org)
+ * ,-----------------------------------------------------------------------------------.
+ * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Exit |      |      |   A  |   O  |             |   E  |   U  |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+
+[_PLOVER] = {
+  {KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1   },
+  {XXXXXXX, KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC},
+  {XXXXXXX, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
+  {EXT_PLV, XXXXXXX, XXXXXXX, KC_C,    KC_V,    XXXXXXX, XXXXXXX, KC_N,    KC_M,    XXXXXXX, XXXXXXX, XXXXXXX}
+},
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover|      |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |Voice-|Voice+|Mus on|Musoff|      |      |      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = {
+  {_______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
+  {_______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  PLOVER,  _______},
+  {_______, MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
+}
+
+
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+#ifdef AUDIO_ENABLE
+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_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 goodbye[][2] = SONG(GOODBYE_SOUND);
+#endif
+
+
+void persistant_default_layer_set(uint16_t default_layer) {
+  eeconfig_update_default_layer(default_layer);
+  default_layer_set(default_layer);
+}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+      switch(id) {
+        case _QWERTY:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+            #endif
+            persistant_default_layer_set(1UL<<_QWERTY);
+          }
+          break;
+        case _COLEMAK:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+            #endif
+            persistant_default_layer_set(1UL<<_COLEMAK);
+          }
+          break;
+        case _DVORAK:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+            #endif
+            persistant_default_layer_set(1UL<<_DVORAK);
+          }
+          break;
+        case _LOWER:
+          if (record->event.pressed) {
+            layer_on(_LOWER);
+            #ifdef BACKLIGHT_ENABLE
+                breathing_speed_set(2);
+                breathing_pulse();
+            #endif
+            update_tri_layer(_LOWER, _RAISE, _ADJUST);
+          } else {
+            layer_off(_LOWER);
+            update_tri_layer(_LOWER, _RAISE, _ADJUST);
+          }
+          break;
+        case _RAISE:
+          if (record->event.pressed) {
+            layer_on(_RAISE);
+            #ifdef BACKLIGHT_ENABLE
+                breathing_speed_set(2);
+                breathing_pulse();
+            #endif
+            update_tri_layer(_LOWER, _RAISE, _ADJUST);
+          } else {
+            layer_off(_RAISE);
+            update_tri_layer(_LOWER, _RAISE, _ADJUST);
+          }
+          break;
+        case M_BL:
+          if (record->event.pressed) {
+            register_code(KC_RSFT);
+            #ifdef BACKLIGHT_ENABLE
+              backlight_step();
+            #endif
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+        case 12:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              stop_all_notes();
+              PLAY_NOTE_ARRAY(tone_plover, false, 0);
+            #endif
+            layer_off(_RAISE);
+            layer_off(_LOWER);
+            layer_off(_ADJUST);
+            layer_on(_PLOVER);
+            if (!eeconfig_is_enabled()) {
+                eeconfig_init();
+            }
+            keymap_config.raw = eeconfig_read_keymap();
+            keymap_config.nkro = 1;
+            eeconfig_update_keymap(keymap_config.raw);
+          }
+        break;
+        case 13:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              PLAY_NOTE_ARRAY(tone_plover_gb, false, 0);
+            #endif
+            layer_off(_PLOVER);
+          }
+        break;
+
+      }
+    return MACRO_NONE;
+};
+
+void matrix_init_user(void) {
+  #ifdef AUDIO_ENABLE
+    _delay_ms(20); // stops the tick
+    PLAY_NOTE_ARRAY(tone_startup, false, 0);
+  #endif
+}
+
+#ifdef AUDIO_ENABLE
+  void play_goodbye_tone(void)
+  {
+    PLAY_NOTE_ARRAY(goodbye, false, 0);
+    _delay_ms(150);
+  }
+#endif
+
+LEADER_EXTERNS();
+
+#define LEADER_TIMEOUT 300
+
+void matrix_scan_user(void) {
+  LEADER_DICTIONARY() { 
+    leading = false;
+    leader_end(); 
+
+    SEQ_ONE_KEY(KC_F) {
+      register_code(KC_S);
+      unregister_code(KC_S);
+    }
+    SEQ_TWO_KEYS(KC_A, KC_S) {
+      register_code(KC_H);
+      unregister_code(KC_H);
+    }
+    SEQ_THREE_KEYS(KC_A, KC_S, KC_D) {
+      register_code(KC_LGUI);
+      register_code(KC_S);
+      unregister_code(KC_S);
+      unregister_code(KC_LGUI);
+    }
+  }
+}
diff --git a/keyboard/planck/keymaps/experimental/makefile.mk b/keyboard/planck/keymaps/experimental/makefile.mk
new file mode 100644 (file)
index 0000000..6c1e05b
--- /dev/null
@@ -0,0 +1,5 @@
+AUDIO_ENABLE = yes
+NKRO_ENABLE = yes
+MIDI_ENABLE = yes
+BACKLIGHT_ENABLE = no
+COMMAND_ENABLE = no
\ No newline at end of file
diff --git a/keyboard/planck/keymaps/gabriel.c b/keyboard/planck/keymaps/gabriel.c
deleted file mode 100644 (file)
index 8054844..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-#include "planck.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 _LW 1
-#define _RS 2
-#define _FN 3
-
-// This a slightly modified 'default' keymap that's closer to the Mac keyboard layout. I like the position
-// of 'esc' and 'tab' better this way. I also got rid of the backlighting control key and the dvorak and
-// colemak layers. I added an 'fn' layer that makes the 'bspc' a forward delete (like on OSX).
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-/* MIT Layout (QWERTY layer)
- *
- * ,-----------------------------------------------------------------------.
- * | esc |  q  |  w  |  e  |  r  |  t  |  y  |  u  |  i  |  o  |  p  | bspc|
- * |-----------------------------------------------------------------------|
- * | tab |  a  |  s  |  d  |  f  |  g  |  h  |  j  |  k  |  l  |  ;  |  '  |
- * |-----------------------------------------------------------------------|
- * |shift|  z  |  x  |  c  |  v  |  b  |  n  |  m  |  ,  |  .  |  /  |enter|
- * |-----------------------------------------------------------------------|
- * | fn  | ctl | alt | cmd |lower|    spc    |raise|left |down | up  |right|
- * `-----------------------------------------------------------------------'
- */
-[_QW] = { /* QWERTY */
-  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
-  {KC_TAB,  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 },
-  {MO(_FN), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
-},
-/* MIT Layout (Raised layer)
- *
- * ,-----------------------------------------------------------------------.
- * |  `  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  0  |     |
- * |-----------------------------------------------------------------------|
- * |     | F1  | F2  | F3  | F4  | F5  | F6  |  -  |  +  |  [  |  ]  |  |  |
- * |-----------------------------------------------------------------------|
- * |     | F7  | F8  | F9  | F10 | F11 | F12 |     |     |     |     |     |
- * |-----------------------------------------------------------------------|
- * |     |     |     |     |     |           |     |     |     |     |     |
- * `-----------------------------------------------------------------------'
- */
-[_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_PLUS, KC_LBRC, KC_RBRC, KC_PIPE},
-  {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  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, KC_TRNS}
-},
-/* MIT Layout (Lowered layer)
- *
- * ,-----------------------------------------------------------------------.
- * |  ~  |  !  |  @  |  #  |  $  |  %  |  ^  |  &  |  *  |  (  |  )  |     |
- * |-----------------------------------------------------------------------|
- * |     | F1  | F2  | F3  | F4  | F5  | F6  |  _  |  =  |  {  |  }  |  \  |
- * |-----------------------------------------------------------------------|
- * |     | F7  | F8  | F9  | F10 | F11 | F12 |     |     |     |     |     |
- * |-----------------------------------------------------------------------|
- * |     |     |     |     |     |           |     |     |     |     |     |
- * `-----------------------------------------------------------------------'
- */
-[_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_EQL,  KC_LCBR, KC_RCBR, KC_BSLS},
-  {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  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, KC_TRNS}
-},
-/* MIT Layout (FN layer)
- *
- * ,-----------------------------------------------------------------------.
- * |     |     |     |     |     |     |     |     |     |     |     | del |
- * |-----------------------------------------------------------------------|
- * |     |     |     |     |     |     |     |     |     |     |     |     |
- * |-----------------------------------------------------------------------|
- * |     |     |     |     |     |     |     |     |     |     |     |     |
- * |-----------------------------------------------------------------------|
- * |     |     |     |     |     |           |     |home |pgdn |pgup | end |
- * `-----------------------------------------------------------------------'
- */
-[_FN] = { /* FUNCTION */
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DELT},
-  {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_HOME, KC_PGDN, KC_PGUP, KC_END}
-}
-};
-
-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);
-            backlight_step();
-          } else {
-            unregister_code(KC_RSFT);
-          }
-        break;
-      }
-    return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/gabriel/gabriel.c b/keyboard/planck/keymaps/gabriel/gabriel.c
new file mode 100644 (file)
index 0000000..8054844
--- /dev/null
@@ -0,0 +1,108 @@
+#include "planck.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 _LW 1
+#define _RS 2
+#define _FN 3
+
+// This a slightly modified 'default' keymap that's closer to the Mac keyboard layout. I like the position
+// of 'esc' and 'tab' better this way. I also got rid of the backlighting control key and the dvorak and
+// colemak layers. I added an 'fn' layer that makes the 'bspc' a forward delete (like on OSX).
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* MIT Layout (QWERTY layer)
+ *
+ * ,-----------------------------------------------------------------------.
+ * | esc |  q  |  w  |  e  |  r  |  t  |  y  |  u  |  i  |  o  |  p  | bspc|
+ * |-----------------------------------------------------------------------|
+ * | tab |  a  |  s  |  d  |  f  |  g  |  h  |  j  |  k  |  l  |  ;  |  '  |
+ * |-----------------------------------------------------------------------|
+ * |shift|  z  |  x  |  c  |  v  |  b  |  n  |  m  |  ,  |  .  |  /  |enter|
+ * |-----------------------------------------------------------------------|
+ * | fn  | ctl | alt | cmd |lower|    spc    |raise|left |down | up  |right|
+ * `-----------------------------------------------------------------------'
+ */
+[_QW] = { /* QWERTY */
+  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
+  {KC_TAB,  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 },
+  {MO(_FN), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+/* MIT Layout (Raised layer)
+ *
+ * ,-----------------------------------------------------------------------.
+ * |  `  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  0  |     |
+ * |-----------------------------------------------------------------------|
+ * |     | F1  | F2  | F3  | F4  | F5  | F6  |  -  |  +  |  [  |  ]  |  |  |
+ * |-----------------------------------------------------------------------|
+ * |     | F7  | F8  | F9  | F10 | F11 | F12 |     |     |     |     |     |
+ * |-----------------------------------------------------------------------|
+ * |     |     |     |     |     |           |     |     |     |     |     |
+ * `-----------------------------------------------------------------------'
+ */
+[_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_PLUS, KC_LBRC, KC_RBRC, KC_PIPE},
+  {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  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, KC_TRNS}
+},
+/* MIT Layout (Lowered layer)
+ *
+ * ,-----------------------------------------------------------------------.
+ * |  ~  |  !  |  @  |  #  |  $  |  %  |  ^  |  &  |  *  |  (  |  )  |     |
+ * |-----------------------------------------------------------------------|
+ * |     | F1  | F2  | F3  | F4  | F5  | F6  |  _  |  =  |  {  |  }  |  \  |
+ * |-----------------------------------------------------------------------|
+ * |     | F7  | F8  | F9  | F10 | F11 | F12 |     |     |     |     |     |
+ * |-----------------------------------------------------------------------|
+ * |     |     |     |     |     |           |     |     |     |     |     |
+ * `-----------------------------------------------------------------------'
+ */
+[_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_EQL,  KC_LCBR, KC_RCBR, KC_BSLS},
+  {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  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, KC_TRNS}
+},
+/* MIT Layout (FN layer)
+ *
+ * ,-----------------------------------------------------------------------.
+ * |     |     |     |     |     |     |     |     |     |     |     | del |
+ * |-----------------------------------------------------------------------|
+ * |     |     |     |     |     |     |     |     |     |     |     |     |
+ * |-----------------------------------------------------------------------|
+ * |     |     |     |     |     |     |     |     |     |     |     |     |
+ * |-----------------------------------------------------------------------|
+ * |     |     |     |     |     |           |     |home |pgdn |pgup | end |
+ * `-----------------------------------------------------------------------'
+ */
+[_FN] = { /* FUNCTION */
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DELT},
+  {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_HOME, KC_PGDN, KC_PGUP, KC_END}
+}
+};
+
+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);
+            backlight_step();
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+      }
+    return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/jacob/Keyboard Layout.PNG b/keyboard/planck/keymaps/jacob/Keyboard Layout.PNG
new file mode 100644 (file)
index 0000000..40f0b89
Binary files /dev/null and b/keyboard/planck/keymaps/jacob/Keyboard Layout.PNG differ
diff --git a/keyboard/planck/keymaps/jacob/keymap.c b/keyboard/planck/keymaps/jacob/keymap.c
new file mode 100644 (file)
index 0000000..5e6e849
--- /dev/null
@@ -0,0 +1,56 @@
+#include "planck.h"
+#include "action_layer.h"
+#ifdef BACKLIGHT_ENABLE
+  #include "backlight.h"
+#endif
+
+//Simple Keymap where CTRL, WINKEY, and ALT keys are placed in a more familiar location for Windows users. 
+//Focus of this particular keymap is to enable easy transition from more traditional keyboards to OLKB Planck.
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+#define _QW 0
+#define _LW 1
+#define _RS 2
+
+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, MT(MOD_RSFT, KC_ENT)},
+    {KC_LCTL, KC_LGUI, KC_LALT, M(0),   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_DEL },
+    {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,  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}
+  },
+  [_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_DEL },
+    {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+    {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, 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[] = {
+
+};
+
+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);
+        #ifdef BACKLIGHT_ENABLE
+          backlight_step();
+        #endif
+      } else {
+        unregister_code(KC_RSFT);
+      }
+      break;
+  }
+  return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/jacob/readme.md b/keyboard/planck/keymaps/jacob/readme.md
new file mode 100644 (file)
index 0000000..2a4be4e
--- /dev/null
@@ -0,0 +1 @@
+Focus of this particular keymap is to enable easy transition from more traditional keyboards to OLKB Planck.
\ No newline at end of file
diff --git a/keyboard/planck/keymaps/joe.c b/keyboard/planck/keymaps/joe.c
deleted file mode 100644 (file)
index 5b7bbe2..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-#include "keymap_common.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-  [0] = { /* Joe colemak */
-    {F(3),    KC_Q,    KC_W,    KC_F,    KC_P, KC_G,   KC_J,   KC_L, KC_U,    KC_Y,    KC_SCLN, KC_MINS},
-    {KC_BSPC, KC_A,    KC_R,    KC_S,    KC_T, KC_D,   KC_H,   KC_N, KC_E,    KC_I,    KC_O,    KC_ENT },
-    {F(15),   KC_Z,    KC_X,    KC_C,    KC_V, KC_B,   KC_K,   KC_M, KC_COMM, KC_DOT,  KC_UP,   KC_QUOT},
-    {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT}
-  },
-  [1] = { /* Joe soft Colemak */
-    {F(3),    CM_Q,    CM_W,    CM_F,    CM_P, CM_G,   CM_J,   CM_L, CM_U,    CM_Y,    CM_SCLN, KC_MINS},
-    {KC_BSPC, CM_A,    CM_R,    CM_S,    CM_T, CM_D,   CM_H,   CM_N, CM_E,    CM_I,    CM_O,    KC_ENT },
-    {F(15),   CM_Z,    CM_X,    CM_C,    CM_V, CM_B,   CM_K,   CM_M, KC_COMM, KC_DOT,  KC_UP,   KC_QUOT},
-    {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT}
-  },
-  [2] = { /* Joe NUMPAD */
-    {F(3),    KC_NO,   KC_UP,   KC_NO,   KC_NO, KC_NO,   LSFT(KC_9), LSFT(KC_0), KC_PSLS, KC_P7, KC_P8,   KC_P9  },
-    {KC_BSPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO,   LSFT(KC_5), KC_PEQL,    KC_PAST, KC_P4, KC_P5,   KC_P6  },
-    {F(15),   KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO,   KC_NO,      KC_PCMM,    KC_PMNS, KC_P1, KC_P2,   KC_P3  },
-    {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1),  KC_TRNS, KC_TRNS,    F(2),       KC_PPLS, KC_P0, KC_PDOT, KC_PENT}
-  },
-  [3] = { /* Joe 1337 haxOr5*/
-    {F(3),    KC_Q,    KC_W,    KC_F,    KC_P, KC_6,   KC_J,   KC_L, KC_U,    KC_Y,    KC_SCLN, KC_MINS},
-    {KC_BSPC, KC_4,    KC_R,    KC_5,    KC_7, KC_D,   KC_H,   KC_N, KC_3,    KC_1,    KC_0,    KC_ENT },
-    {F(15),   KC_Z,    KC_X,    KC_C,    KC_V, KC_B,   KC_K,   KC_M, KC_COMM, KC_DOT,  KC_UP,   KC_QUOT},
-    {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT}
-  },
-  [4] = { /* Joe LOWER fn1 */
-    {KC_GRV,  KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO,   KC_NO,   KC_NO, M(3),    M(2),    M(1),    M(0)   },
-    {KC_BSPC, KC_1,    KC_2,    KC_3,    KC_4,  KC_5,    KC_6,    KC_7,  KC_8,    KC_9,    KC_0,    KC_TRNS},
-    {KC_BSLS, KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO,   KC_NO,   KC_NO, KC_LBRC, KC_RBRC, KC_PGUP, KC_EQL },
-    {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1),  KC_TRNS, KC_TRNS, F(2),  KC_NO,   KC_HOME, KC_PGDN, KC_END }
-  },
-  [5] = { /* Joe UPPER fn2 */
-    {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_DEL,  KC_BTN1, KC_MS_U, KC_BTN2, KC_BTN3, KC_WH_U, KC_BTN4, KC_LEFT, KC_DOWN, KC_UP,               KC_RGHT,             KC_NO              },
-    {KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_L, KC_WH_D, KC_WH_R, KC_NO,   KC_NO,   LCTL(KC_PGUP),       LCTL(LALT(KC_UP)),   LCTL(KC_PGDN)      },
-    {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1),    KC_NO,   KC_NO,   F(2),    KC_NO,   LCTL(LALT(KC_LEFT)), LCTL(LALT(KC_DOWN)), LCTL(LALT(KC_RGHT))}
-  },
-  [6] = { /* Joe SPECIAL fn3 */
-    {KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO,   KC_NO,   KC_NO, KC_NO,    KC_NO,   KC_NO,   KC_NO           },
-    {KC_NO,   KC_MPLY, KC_MPRV, KC_MNXT, KC_NO, KC_NO,   KC_NO,   KC_NO, KC_NO,    KC_NO,   KC_NO,   RESET           },
-    {KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO,   KC_NO,   KC_NO, KC_NO,    KC_NO,   KC_NO,   KC_NO           },
-    {F(6),    F(7),    F(8),    F(9),   F(1),  KC_TRNS, KC_TRNS, F(2),  KC_POWER, KC_WAKE, KC_SLEP, LCTL(LALT(KC_L))}
-  }
-};
-
-const uint16_t PROGMEM fn_actions[] = {
-    [1] = ACTION_LAYER_MOMENTARY(4),  // fn1
-    [2] = ACTION_LAYER_MOMENTARY(5),  // fn2
-
-    /* ESC on tap, fn3 on hold */
-    [3] = ACTION_LAYER_TAP_KEY(6, KC_ESC),
-
-    /* toggle layers */
-    [6]  = ACTION_DEFAULT_LAYER_SET(0), 
-    [7]  = ACTION_DEFAULT_LAYER_SET(1),
-    [8]  = ACTION_DEFAULT_LAYER_SET(2),
-    [9]  = ACTION_DEFAULT_LAYER_SET(3),
-
-    /* tab on tap, shift on hold */
-    [15] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB),
-};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-    switch (id) {
-        case 0:
-            /* :) */
-            return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_SCLN), TYPE(KC_0), UP(KC_LSFT), END );
-            break;
-        case 1:
-            /* :( */
-            return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_SCLN), TYPE(KC_9), UP(KC_LSFT), END );
-            break;
-        case 2:
-            /* (: | :) */
-            return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_9), TYPE(KC_SCLN), TYPE(KC_SPC), TYPE(KC_SPC), TYPE(KC_SCLN), TYPE(KC_0), UP(KC_LSFT), TYPE(KC_LEFT), TYPE(KC_LEFT), TYPE(KC_LEFT), END );
-            break;
-        case 3:
-            /* :( | ): */
-            return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_SCLN), TYPE(KC_9), TYPE(KC_SPC), TYPE(KC_SPC), TYPE(KC_0), TYPE(KC_SCLN), UP(KC_LSFT), TYPE(KC_LEFT), TYPE(KC_LEFT), TYPE(KC_LEFT), END );
-            break;
-        default:
-            break;
-    }
-    return MACRO_NONE;
-}
diff --git a/keyboard/planck/keymaps/joe/joe.c b/keyboard/planck/keymaps/joe/joe.c
new file mode 100644 (file)
index 0000000..5b7bbe2
--- /dev/null
@@ -0,0 +1,88 @@
+#include "keymap_common.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  [0] = { /* Joe colemak */
+    {F(3),    KC_Q,    KC_W,    KC_F,    KC_P, KC_G,   KC_J,   KC_L, KC_U,    KC_Y,    KC_SCLN, KC_MINS},
+    {KC_BSPC, KC_A,    KC_R,    KC_S,    KC_T, KC_D,   KC_H,   KC_N, KC_E,    KC_I,    KC_O,    KC_ENT },
+    {F(15),   KC_Z,    KC_X,    KC_C,    KC_V, KC_B,   KC_K,   KC_M, KC_COMM, KC_DOT,  KC_UP,   KC_QUOT},
+    {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT}
+  },
+  [1] = { /* Joe soft Colemak */
+    {F(3),    CM_Q,    CM_W,    CM_F,    CM_P, CM_G,   CM_J,   CM_L, CM_U,    CM_Y,    CM_SCLN, KC_MINS},
+    {KC_BSPC, CM_A,    CM_R,    CM_S,    CM_T, CM_D,   CM_H,   CM_N, CM_E,    CM_I,    CM_O,    KC_ENT },
+    {F(15),   CM_Z,    CM_X,    CM_C,    CM_V, CM_B,   CM_K,   CM_M, KC_COMM, KC_DOT,  KC_UP,   KC_QUOT},
+    {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT}
+  },
+  [2] = { /* Joe NUMPAD */
+    {F(3),    KC_NO,   KC_UP,   KC_NO,   KC_NO, KC_NO,   LSFT(KC_9), LSFT(KC_0), KC_PSLS, KC_P7, KC_P8,   KC_P9  },
+    {KC_BSPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO,   LSFT(KC_5), KC_PEQL,    KC_PAST, KC_P4, KC_P5,   KC_P6  },
+    {F(15),   KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO,   KC_NO,      KC_PCMM,    KC_PMNS, KC_P1, KC_P2,   KC_P3  },
+    {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1),  KC_TRNS, KC_TRNS,    F(2),       KC_PPLS, KC_P0, KC_PDOT, KC_PENT}
+  },
+  [3] = { /* Joe 1337 haxOr5*/
+    {F(3),    KC_Q,    KC_W,    KC_F,    KC_P, KC_6,   KC_J,   KC_L, KC_U,    KC_Y,    KC_SCLN, KC_MINS},
+    {KC_BSPC, KC_4,    KC_R,    KC_5,    KC_7, KC_D,   KC_H,   KC_N, KC_3,    KC_1,    KC_0,    KC_ENT },
+    {F(15),   KC_Z,    KC_X,    KC_C,    KC_V, KC_B,   KC_K,   KC_M, KC_COMM, KC_DOT,  KC_UP,   KC_QUOT},
+    {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT}
+  },
+  [4] = { /* Joe LOWER fn1 */
+    {KC_GRV,  KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO,   KC_NO,   KC_NO, M(3),    M(2),    M(1),    M(0)   },
+    {KC_BSPC, KC_1,    KC_2,    KC_3,    KC_4,  KC_5,    KC_6,    KC_7,  KC_8,    KC_9,    KC_0,    KC_TRNS},
+    {KC_BSLS, KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO,   KC_NO,   KC_NO, KC_LBRC, KC_RBRC, KC_PGUP, KC_EQL },
+    {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1),  KC_TRNS, KC_TRNS, F(2),  KC_NO,   KC_HOME, KC_PGDN, KC_END }
+  },
+  [5] = { /* Joe UPPER fn2 */
+    {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_DEL,  KC_BTN1, KC_MS_U, KC_BTN2, KC_BTN3, KC_WH_U, KC_BTN4, KC_LEFT, KC_DOWN, KC_UP,               KC_RGHT,             KC_NO              },
+    {KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_L, KC_WH_D, KC_WH_R, KC_NO,   KC_NO,   LCTL(KC_PGUP),       LCTL(LALT(KC_UP)),   LCTL(KC_PGDN)      },
+    {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1),    KC_NO,   KC_NO,   F(2),    KC_NO,   LCTL(LALT(KC_LEFT)), LCTL(LALT(KC_DOWN)), LCTL(LALT(KC_RGHT))}
+  },
+  [6] = { /* Joe SPECIAL fn3 */
+    {KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO,   KC_NO,   KC_NO, KC_NO,    KC_NO,   KC_NO,   KC_NO           },
+    {KC_NO,   KC_MPLY, KC_MPRV, KC_MNXT, KC_NO, KC_NO,   KC_NO,   KC_NO, KC_NO,    KC_NO,   KC_NO,   RESET           },
+    {KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO,   KC_NO,   KC_NO, KC_NO,    KC_NO,   KC_NO,   KC_NO           },
+    {F(6),    F(7),    F(8),    F(9),   F(1),  KC_TRNS, KC_TRNS, F(2),  KC_POWER, KC_WAKE, KC_SLEP, LCTL(LALT(KC_L))}
+  }
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_LAYER_MOMENTARY(4),  // fn1
+    [2] = ACTION_LAYER_MOMENTARY(5),  // fn2
+
+    /* ESC on tap, fn3 on hold */
+    [3] = ACTION_LAYER_TAP_KEY(6, KC_ESC),
+
+    /* toggle layers */
+    [6]  = ACTION_DEFAULT_LAYER_SET(0), 
+    [7]  = ACTION_DEFAULT_LAYER_SET(1),
+    [8]  = ACTION_DEFAULT_LAYER_SET(2),
+    [9]  = ACTION_DEFAULT_LAYER_SET(3),
+
+    /* tab on tap, shift on hold */
+    [15] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB),
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+    switch (id) {
+        case 0:
+            /* :) */
+            return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_SCLN), TYPE(KC_0), UP(KC_LSFT), END );
+            break;
+        case 1:
+            /* :( */
+            return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_SCLN), TYPE(KC_9), UP(KC_LSFT), END );
+            break;
+        case 2:
+            /* (: | :) */
+            return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_9), TYPE(KC_SCLN), TYPE(KC_SPC), TYPE(KC_SPC), TYPE(KC_SCLN), TYPE(KC_0), UP(KC_LSFT), TYPE(KC_LEFT), TYPE(KC_LEFT), TYPE(KC_LEFT), END );
+            break;
+        case 3:
+            /* :( | ): */
+            return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_SCLN), TYPE(KC_9), TYPE(KC_SPC), TYPE(KC_SPC), TYPE(KC_0), TYPE(KC_SCLN), UP(KC_LSFT), TYPE(KC_LEFT), TYPE(KC_LEFT), TYPE(KC_LEFT), END );
+            break;
+        default:
+            break;
+    }
+    return MACRO_NONE;
+}
diff --git a/keyboard/planck/keymaps/kyle.c b/keyboard/planck/keymaps/kyle.c
deleted file mode 100644 (file)
index da32b74..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-#include "keymap_common.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = { /* Qwerty */
-  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_BSPC},
-  {KC_TAB,  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},
-  {KC_RCTL, 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_ESC,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
-  {KC_TAB,  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_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
-  {KC_TRNS, KC_F11,  KC_F12,  KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20, 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 */
-  {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), LSFT(RSFT(KC_PAUSE)), LSFT(RSFT(KC_D)), 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},
-  {BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2),   KC_TRNS,   KC_TRNS,   KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
-}
-};
-
-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(T(CM_T), END);
-      break;
-    } 
-    return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/kyle/kyle.c b/keyboard/planck/keymaps/kyle/kyle.c
new file mode 100644 (file)
index 0000000..da32b74
--- /dev/null
@@ -0,0 +1,49 @@
+#include "keymap_common.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = { /* Qwerty */
+  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_BSPC},
+  {KC_TAB,  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},
+  {KC_RCTL, 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_ESC,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
+  {KC_TAB,  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_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
+  {KC_TRNS, KC_F11,  KC_F12,  KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20, 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 */
+  {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), LSFT(RSFT(KC_PAUSE)), LSFT(RSFT(KC_D)), 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},
+  {BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2),   KC_TRNS,   KC_TRNS,   KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+}
+};
+
+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(T(CM_T), END);
+      break;
+    } 
+    return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/leo.c b/keyboard/planck/keymaps/leo.c
deleted file mode 100644 (file)
index 6d66441..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#include "keymap_common.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = { /* BASE */
-  {KC_ESC,  KC_LBRC, KC_QUOT, KC_SCLN, KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC},
-  {KC_TAB,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_ENT},
-  {KC_LSFT, KC_DOT,  KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_COMM},
-  {KC_LCTL, KC_LALT, KC_LGUI, FUNC(3), FUNC(2), KC_SPC,  KC_SPC,  FUNC(1), FUNC(3), KC_RGUI, KC_RALT, KC_RCTL}
-},
-[2] = { /* RAISE */
-  {RALT(KC_RBRC),  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,  S(KC_RBRC)},
-  {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_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}
-},
-[3] = { /* LOWER */
-  {S(KC_EQL),S(KC_1),S(KC_2),S(KC_3),RALT(KC_5),S(KC_5),   S(KC_6),  S(KC_7),RALT(KC_7),RALT(KC_0),S(KC_0), KC_MINS},
-  {KC_TRNS,RALT(KC_2),S(KC_SLSH),KC_NUBS,S(KC_NUBS),RALT(KC_MINS),RALT(KC_NUBS), KC_NUHS, S(KC_8),  S(KC_9), S(KC_MINS), KC_SLSH},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS, RALT(KC_8),   RALT(KC_9),   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}
-},
-[4] = { /* META */
-  {KC_TRNS,  KC_HOME,  KC_UP,    KC_END,   KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_HOME,  KC_UP,    KC_END,   KC_TRNS,  KC_DEL},
-  {KC_TRNS,  KC_RGHT,  KC_DOWN,  KC_LEFT,  KC_PGUP,  KC_TRNS,  KC_PGUP,  KC_LEFT,  KC_DOWN,  KC_RGHT,  KC_TRNS,  KC_TRNS},
-  {KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_PGDN,  KC_TRNS,  KC_PGDN,  KC_TRNS,  KC_VOLD,  KC_VOLU,  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_MOMENTARY(2),  // to RAISE
-    [2] = ACTION_LAYER_MOMENTARY(3),  // to LOWER
-    [3] = ACTION_LAYER_MOMENTARY(4),  // to META
-
-};
-
-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(T(CM_T), END);
-      break;
-    } 
-    return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/leo/leo.c b/keyboard/planck/keymaps/leo/leo.c
new file mode 100644 (file)
index 0000000..6d66441
--- /dev/null
@@ -0,0 +1,46 @@
+#include "keymap_common.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = { /* BASE */
+  {KC_ESC,  KC_LBRC, KC_QUOT, KC_SCLN, KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC},
+  {KC_TAB,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_ENT},
+  {KC_LSFT, KC_DOT,  KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_COMM},
+  {KC_LCTL, KC_LALT, KC_LGUI, FUNC(3), FUNC(2), KC_SPC,  KC_SPC,  FUNC(1), FUNC(3), KC_RGUI, KC_RALT, KC_RCTL}
+},
+[2] = { /* RAISE */
+  {RALT(KC_RBRC),  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,  S(KC_RBRC)},
+  {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_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}
+},
+[3] = { /* LOWER */
+  {S(KC_EQL),S(KC_1),S(KC_2),S(KC_3),RALT(KC_5),S(KC_5),   S(KC_6),  S(KC_7),RALT(KC_7),RALT(KC_0),S(KC_0), KC_MINS},
+  {KC_TRNS,RALT(KC_2),S(KC_SLSH),KC_NUBS,S(KC_NUBS),RALT(KC_MINS),RALT(KC_NUBS), KC_NUHS, S(KC_8),  S(KC_9), S(KC_MINS), KC_SLSH},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,   KC_TRNS,   KC_TRNS,   KC_TRNS, RALT(KC_8),   RALT(KC_9),   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}
+},
+[4] = { /* META */
+  {KC_TRNS,  KC_HOME,  KC_UP,    KC_END,   KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_HOME,  KC_UP,    KC_END,   KC_TRNS,  KC_DEL},
+  {KC_TRNS,  KC_RGHT,  KC_DOWN,  KC_LEFT,  KC_PGUP,  KC_TRNS,  KC_PGUP,  KC_LEFT,  KC_DOWN,  KC_RGHT,  KC_TRNS,  KC_TRNS},
+  {KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_PGDN,  KC_TRNS,  KC_PGDN,  KC_TRNS,  KC_VOLD,  KC_VOLU,  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_MOMENTARY(2),  // to RAISE
+    [2] = ACTION_LAYER_MOMENTARY(3),  // to LOWER
+    [3] = ACTION_LAYER_MOMENTARY(4),  // to META
+
+};
+
+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(T(CM_T), END);
+      break;
+    } 
+    return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/lucas.c b/keyboard/planck/keymaps/lucas.c
deleted file mode 100644 (file)
index 27672e1..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-/* 
-This is the keymap of /u/deepshitgoeshere!
-Layer 1 exists so I can have the symbol positions of QWERTY while having my system in german.
-The second layer has all the german umlauts I need and with capital and small letters on the 
-same layer there is no need to press shift+lower.
-This keymap is made to work with software implemented QWERTZ.
-The "Gaming" layer is mainly customized for CS:GO.
-If you have any question about this keymap feel free to shoot me a message on reddit!
-*/
-
-#include "keymap_common.h"
-#include "keymap_extras/keymap_german.h"
-#include "backlight.h"
-#include "debug.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = { /* Colemak   
-    * ,-----------------------------------------------------------------------.
-    * | Esc | q   | w   | f   | p   | g   | j   | l   | u   | y   | ;   |  -  |
-    * |-----------------------------------------------------------------------|
-    * | BS  | a   | r   | s   | t   | d   | h   | n   | e   | i   | o   |  '  |
-    * |-----------------------------------------------------------------------|
-    * | SFT | z   | x   | c   | v   | b   | k   | m   |  ,  |  .  |  /  | Ent |
-    * |-----------------------------------------------------------------------|
-    * | CTL | GUI | Tab | ALT |Lower|   Space   |Raise|Left |Down | Up  |Right|
-    * `-----------------------------------------------------------------------'
-    */
-  {KC_ESC,  KC_Q,    KC_W,   KC_F,    KC_P, KC_G, KC_J, KC_L, KC_U,    KC_Z,    DE_SCLN, DE_MINS},
-  {KC_BSPC, KC_A,    KC_R,   KC_S,    KC_T, KC_D, KC_H, KC_N, KC_E,    KC_I,    KC_O,    DE_QUOT},
-  {M(0),    KC_Y,    KC_X,   KC_C,    KC_V, KC_B, KC_K, KC_M, DE_COMM, DE_DOT,  DE_SLSH, KC_ENT},
-  {KC_LCTL, KC_LGUI, KC_TAB, KC_LALT, F(2), F(3), F(3), F(1), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
-},
-[1] = { /* Symbols
-    * ,-----------------------------------------------------------------------.
-    * |     |     |     |     |     |     |     |     |     |     |  :  |     |
-    * |-----------------------------------------------------------------------|
-    * |     |     |     |     |     |     |     |     |     |     |     |  "  |
-    * |-----------------------------------------------------------------------|
-    * |     |     |     |     |     |     |     |     |  <  |  >  |  ?  |     |
-    * |-----------------------------------------------------------------------|
-    * |     |     |     |     |     |           |     |     |     |     |     |
-    * `-----------------------------------------------------------------------'
-    */
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_DOT,  KC_TRNS},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_DQOT},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M(1),    DE_MORE, DE_QST,  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}
-},
-[2] = { /* Raise
-    * ,-----------------------------------------------------------------------.
-    * |     |  Ä  |     |     |     |     |     |     |  Ü  |  Ö  |     |Game |
-    * |-----------------------------------------------------------------------|
-    * | Del |  ä  |     |  ß  |     |     |     |     |  ü  |  ö  |     |FVol+|
-    * |-----------------------------------------------------------------------|
-    * |     |     |     |     |     |     |     |     |Stop | Prv | Nxt |FVol-|
-    * |-----------------------------------------------------------------------|
-    * |LCTL |LGUI | Tab |LALT |Lower|   Space   |     |Mute |Vol- |Vol+ | P/P |
-    * `-----------------------------------------------------------------------'
-    */
-  {KC_NO,   S(DE_AE), KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,    KC_NO,   S(DE_UE), S(DE_OE), KC_NO,   F(4)},
-  {KC_DEL,  DE_AE,    KC_NO,   DE_SS,   KC_NO,   KC_NO,   KC_NO,    KC_NO,   DE_UE,    DE_OE,    KC_NO,   RALT(KC_F12)},
-  {KC_NO,   KC_NO,    KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,    KC_NO,   KC_MSTP,  KC_MPRV,  KC_MNXT, RALT(KC_F11)},
-  {KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_MUTE,  KC_VOLD,  KC_VOLU, KC_MPLY}
-},
-[3] = { /* Lower 
-    * ,-----------------------------------------------------------------------.
-    * |  ~  |  !  |  @  |  #  |  $  |  %  |  ^  |  &  |  *  |  (  |  )  |  +  |
-    * |-----------------------------------------------------------------------| 
-    * |  `  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  0  |  =  |
-    * |-----------------------------------------------------------------------|
-    * |     |     |     |  |  |  [  |  ]  |  {  |  }  |  €  |     |  \  | Ent |
-    * |-----------------------------------------------------------------------|
-    * |LCTL |LGUI | Tab |LALT |     |   Space   |Raise|Home |PgDn |PgUp | End |
-    * `-----------------------------------------------------------------------'
-    */
-  {DE_TILD, DE_EXLM, DE_AT,   DE_HASH, DE_DLR,  DE_PERC, DE_CIRC,  DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, DE_PLUS},
-  {DE_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,     KC_7,    KC_8,    KC_9,    KC_0,    DE_EQL},
-  {KC_NO,   KC_NO,   KC_NO,   DE_PIPE, DE_LBRC, DE_RBRC, DE_LCBR,  DE_RCBR, DE_EURO, KC_NO,   DE_BSLS, KC_ENT},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END}
-},
-[4] = { /* Function
-    * ,-----------------------------------------------------------------------.
-    * | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | F21 | F22 | F23 | F24 |
-    * |-----------------------------------------------------------------------|
-    * | F1  | F2  | F3  | F4  | F5  | F6  | F7  | F8  | F9  | F10 | F11 | F12 |
-    * |-----------------------------------------------------------------------|
-    * |     |     |     |     |     | KP- | KP+ |     |     |     |     |Reset| 
-    * |-----------------------------------------------------------------------|
-    * |     |Light|BL DN|BL UP|     |     |     |     |Mute |Vol- |Vol+ | P/P | 
-    * `-----------------------------------------------------------------------'
-    */
-  {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_F1,  KC_F2,   KC_F3,  KC_F4,  KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12},
-  {KC_NO,  KC_NO,   KC_NO,  KC_NO,  KC_NO,   KC_PMNS, KC_PPLS, KC_NO,   KC_NO,   KC_NO,   RESET,   KC_NO},
-  {KC_NO,  BL_TOGG, BL_DEC, BL_INC, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY}
-},
-[5] = { /* Gaming
-    * ,-----------------------------------------------------------------------.
-    * | Buy | ESC | q   | w   | e   | r   | t   | y   | u   | i   | o   |  p  |
-    * |-----------------------------------------------------------------------|
-    * | ENT | BS  | a   | s   | d   | f   | g   | h   | j   | k   | l   |  ;  |
-    * |-----------------------------------------------------------------------|
-    * | CTL | SFT | z   | x   | c   | v   | b   | n   |  m  |  ,  | Up  |  /  |
-    * |-----------------------------------------------------------------------|
-    * |     |     | Tab | ALT |     |   Space   |CrJmp| GUI |Left |Down |Right|
-    * `-----------------------------------------------------------------------'
-    */
-  {MO(6),   KC_ESC,  KC_Q,   KC_W,    KC_E,  KC_R,   KC_T,   KC_Z,         KC_U,    KC_I,    KC_O,    F(4)},
-  {KC_ENT,  KC_BSPC, KC_A,   KC_S,    KC_D,  KC_F,   KC_G,   KC_H,         KC_J,    KC_K,    KC_L,    DE_SCLN},
-  {KC_LCTL, KC_LSFT, KC_Y,   KC_X,    KC_C,  KC_V,   KC_B,   KC_N,         KC_M,    DE_DOT,  KC_UP,   DE_SLSH},
-  {KC_NO,   KC_NO,   KC_TAB, KC_LALT, KC_NO, KC_SPC, KC_SPC, LCTL(KC_SPC), KC_LGUI, KC_LEFT, KC_DOWN, KC_RGHT}
-},
-[6] = { /* Gaming 
-        /* CS:GO buy binds
-    * ,-----------------------------------------------------------------------.
-    * |     |     |     |     |     |     |     |     |  7  |  8  |  9  |     |
-    * |-----------------------------------------------------------------------|
-    * | BS  |     |     |     |     |     |     |     |  6  |  5  |  4  | End |
-    * |-----------------------------------------------------------------------|
-    * | CTL | SFT |     |     |     |     |     |     |  1  |  2  |  3  |Pgdn |
-    * |-----------------------------------------------------------------------|
-    * |     |     | Tab | ALT |     |   Space   |CrJmp|     |  0  | KP+ |PEnt |
-    * `-----------------------------------------------------------------------'
-    */
-  {KC_TRNS, KC_NO,   KC_Q,   KC_W,    KC_F,  KC_P,   KC_G,   KC_J,         KC_P7, KC_P8, KC_P9,   KC_NO},
-  {KC_BSPC, KC_NO,   KC_A,   KC_R,    KC_S,  KC_T,   KC_D,   KC_H,         KC_P4, KC_P5, KC_P6,   KC_END},
-  {KC_LCTL, KC_LSFT, KC_Y,   KC_X,    KC_C,  KC_V,   KC_B,   KC_K,         KC_P1, KC_P2, KC_P3,   KC_PGDN},
-  {KC_NO,   KC_NO,   KC_TAB, KC_LALT, KC_NO, KC_SPC, KC_SPC, LCTL(KC_SPC), KC_NO, KC_P0, KC_PDOT, KC_PENT}
-},
-};
-
-const uint16_t PROGMEM fn_actions[] = {
-    [1] = ACTION_LAYER_MOMENTARY(2),              // to RAISE
-    [2] = ACTION_LAYER_MOMENTARY(3),              // to LOWER
-    [3] = ACTION_LAYER_TAP_KEY(4,KC_SPC),         // to Function
-    [4] = ACTION_LAYER_TOGGLE(5),                 // toggle Gaming
-       [5] = ACTION_MODS_TAP_KEY(KC_LSFT, KC_CAPS),  //Shift on press, Caps on tap
-};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) 
-{
-  switch(id) {
-    case 0: // M(0)
-        if (record->event.pressed) {
-            register_code(KC_LSFT);
-            layer_on(1);
-        } else {
-            layer_off(1);
-            unregister_code(KC_LSFT);
-        }
-        break;       
-    case 1: // M(1)
-        if (record->event.pressed) {
-            unregister_code(KC_LSFT);
-            register_code(DE_MORE);
-        } else {
-            unregister_code(DE_MORE);
-        }
-        break;    
-  }
-  return MACRO_NONE;
-
-};          
\ No newline at end of file
diff --git a/keyboard/planck/keymaps/lucas/lucas.c b/keyboard/planck/keymaps/lucas/lucas.c
new file mode 100644 (file)
index 0000000..27672e1
--- /dev/null
@@ -0,0 +1,163 @@
+/* 
+This is the keymap of /u/deepshitgoeshere!
+Layer 1 exists so I can have the symbol positions of QWERTY while having my system in german.
+The second layer has all the german umlauts I need and with capital and small letters on the 
+same layer there is no need to press shift+lower.
+This keymap is made to work with software implemented QWERTZ.
+The "Gaming" layer is mainly customized for CS:GO.
+If you have any question about this keymap feel free to shoot me a message on reddit!
+*/
+
+#include "keymap_common.h"
+#include "keymap_extras/keymap_german.h"
+#include "backlight.h"
+#include "debug.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = { /* Colemak   
+    * ,-----------------------------------------------------------------------.
+    * | Esc | q   | w   | f   | p   | g   | j   | l   | u   | y   | ;   |  -  |
+    * |-----------------------------------------------------------------------|
+    * | BS  | a   | r   | s   | t   | d   | h   | n   | e   | i   | o   |  '  |
+    * |-----------------------------------------------------------------------|
+    * | SFT | z   | x   | c   | v   | b   | k   | m   |  ,  |  .  |  /  | Ent |
+    * |-----------------------------------------------------------------------|
+    * | CTL | GUI | Tab | ALT |Lower|   Space   |Raise|Left |Down | Up  |Right|
+    * `-----------------------------------------------------------------------'
+    */
+  {KC_ESC,  KC_Q,    KC_W,   KC_F,    KC_P, KC_G, KC_J, KC_L, KC_U,    KC_Z,    DE_SCLN, DE_MINS},
+  {KC_BSPC, KC_A,    KC_R,   KC_S,    KC_T, KC_D, KC_H, KC_N, KC_E,    KC_I,    KC_O,    DE_QUOT},
+  {M(0),    KC_Y,    KC_X,   KC_C,    KC_V, KC_B, KC_K, KC_M, DE_COMM, DE_DOT,  DE_SLSH, KC_ENT},
+  {KC_LCTL, KC_LGUI, KC_TAB, KC_LALT, F(2), F(3), F(3), F(1), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+[1] = { /* Symbols
+    * ,-----------------------------------------------------------------------.
+    * |     |     |     |     |     |     |     |     |     |     |  :  |     |
+    * |-----------------------------------------------------------------------|
+    * |     |     |     |     |     |     |     |     |     |     |     |  "  |
+    * |-----------------------------------------------------------------------|
+    * |     |     |     |     |     |     |     |     |  <  |  >  |  ?  |     |
+    * |-----------------------------------------------------------------------|
+    * |     |     |     |     |     |           |     |     |     |     |     |
+    * `-----------------------------------------------------------------------'
+    */
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_DOT,  KC_TRNS},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_DQOT},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M(1),    DE_MORE, DE_QST,  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}
+},
+[2] = { /* Raise
+    * ,-----------------------------------------------------------------------.
+    * |     |  Ä  |     |     |     |     |     |     |  Ü  |  Ö  |     |Game |
+    * |-----------------------------------------------------------------------|
+    * | Del |  ä  |     |  ß  |     |     |     |     |  ü  |  ö  |     |FVol+|
+    * |-----------------------------------------------------------------------|
+    * |     |     |     |     |     |     |     |     |Stop | Prv | Nxt |FVol-|
+    * |-----------------------------------------------------------------------|
+    * |LCTL |LGUI | Tab |LALT |Lower|   Space   |     |Mute |Vol- |Vol+ | P/P |
+    * `-----------------------------------------------------------------------'
+    */
+  {KC_NO,   S(DE_AE), KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,    KC_NO,   S(DE_UE), S(DE_OE), KC_NO,   F(4)},
+  {KC_DEL,  DE_AE,    KC_NO,   DE_SS,   KC_NO,   KC_NO,   KC_NO,    KC_NO,   DE_UE,    DE_OE,    KC_NO,   RALT(KC_F12)},
+  {KC_NO,   KC_NO,    KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,    KC_NO,   KC_MSTP,  KC_MPRV,  KC_MNXT, RALT(KC_F11)},
+  {KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_MUTE,  KC_VOLD,  KC_VOLU, KC_MPLY}
+},
+[3] = { /* Lower 
+    * ,-----------------------------------------------------------------------.
+    * |  ~  |  !  |  @  |  #  |  $  |  %  |  ^  |  &  |  *  |  (  |  )  |  +  |
+    * |-----------------------------------------------------------------------| 
+    * |  `  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  0  |  =  |
+    * |-----------------------------------------------------------------------|
+    * |     |     |     |  |  |  [  |  ]  |  {  |  }  |  €  |     |  \  | Ent |
+    * |-----------------------------------------------------------------------|
+    * |LCTL |LGUI | Tab |LALT |     |   Space   |Raise|Home |PgDn |PgUp | End |
+    * `-----------------------------------------------------------------------'
+    */
+  {DE_TILD, DE_EXLM, DE_AT,   DE_HASH, DE_DLR,  DE_PERC, DE_CIRC,  DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, DE_PLUS},
+  {DE_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,     KC_7,    KC_8,    KC_9,    KC_0,    DE_EQL},
+  {KC_NO,   KC_NO,   KC_NO,   DE_PIPE, DE_LBRC, DE_RBRC, DE_LCBR,  DE_RCBR, DE_EURO, KC_NO,   DE_BSLS, KC_ENT},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END}
+},
+[4] = { /* Function
+    * ,-----------------------------------------------------------------------.
+    * | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | F21 | F22 | F23 | F24 |
+    * |-----------------------------------------------------------------------|
+    * | F1  | F2  | F3  | F4  | F5  | F6  | F7  | F8  | F9  | F10 | F11 | F12 |
+    * |-----------------------------------------------------------------------|
+    * |     |     |     |     |     | KP- | KP+ |     |     |     |     |Reset| 
+    * |-----------------------------------------------------------------------|
+    * |     |Light|BL DN|BL UP|     |     |     |     |Mute |Vol- |Vol+ | P/P | 
+    * `-----------------------------------------------------------------------'
+    */
+  {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_F1,  KC_F2,   KC_F3,  KC_F4,  KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12},
+  {KC_NO,  KC_NO,   KC_NO,  KC_NO,  KC_NO,   KC_PMNS, KC_PPLS, KC_NO,   KC_NO,   KC_NO,   RESET,   KC_NO},
+  {KC_NO,  BL_TOGG, BL_DEC, BL_INC, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+[5] = { /* Gaming
+    * ,-----------------------------------------------------------------------.
+    * | Buy | ESC | q   | w   | e   | r   | t   | y   | u   | i   | o   |  p  |
+    * |-----------------------------------------------------------------------|
+    * | ENT | BS  | a   | s   | d   | f   | g   | h   | j   | k   | l   |  ;  |
+    * |-----------------------------------------------------------------------|
+    * | CTL | SFT | z   | x   | c   | v   | b   | n   |  m  |  ,  | Up  |  /  |
+    * |-----------------------------------------------------------------------|
+    * |     |     | Tab | ALT |     |   Space   |CrJmp| GUI |Left |Down |Right|
+    * `-----------------------------------------------------------------------'
+    */
+  {MO(6),   KC_ESC,  KC_Q,   KC_W,    KC_E,  KC_R,   KC_T,   KC_Z,         KC_U,    KC_I,    KC_O,    F(4)},
+  {KC_ENT,  KC_BSPC, KC_A,   KC_S,    KC_D,  KC_F,   KC_G,   KC_H,         KC_J,    KC_K,    KC_L,    DE_SCLN},
+  {KC_LCTL, KC_LSFT, KC_Y,   KC_X,    KC_C,  KC_V,   KC_B,   KC_N,         KC_M,    DE_DOT,  KC_UP,   DE_SLSH},
+  {KC_NO,   KC_NO,   KC_TAB, KC_LALT, KC_NO, KC_SPC, KC_SPC, LCTL(KC_SPC), KC_LGUI, KC_LEFT, KC_DOWN, KC_RGHT}
+},
+[6] = { /* Gaming 
+        /* CS:GO buy binds
+    * ,-----------------------------------------------------------------------.
+    * |     |     |     |     |     |     |     |     |  7  |  8  |  9  |     |
+    * |-----------------------------------------------------------------------|
+    * | BS  |     |     |     |     |     |     |     |  6  |  5  |  4  | End |
+    * |-----------------------------------------------------------------------|
+    * | CTL | SFT |     |     |     |     |     |     |  1  |  2  |  3  |Pgdn |
+    * |-----------------------------------------------------------------------|
+    * |     |     | Tab | ALT |     |   Space   |CrJmp|     |  0  | KP+ |PEnt |
+    * `-----------------------------------------------------------------------'
+    */
+  {KC_TRNS, KC_NO,   KC_Q,   KC_W,    KC_F,  KC_P,   KC_G,   KC_J,         KC_P7, KC_P8, KC_P9,   KC_NO},
+  {KC_BSPC, KC_NO,   KC_A,   KC_R,    KC_S,  KC_T,   KC_D,   KC_H,         KC_P4, KC_P5, KC_P6,   KC_END},
+  {KC_LCTL, KC_LSFT, KC_Y,   KC_X,    KC_C,  KC_V,   KC_B,   KC_K,         KC_P1, KC_P2, KC_P3,   KC_PGDN},
+  {KC_NO,   KC_NO,   KC_TAB, KC_LALT, KC_NO, KC_SPC, KC_SPC, LCTL(KC_SPC), KC_NO, KC_P0, KC_PDOT, KC_PENT}
+},
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_LAYER_MOMENTARY(2),              // to RAISE
+    [2] = ACTION_LAYER_MOMENTARY(3),              // to LOWER
+    [3] = ACTION_LAYER_TAP_KEY(4,KC_SPC),         // to Function
+    [4] = ACTION_LAYER_TOGGLE(5),                 // toggle Gaming
+       [5] = ACTION_MODS_TAP_KEY(KC_LSFT, KC_CAPS),  //Shift on press, Caps on tap
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) 
+{
+  switch(id) {
+    case 0: // M(0)
+        if (record->event.pressed) {
+            register_code(KC_LSFT);
+            layer_on(1);
+        } else {
+            layer_off(1);
+            unregister_code(KC_LSFT);
+        }
+        break;       
+    case 1: // M(1)
+        if (record->event.pressed) {
+            unregister_code(KC_LSFT);
+            register_code(DE_MORE);
+        } else {
+            unregister_code(DE_MORE);
+        }
+        break;    
+  }
+  return MACRO_NONE;
+
+};          
\ No newline at end of file
diff --git a/keyboard/planck/keymaps/lukas.c b/keyboard/planck/keymaps/lukas.c
deleted file mode 100644 (file)
index 6fd9537..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#include "planck.h"
-#ifdef BACKLIGHT_ENABLE
-  #include "backlight.h"
-#endif
-
-// This simple keymap is optimized for xmonad users using super as their modifier key.
-// M(1) makes it possible to change virtual screens and swap windows between them.
-
-// Each layer gets a name for readability, which is then used in the keymap matrix below.
-#define _QW 0
-#define _LW 1
-#define _RS 2
-
-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 },
-    {KC_LCTL, KC_LALT, KC_LGUI, M(1), 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_DEL },
-    {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
-    {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}
-  },
-  [_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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
-    {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, 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[] = {
-
-};
-
-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);
-        #ifdef BACKLIGHT_ENABLE
-          backlight_step();
-        #endif
-      } else {
-        unregister_code(KC_RSFT);
-      }
-      break;
-    case 1:
-      if (record->event.pressed) {
-        register_code(KC_LGUI);
-        layer_on(_RS);
-      } else {
-        unregister_code(KC_LGUI);
-        layer_off(_RS);
-      }
-      break;
-  }
-  return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/lukas/lukas.c b/keyboard/planck/keymaps/lukas/lukas.c
new file mode 100644 (file)
index 0000000..6fd9537
--- /dev/null
@@ -0,0 +1,64 @@
+#include "planck.h"
+#ifdef BACKLIGHT_ENABLE
+  #include "backlight.h"
+#endif
+
+// This simple keymap is optimized for xmonad users using super as their modifier key.
+// M(1) makes it possible to change virtual screens and swap windows between them.
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+#define _QW 0
+#define _LW 1
+#define _RS 2
+
+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 },
+    {KC_LCTL, KC_LALT, KC_LGUI, M(1), 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_DEL },
+    {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
+    {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}
+  },
+  [_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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+    {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, 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[] = {
+
+};
+
+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);
+        #ifdef BACKLIGHT_ENABLE
+          backlight_step();
+        #endif
+      } else {
+        unregister_code(KC_RSFT);
+      }
+      break;
+    case 1:
+      if (record->event.pressed) {
+        register_code(KC_LGUI);
+        layer_on(_RS);
+      } else {
+        unregister_code(KC_LGUI);
+        layer_off(_RS);
+      }
+      break;
+  }
+  return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/max.c b/keyboard/planck/keymaps/max.c
deleted file mode 100644 (file)
index 7fb29bc..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-#include "keymap_common.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = { /* Qwerty */
-  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_BSPC},
-  {KC_TAB,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, 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_QUOT},
-  {KC_LCTL, BL_STEP, 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_ESC,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
-  {KC_TAB,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_ENT },
-  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_QUOT},
-  {KC_LCTL, BL_STEP, 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_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_TRNS},
-  {KC_TRNS, KC_F11,  KC_F12,  KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20, KC_BSLS},
-  {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 */
-  {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), KC_TRNS},
-  {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  S(KC_BSLS)},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2),   KC_TRNS,   KC_TRNS,   KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
-}
-};
-
-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(T(CM_T), END);
-      break;
-    } 
-    return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/max/max.c b/keyboard/planck/keymaps/max/max.c
new file mode 100644 (file)
index 0000000..7fb29bc
--- /dev/null
@@ -0,0 +1,49 @@
+#include "keymap_common.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = { /* Qwerty */
+  {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,   KC_BSPC},
+  {KC_TAB,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, 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_QUOT},
+  {KC_LCTL, BL_STEP, 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_ESC,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
+  {KC_TAB,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_ENT },
+  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_QUOT},
+  {KC_LCTL, BL_STEP, 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_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_TRNS},
+  {KC_TRNS, KC_F11,  KC_F12,  KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20, KC_BSLS},
+  {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 */
+  {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), KC_TRNS},
+  {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  S(KC_BSLS)},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2),   KC_TRNS,   KC_TRNS,   KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+}
+};
+
+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(T(CM_T), END);
+      break;
+    } 
+    return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/mollat.c b/keyboard/planck/keymaps/mollat.c
deleted file mode 100644 (file)
index e7c71ef..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-//
-// This layout is based on the following needs:
-//
-// should be as close as possible to querty/us-international layout (using international/AltGr as o/s driver)
-// added german umlauts at known places from de-layout
-// all movement keys should be at known places from vi/bash (eg HJKL for cursor keys)
-// Fn layer (at CapsLock place like the Pok3r does) for missing keys
-// additional layer for tmux window switching
-//
-// This is work in Progress! If you have suggestions write me at github.com/mollat/qmk_firmware/ and check
-// this fork for updates as I probably won't bother jack with my pull requests frequently.
-//
-
-#include "planck.h"
-
-#define _QWERTY 0
-#define _HIGH 1
-#define _LOW 2
-#define _FN 3
-#define _TMUX 4
-#define _LCTL 5
-#define _MOUSE 6
-#define __________ KC_NO // just for easy reading
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-
-[_QWERTY] = { /* Qwerty */
-  { LT(_MOUSE, KC_ESC),KC_Q,KC_W,       KC_E,       KC_R,       KC_T,       KC_Y,       KC_U,       KC_I,       KC_O,       KC_P,       KC_BSPC    },
-  { LT(_FN, KC_TAB),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,    SFT_T(KC_ENT)},
-  { __________, __________, KC_LGUI,    KC_LALT,    KC_LCTL,LT(_TMUX, KC_SPC),LT(_HIGH, KC_SPC),MO(_LOW),KC_RALT,KC_RGUI,   __________, __________ }
-},
-
-// missing keys regarding to the form factor
-// keeping the dot and comma for typing faster IP addresses and (german) float values
-// putting the backslash on the slash's place
-[_HIGH] = {
-  { KC_GRV,     KC_EXLM,    KC_AT,      KC_HASH,    KC_DLR,     KC_PERC,    KC_CIRC,    KC_AMPR,    KC_ASTR,    KC_LPRN,    KC_RPRN,    KC_MINS    },
-  { __________, KC_1,       KC_2,       KC_3,       KC_4,       KC_5,       KC_6,       KC_7,       KC_8,       KC_9,       KC_0,       KC_EQL     },
-  { __________, __________, __________, __________, __________, __________, __________, __________, KC_COMM,    KC_DOT,     KC_BSLS,    LSFT(KC_BSLS)},
-  { __________, __________, __________, __________, __________, __________, KC_TRNS,    __________, __________, __________, __________, __________ }
-},
-
-// classic Fn-Layer triggered with 'CapsLock-key' like on Pok3r
-// SPC and ENT are doubled for using repeat (which I switched off, see https://github.com/tmk/tmk_keyboard/issues/287)
-// '€' sign is on the '5' position as this is the usual AltGr place on the US Internation layout
-// home/end at the 'a' and 'e' position like in bash
-// ins at 'i'
-// del besides backspace (had no better place for it because of the umlauts)
-// pg-down at 'f' (forward in vi), pg-up at 'b' (back in 'vi')
-//
-[_FN] = {
-  { __________, __________, __________, KC_END,     __________, __________, __________, __________, KC_INS,     __________, KC_DEL,     RALT(KC_Y) },
-  { KC_TRNS,    __________, RALT(KC_S), __________, KC_PGDN,    RALT(KC_5), KC_LEFT,    KC_DOWN,    KC_UP,      KC_RGHT,    RALT(KC_P), RALT(KC_Q) },
-  { __________, KC_HOME,    __________, __________, __________, KC_PGUP,    __________, __________, __________, __________, __________, KC_ENT     },
-  { RESET,      __________, __________, __________, __________, KC_SPC,     KC_SPC,     __________, __________, __________, __________, __________ }
-},
-
-// function key layer and some shift + (missing key at the small form factor)
-[_LOW] = {
-  { KC_TILD,    __________, __________, __________, __________, __________, __________, __________, __________, KC_LCBR,    KC_RCBR,    KC_UNDS    },
-  { __________, KC_F1,      KC_F2,      KC_F3,      KC_F4,      KC_F5,      KC_F6,      KC_F7,      KC_F8,      KC_LBRC,    KC_RBRC,    KC_PLUS    },
-  { __________, __________, __________, __________, __________, KC_F9,      KC_F10,     KC_F11,     KC_F12,     __________, __________, __________ },
-  { __________, __________, __________, __________, __________, __________, __________, KC_TRNS,    __________, __________, __________, __________ }
-},
-
-// most macros will switch tmux screens
-// two macros are for vi's save/quit at 'w' and 'q'
-[_TMUX] = {
-  { __________, M(14),      M(13),      __________, __________, __________, __________, __________, __________, __________, M(11),      __________ },
-  { M(0),       M(1),       M(2),       M(3),       M(4),       M(5),       M(6),       M(7),       M(8),       M(9),       __________, __________ },
-  { __________, __________, __________, M(12),      __________, __________, M(10),      __________, __________, __________, __________, __________ },
-  { __________, __________, __________, __________, __________, KC_TRNS,    __________, __________, __________, __________, __________, __________ }
-},
-
-// mouse movement can be improved (e.g. can't press hj at once), but I will use this seldom, so I stick with hjkl keys.
-[_MOUSE] = {
-  { KC_TRNS,    __________, __________, __________, __________, __________, __________, __________, __________, __________, __________, __________ },
-  { __________, __________, __________, __________, KC_WH_D,    __________, KC_MS_L,    KC_MS_D,    KC_MS_U,    KC_MS_R,    __________, __________ },
-  { __________, __________, __________, __________, __________, KC_WH_U,    __________, __________, __________, __________, __________, __________ },
-  { __________, __________, __________, KC_ACL2,    KC_ACL1,    KC_ACL0,    KC_MS_BTN1, KC_MS_BTN3, KC_MS_BTN2, __________, __________, __________ }
-}
-};
-
-const uint16_t PROGMEM fn_actions[] = {
-    [_LCTL] = ACTION_MODS_TAP_KEY(KC_LCTL, M(12)),    // does not work
-};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-      switch(id) {
-        case 0:
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_0), END );
-          break;
-        case 1:
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_1), END );
-          break;
-        case 2:
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_2), END );
-          break;
-        case 3:
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_3), END );
-          break;
-        case 4:
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_4), END );
-          break;
-        case 5:
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_5), END );
-          break;
-        case 6:
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_6), END );
-          break;
-        case 7:
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_7), END );
-          break;
-        case 8:
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_8), END );
-          break;
-        case 9:
-          // tmux last window
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_L), END );
-          break;
-          // tmux next window
-        case 10:
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_N), END );
-          break;
-          // tmux previous window
-        case 11:
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_P), END );
-          break;
-          // tmux new window
-        case 12:
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_C), END );
-          break;
-        case 13:
-          // vi save document
-          return MACRODOWN( TYPE(KC_ESC), DOWN(KC_LSFT), TYPE(KC_SCLN), UP(KC_LSFT), TYPE(KC_W), TYPE(KC_ENT), END );
-          break;
-        case 14:
-          // vi quit
-          return MACRODOWN( TYPE(KC_ESC), DOWN(KC_LSFT), TYPE(KC_SCLN), UP(KC_LSFT), TYPE(KC_Q), TYPE(KC_ENT), END );
-          break;
-          // tmux press ctrl-b
-        case 15:
-          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), END );
-          break;
-      }
-    return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/mollat/mollat.c b/keyboard/planck/keymaps/mollat/mollat.c
new file mode 100644 (file)
index 0000000..e7c71ef
--- /dev/null
@@ -0,0 +1,149 @@
+//
+// This layout is based on the following needs:
+//
+// should be as close as possible to querty/us-international layout (using international/AltGr as o/s driver)
+// added german umlauts at known places from de-layout
+// all movement keys should be at known places from vi/bash (eg HJKL for cursor keys)
+// Fn layer (at CapsLock place like the Pok3r does) for missing keys
+// additional layer for tmux window switching
+//
+// This is work in Progress! If you have suggestions write me at github.com/mollat/qmk_firmware/ and check
+// this fork for updates as I probably won't bother jack with my pull requests frequently.
+//
+
+#include "planck.h"
+
+#define _QWERTY 0
+#define _HIGH 1
+#define _LOW 2
+#define _FN 3
+#define _TMUX 4
+#define _LCTL 5
+#define _MOUSE 6
+#define __________ KC_NO // just for easy reading
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[_QWERTY] = { /* Qwerty */
+  { LT(_MOUSE, KC_ESC),KC_Q,KC_W,       KC_E,       KC_R,       KC_T,       KC_Y,       KC_U,       KC_I,       KC_O,       KC_P,       KC_BSPC    },
+  { LT(_FN, KC_TAB),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,    SFT_T(KC_ENT)},
+  { __________, __________, KC_LGUI,    KC_LALT,    KC_LCTL,LT(_TMUX, KC_SPC),LT(_HIGH, KC_SPC),MO(_LOW),KC_RALT,KC_RGUI,   __________, __________ }
+},
+
+// missing keys regarding to the form factor
+// keeping the dot and comma for typing faster IP addresses and (german) float values
+// putting the backslash on the slash's place
+[_HIGH] = {
+  { KC_GRV,     KC_EXLM,    KC_AT,      KC_HASH,    KC_DLR,     KC_PERC,    KC_CIRC,    KC_AMPR,    KC_ASTR,    KC_LPRN,    KC_RPRN,    KC_MINS    },
+  { __________, KC_1,       KC_2,       KC_3,       KC_4,       KC_5,       KC_6,       KC_7,       KC_8,       KC_9,       KC_0,       KC_EQL     },
+  { __________, __________, __________, __________, __________, __________, __________, __________, KC_COMM,    KC_DOT,     KC_BSLS,    LSFT(KC_BSLS)},
+  { __________, __________, __________, __________, __________, __________, KC_TRNS,    __________, __________, __________, __________, __________ }
+},
+
+// classic Fn-Layer triggered with 'CapsLock-key' like on Pok3r
+// SPC and ENT are doubled for using repeat (which I switched off, see https://github.com/tmk/tmk_keyboard/issues/287)
+// '€' sign is on the '5' position as this is the usual AltGr place on the US Internation layout
+// home/end at the 'a' and 'e' position like in bash
+// ins at 'i'
+// del besides backspace (had no better place for it because of the umlauts)
+// pg-down at 'f' (forward in vi), pg-up at 'b' (back in 'vi')
+//
+[_FN] = {
+  { __________, __________, __________, KC_END,     __________, __________, __________, __________, KC_INS,     __________, KC_DEL,     RALT(KC_Y) },
+  { KC_TRNS,    __________, RALT(KC_S), __________, KC_PGDN,    RALT(KC_5), KC_LEFT,    KC_DOWN,    KC_UP,      KC_RGHT,    RALT(KC_P), RALT(KC_Q) },
+  { __________, KC_HOME,    __________, __________, __________, KC_PGUP,    __________, __________, __________, __________, __________, KC_ENT     },
+  { RESET,      __________, __________, __________, __________, KC_SPC,     KC_SPC,     __________, __________, __________, __________, __________ }
+},
+
+// function key layer and some shift + (missing key at the small form factor)
+[_LOW] = {
+  { KC_TILD,    __________, __________, __________, __________, __________, __________, __________, __________, KC_LCBR,    KC_RCBR,    KC_UNDS    },
+  { __________, KC_F1,      KC_F2,      KC_F3,      KC_F4,      KC_F5,      KC_F6,      KC_F7,      KC_F8,      KC_LBRC,    KC_RBRC,    KC_PLUS    },
+  { __________, __________, __________, __________, __________, KC_F9,      KC_F10,     KC_F11,     KC_F12,     __________, __________, __________ },
+  { __________, __________, __________, __________, __________, __________, __________, KC_TRNS,    __________, __________, __________, __________ }
+},
+
+// most macros will switch tmux screens
+// two macros are for vi's save/quit at 'w' and 'q'
+[_TMUX] = {
+  { __________, M(14),      M(13),      __________, __________, __________, __________, __________, __________, __________, M(11),      __________ },
+  { M(0),       M(1),       M(2),       M(3),       M(4),       M(5),       M(6),       M(7),       M(8),       M(9),       __________, __________ },
+  { __________, __________, __________, M(12),      __________, __________, M(10),      __________, __________, __________, __________, __________ },
+  { __________, __________, __________, __________, __________, KC_TRNS,    __________, __________, __________, __________, __________, __________ }
+},
+
+// mouse movement can be improved (e.g. can't press hj at once), but I will use this seldom, so I stick with hjkl keys.
+[_MOUSE] = {
+  { KC_TRNS,    __________, __________, __________, __________, __________, __________, __________, __________, __________, __________, __________ },
+  { __________, __________, __________, __________, KC_WH_D,    __________, KC_MS_L,    KC_MS_D,    KC_MS_U,    KC_MS_R,    __________, __________ },
+  { __________, __________, __________, __________, __________, KC_WH_U,    __________, __________, __________, __________, __________, __________ },
+  { __________, __________, __________, KC_ACL2,    KC_ACL1,    KC_ACL0,    KC_MS_BTN1, KC_MS_BTN3, KC_MS_BTN2, __________, __________, __________ }
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [_LCTL] = ACTION_MODS_TAP_KEY(KC_LCTL, M(12)),    // does not work
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+      switch(id) {
+        case 0:
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_0), END );
+          break;
+        case 1:
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_1), END );
+          break;
+        case 2:
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_2), END );
+          break;
+        case 3:
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_3), END );
+          break;
+        case 4:
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_4), END );
+          break;
+        case 5:
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_5), END );
+          break;
+        case 6:
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_6), END );
+          break;
+        case 7:
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_7), END );
+          break;
+        case 8:
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_8), END );
+          break;
+        case 9:
+          // tmux last window
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_L), END );
+          break;
+          // tmux next window
+        case 10:
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_N), END );
+          break;
+          // tmux previous window
+        case 11:
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_P), END );
+          break;
+          // tmux new window
+        case 12:
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), TYPE(KC_C), END );
+          break;
+        case 13:
+          // vi save document
+          return MACRODOWN( TYPE(KC_ESC), DOWN(KC_LSFT), TYPE(KC_SCLN), UP(KC_LSFT), TYPE(KC_W), TYPE(KC_ENT), END );
+          break;
+        case 14:
+          // vi quit
+          return MACRODOWN( TYPE(KC_ESC), DOWN(KC_LSFT), TYPE(KC_SCLN), UP(KC_LSFT), TYPE(KC_Q), TYPE(KC_ENT), END );
+          break;
+          // tmux press ctrl-b
+        case 15:
+          return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_B), UP(KC_LCTL), END );
+          break;
+      }
+    return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/monkey.c b/keyboard/planck/keymaps/monkey.c
deleted file mode 100644 (file)
index 21a2c14..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-#include "keymap_common.h"
-#include "backlight.h"
-#include "debug.h"
-
-#define COLEMAK_LAYER 0
-#define QWERTY_LAYER 1
-#define LOWER_LAYER 2
-#define UPPER_LAYER 3
-#define SPACEFN_LAYER 4
-#define TENKEY_LAYER 5
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[COLEMAK_LAYER] = { /* Colemak */
-  {KC_TAB,    UNI(0x1961),     KC_W,    KC_F,    KC_P,    KC_G,     KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN,  KC_BSPC},
-  {KC_LCTL,   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},
-  {FUNC(5),   KC_ESC,   KC_LGUI, KC_LALT, FUNC(1), FUNC(6),  FUNC(6), FUNC(2), KC_LEFT, KC_DOWN, KC_UP,    KC_RGHT}
-},
-[QWERTY_LAYER] = { /* 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_LCTL, 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},
-  {FUNC(5), KC_ESC, KC_LGUI, KC_LALT, FUNC(1), FUNC(6), FUNC(6), FUNC(2), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
-},
-[LOWER_LAYER] = { /* LOWER */
-  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_DELETE},
-  {KC_TRNS, FUNC(3), FUNC(4), RESET,   DEBUG,   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, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END}
-},
-[UPPER_LAYER] = { /* RAISE */
-  {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_DELETE},
-  {KC_CALC,   FUNC(3), FUNC(4), RESET,    DEBUG,    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,  KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS,    KC_MNXT,    KC_VOLD,    KC_VOLU,    KC_MPLY}
-},
-[SPACEFN_LAYER] = { /* SpaceFN */
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_UP,   KC_END,   KC_TRNS, KC_TRNS},
-  {KC_TRNS, FUNC(3), FUNC(4), KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS},
-  {KC_TRNS, KC_F11,  KC_F12,  KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, 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}
-},
-[TENKEY_LAYER] = { /* TENKEY */
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, KC_BSPC},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_NLCK},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_1, KC_KP_2, KC_KP_3, KC_PDOT, KC_ENT},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC,  KC_SPC,  KC_KP_0, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
-}
-};
-
-const uint16_t PROGMEM fn_actions[] = {
-    [1] = ACTION_LAYER_TAP_KEY(LOWER_LAYER, KC_BSPC),  // Tap for backspace, hold for LOWER
-    [2] = ACTION_LAYER_TAP_KEY(UPPER_LAYER, KC_ENT),  // Tap for enter, hold for RAISE
-
-    [3] = ACTION_DEFAULT_LAYER_SET(COLEMAK_LAYER),
-    [4] = ACTION_DEFAULT_LAYER_SET(QWERTY_LAYER),
-    [5] = ACTION_LAYER_TOGGLE(TENKEY_LAYER),
-    
-    [6] = ACTION_LAYER_TAP_KEY(SPACEFN_LAYER, KC_SPC),  // Tap for space, hold for SpaceFN
-};
-
-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);
-          backlight_step();
-        } else {
-          unregister_code(KC_RSFT);
-        }
-        break;
-      } 
-    return MACRO_NONE;
-};
\ No newline at end of file
diff --git a/keyboard/planck/keymaps/monkey/monkey.c b/keyboard/planck/keymaps/monkey/monkey.c
new file mode 100644 (file)
index 0000000..21a2c14
--- /dev/null
@@ -0,0 +1,76 @@
+#include "keymap_common.h"
+#include "backlight.h"
+#include "debug.h"
+
+#define COLEMAK_LAYER 0
+#define QWERTY_LAYER 1
+#define LOWER_LAYER 2
+#define UPPER_LAYER 3
+#define SPACEFN_LAYER 4
+#define TENKEY_LAYER 5
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[COLEMAK_LAYER] = { /* Colemak */
+  {KC_TAB,    UNI(0x1961),     KC_W,    KC_F,    KC_P,    KC_G,     KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN,  KC_BSPC},
+  {KC_LCTL,   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},
+  {FUNC(5),   KC_ESC,   KC_LGUI, KC_LALT, FUNC(1), FUNC(6),  FUNC(6), FUNC(2), KC_LEFT, KC_DOWN, KC_UP,    KC_RGHT}
+},
+[QWERTY_LAYER] = { /* 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_LCTL, 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},
+  {FUNC(5), KC_ESC, KC_LGUI, KC_LALT, FUNC(1), FUNC(6), FUNC(6), FUNC(2), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+[LOWER_LAYER] = { /* LOWER */
+  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_DELETE},
+  {KC_TRNS, FUNC(3), FUNC(4), RESET,   DEBUG,   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, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END}
+},
+[UPPER_LAYER] = { /* RAISE */
+  {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_DELETE},
+  {KC_CALC,   FUNC(3), FUNC(4), RESET,    DEBUG,    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,  KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS,    KC_MNXT,    KC_VOLD,    KC_VOLU,    KC_MPLY}
+},
+[SPACEFN_LAYER] = { /* SpaceFN */
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_UP,   KC_END,   KC_TRNS, KC_TRNS},
+  {KC_TRNS, FUNC(3), FUNC(4), KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS},
+  {KC_TRNS, KC_F11,  KC_F12,  KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, 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}
+},
+[TENKEY_LAYER] = { /* TENKEY */
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, KC_BSPC},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_NLCK},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_1, KC_KP_2, KC_KP_3, KC_PDOT, KC_ENT},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC,  KC_SPC,  KC_KP_0, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_LAYER_TAP_KEY(LOWER_LAYER, KC_BSPC),  // Tap for backspace, hold for LOWER
+    [2] = ACTION_LAYER_TAP_KEY(UPPER_LAYER, KC_ENT),  // Tap for enter, hold for RAISE
+
+    [3] = ACTION_DEFAULT_LAYER_SET(COLEMAK_LAYER),
+    [4] = ACTION_DEFAULT_LAYER_SET(QWERTY_LAYER),
+    [5] = ACTION_LAYER_TOGGLE(TENKEY_LAYER),
+    
+    [6] = ACTION_LAYER_TAP_KEY(SPACEFN_LAYER, KC_SPC),  // Tap for space, hold for SpaceFN
+};
+
+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);
+          backlight_step();
+        } else {
+          unregister_code(KC_RSFT);
+        }
+        break;
+      } 
+    return MACRO_NONE;
+};
\ No newline at end of file
diff --git a/keyboard/planck/keymaps/nico.c b/keyboard/planck/keymaps/nico.c
deleted file mode 100644 (file)
index e81fd80..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
-// this is the style you want to emulate.
-
-#include "planck.h"
-#include "backlight.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 _LW 3
-#define _RS 4
-
-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_LCTL,  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_ESC, KC_LALT, KC_LGUI, F(1), KC_SPC,  KC_SPC,  F(2), 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_LCTL,  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_ESC, KC_LALT, KC_LGUI, F(1), KC_SPC,  KC_SPC,  F(2), 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_LCTL,  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_ESC, KC_LALT, KC_LGUI, F(1), KC_SPC,  KC_SPC,  F(2), 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},
-  {M(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F14,  KC_F15,  KC_TRNS, KC_MFFD, 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},
-  {M(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F14,  KC_F15,  KC_TRNS, KC_MFFD, KC_VOLD, KC_VOLU, KC_MPLY}
-}
-};
-
-const uint16_t PROGMEM fn_actions[] = {
-  [1] = ACTION_LAYER_TAP_KEY(MO(_LW), KC_BSPC),  // Tap for backspace, hold for LOWER
-  [2] = ACTION_LAYER_TAP_KEY(MO(_RS), KC_ENT),  // Tap for enter, hold for RAISE
-};
-
-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);
-            backlight_step();
-          } else {
-            unregister_code(KC_RSFT);
-          }
-        break;
-      }
-    return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/nico/nico.c b/keyboard/planck/keymaps/nico/nico.c
new file mode 100644 (file)
index 0000000..e81fd80
--- /dev/null
@@ -0,0 +1,69 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "planck.h"
+#include "backlight.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 _LW 3
+#define _RS 4
+
+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_LCTL,  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_ESC, KC_LALT, KC_LGUI, F(1), KC_SPC,  KC_SPC,  F(2), 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_LCTL,  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_ESC, KC_LALT, KC_LGUI, F(1), KC_SPC,  KC_SPC,  F(2), 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_LCTL,  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_ESC, KC_LALT, KC_LGUI, F(1), KC_SPC,  KC_SPC,  F(2), 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},
+  {M(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F14,  KC_F15,  KC_TRNS, KC_MFFD, 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},
+  {M(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F14,  KC_F15,  KC_TRNS, KC_MFFD, KC_VOLD, KC_VOLU, KC_MPLY}
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+  [1] = ACTION_LAYER_TAP_KEY(MO(_LW), KC_BSPC),  // Tap for backspace, hold for LOWER
+  [2] = ACTION_LAYER_TAP_KEY(MO(_RS), KC_ENT),  // Tap for enter, hold for RAISE
+};
+
+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);
+            backlight_step();
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+      }
+    return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/numpad.c b/keyboard/planck/keymaps/numpad.c
deleted file mode 100644 (file)
index 7de4372..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#include "keymap_common.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = { /* Qwerty */
-  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_KP_MINUS, KC_KP_PLUS, KC_KP_PLUS, KC_KP_ENTER, KC_KP_ENTER},
-  {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_KP_ASTERISK, KC_KP_9, KC_KP_6,    KC_KP_3,  KC_KP_DOT},
-  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_KP_SLASH,    KC_KP_8, KC_KP_5,  KC_KP_2, KC_KP_0},
-  {BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, KC_NO, KC_SPC,  KC_SPC,  KC_NUMLOCK,   KC_KP_7, KC_KP_4, KC_KP_1,  KC_KP_0}
-                                                // Space is repeated to accommadate for both spacebar wiring positions
-}
-};
-
-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(T(CM_T), END);
-      break;
-    } 
-    return MACRO_NONE;
-};
\ No newline at end of file
diff --git a/keyboard/planck/keymaps/numpad/numpad.c b/keyboard/planck/keymaps/numpad/numpad.c
new file mode 100644 (file)
index 0000000..7de4372
--- /dev/null
@@ -0,0 +1,26 @@
+#include "keymap_common.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = { /* Qwerty */
+  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_KP_MINUS, KC_KP_PLUS, KC_KP_PLUS, KC_KP_ENTER, KC_KP_ENTER},
+  {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_KP_ASTERISK, KC_KP_9, KC_KP_6,    KC_KP_3,  KC_KP_DOT},
+  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_KP_SLASH,    KC_KP_8, KC_KP_5,  KC_KP_2, KC_KP_0},
+  {BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, KC_NO, KC_SPC,  KC_SPC,  KC_NUMLOCK,   KC_KP_7, KC_KP_4, KC_KP_1,  KC_KP_0}
+                                                // Space is repeated to accommadate for both spacebar wiring positions
+}
+};
+
+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(T(CM_T), END);
+      break;
+    } 
+    return MACRO_NONE;
+};
\ No newline at end of file
diff --git a/keyboard/planck/keymaps/pete/README.md b/keyboard/planck/keymaps/pete/README.md
new file mode 100644 (file)
index 0000000..3cf594f
--- /dev/null
@@ -0,0 +1,14 @@
+# Planck Layout by Pete
+
+This layout is based on the default layout but uses a FN key in the bottom left corner instead of the shift / backlight key.
+On the FN layer you can do the following things
+
+- Step through back light
+- Put a mac to sleep
+- The Fxx keys in a block to click with the right hand
+- The delete key in the upper right corner
+- Quick access to screenshot functions
+- Control volume and media playback
+- Home/PgDown/PgUp/End buttons where the arrow keys are
+
+Pressing the lower and raise buttons allows to reset and change from QWERT to Colemak or Dvorak.
diff --git a/keyboard/planck/keymaps/pete/keymap.c b/keyboard/planck/keymaps/pete/keymap.c
new file mode 100644 (file)
index 0000000..57cab65
--- /dev/null
@@ -0,0 +1,223 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "planck.h"
+#include "action_layer.h"
+#ifdef AUDIO_ENABLE
+  #include "audio.h"
+#endif
+#include "eeconfig.h"
+
+extern keymap_config_t keymap_config;
+
+// 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 _QWERTY 0
+#define _COLEMAK 1
+#define _DVORAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _FCT 5
+#define _SETUP 6
+#define _MICMUTE 16
+
+// Macro name shortcuts
+#define QWERTY M(_QWERTY)
+#define COLEMAK M(_COLEMAK)
+#define DVORAK M(_DVORAK)
+#define LOWER M(_LOWER)
+#define RAISE M(_RAISE)
+#define FCT M(_FCT)
+#define MICMUTE M(_MICMUTE)
+
+#define MACPRNT LGUI(LSFT(KC_3))
+#define MACPRNT2 LGUI(LSFT(KC_4))
+#define CYCLWIN LGUI(KC_GRV)
+#define MAC_SLEP LSFT(LCTL(KC_POWER))
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[_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 },
+  {FCT,     KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+[_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 },
+  {FCT,     KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+[_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 },
+  {FCT,     KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+[_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_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+[_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_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+[_FCT] = { /* Function */
+  {BL_STEP, MAC_SLEP,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_DELT},
+  {_______, MICMUTE, KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, XXXXXXX, KC_F5,   KC_F6,   KC_F7,   KC_F8,   MACPRNT},
+  {_______, CYCLWIN, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, KC_F9,   KC_F10,  KC_F11,  KC_F12, MACPRNT2},
+  {FCT,     _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_PGDOWN,KC_PGUP,KC_END }
+},
+
+[_SETUP] = { /* Setup */
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, QWERTY,  COLEMAK, DVORAK,  _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, RESET,   RESET,   _______, _______, _______, _______, _______}
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+#ifdef AUDIO_ENABLE
+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_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);
+#endif
+
+
+void persistant_default_layer_set(uint16_t default_layer) {
+  eeconfig_update_default_layer(default_layer);
+  default_layer_set(default_layer);
+}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+      switch(id) {
+        case _QWERTY:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+            #endif
+            persistant_default_layer_set(1UL<<_QWERTY);
+          }
+          break;
+        case _COLEMAK:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+            #endif
+            persistant_default_layer_set(1UL<<_COLEMAK);
+          }
+          break;
+        case _DVORAK:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+            #endif
+            persistant_default_layer_set(1UL<<_DVORAK);
+          }
+          break;
+        case _LOWER:
+          if (record->event.pressed) {
+            layer_on(_LOWER);
+            update_tri_layer(_LOWER, _RAISE, _SETUP);
+          } else {
+            layer_off(_LOWER);
+            update_tri_layer(_LOWER, _RAISE, _SETUP);
+          }
+          break;
+        case _RAISE:
+          if (record->event.pressed) {
+            layer_on(_RAISE);
+            update_tri_layer(_LOWER, _RAISE, _SETUP);
+          } else {
+            layer_off(_RAISE);
+            update_tri_layer(_LOWER, _RAISE, _SETUP);
+          }
+          break;
+        case _FCT:
+          if (record->event.pressed) {
+            layer_on(_FCT);
+          } else {
+            layer_off(_FCT);
+          }
+        break;
+        case _MICMUTE:
+          if (record->event.pressed) {
+            register_code(KC_RSFT);
+            register_code(KC_RCTL);
+            register_code(KC_RALT);
+            register_code(KC_RGUI);
+          } else {
+            unregister_code(KC_RSFT);
+            unregister_code(KC_RCTL);
+            unregister_code(KC_RALT);
+            unregister_code(KC_RGUI);
+          } 
+        break;
+
+      }
+    return MACRO_NONE;
+};
+
+void matrix_init_user(void) {
+  #ifdef AUDIO_ENABLE
+    _delay_ms(20); // stops the tick
+    PLAY_NOTE_ARRAY(tone_startup, false, 0);
+  #endif
+}
+
+#ifdef AUDIO_ENABLE
+void play_goodbye_tone()
+{
+  PLAY_NOTE_ARRAY(goodbye, false, 0);
+  _delay_ms(150);
+}
+
+uint8_t starting_note = 0x0C;
+int offset = 0;
+
+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)));
+    }
+  }
+
+}
+#endif
diff --git a/keyboard/planck/keymaps/pete/makefile.mk b/keyboard/planck/keymaps/pete/makefile.mk
new file mode 100644 (file)
index 0000000..812264c
--- /dev/null
@@ -0,0 +1,2 @@
+AUDIO_ENABLE = no
+NKRO_ENABLE = yes
\ No newline at end of file
index 7d64f09773f97c5c32539dc2157a590d8833a8bf..d435cc795c5a402a4e88aa518d61bf51c1119167 100644 (file)
@@ -73,7 +73,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 /* disable debug print */
-//#define NO_DEBUG
+#define NO_DEBUG
 
 /* disable print */
 //#define NO_PRINT
index 27850b21540c2133789edaef80d70bb8f88b1848..177f04484dce1910b16683735813f5c4244f7891 100644 (file)
@@ -38,6 +38,7 @@
 #define MACRO_AUDIO_OFF     17
 #define MACRO_INC_VOICE     18
 #define MACRO_DEC_VOICE     19
+#define MACRO_BACKLIGHT     20
 
 #define M_QWRTY             M(MACRO_QWERTY)
 #define M_COLMK             M(MACRO_COLEMAK)
@@ -53,6 +54,7 @@
 #define TMPO_UP             M(MACRO_TEMPO_U)
 #define TMPO_DN             M(MACRO_TEMPO_D)
 #define TMPO_DF             M(MACRO_TONE_DEFAULT)
+#define M_BACKL             M(MACRO_BACKLIGHT)
 
 
 #define MUS_ON              M(MACRO_MUSIC_ON)
@@ -96,7 +98,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
  [LAYER_QWERTY]       = { /* 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_BSPC, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT  },
+  { 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   },
   { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC,  KC_SPC,  M_LOWER, KC_UP,   KC_DOWN, KC_LEFT, KC_RGHT  },
  },
@@ -115,7 +117,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
  [LAYER_COLEMAK]      = { /* COLEMAK */
   { KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_ESC   },
-  { 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_BSPC, 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_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC,  KC_SPC,  M_LOWER, KC_UP,   KC_DOWN, KC_LEFT, KC_RGHT  },
  },
@@ -217,7 +219,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [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  },
   { _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______  },
-  { _______, _______, _______, _______, _______, RESET,   _______, M_MOUSE, _______, _______, _______, _______  },
+  { _______, _______, _______, _______, M_BACKL, RESET,   _______, M_MOUSE, _______, _______, _______, _______  },
   { _______, _______, _______, _______, _______, _______, _______, _______, VC_UP,   VC_DOWN, _______, _______  },
  },
 
@@ -337,6 +339,15 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
             }
             break;
 
+
+#ifdef BACKLIGHT_ENABLE
+               case MACRO_BACKLIGHT:
+                       if (record->event.pressed)
+                       {
+                               backlight_step();
+                       }
+#endif
+
 #ifdef MOUSEKEY_ENABLE
 
         case MACRO_MOUSE:
index 4b9e34c53fa25738d252135beb610e6bf9552237..f7798b09d5cb24b321974f5626d57431ae430f4c 100644 (file)
@@ -1,11 +1,12 @@
 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 = yes # 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.
@@ -13,4 +14,4 @@ RGBLIGHT_ENABLE  = no  # Enable WS2812 RGB underlight.  Do not enable this with
 # 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
+CONFIG_H = keymaps/$(KEYMAP)/config.h
\ No newline at end of file
diff --git a/keyboard/planck/keymaps/tak3over.c b/keyboard/planck/keymaps/tak3over.c
deleted file mode 100644 (file)
index 7d8243d..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
-// this is the style you want to emulate.
-//
-//Dropped the Dvorak layer and added two my layer buttons.  Both Raise and lower can be accessed from either side now.
-
-#include "planck.h"
-#ifdef BACKLIGHT_ENABLE
-  #include "backlight.h"
-#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 _LW 2
-#define _RS 3
-#define _FN 4
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-
-/* Qwerty
- * ,-----------------------------------------------------------------------------------.
- * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Ctrl | Alt  | GUI  |Func  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
- * `-----------------------------------------------------------------------------------'
- */
-[_QW] = {
-  {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 },
-  {KC_LCTL, KC_LALT, KC_LGUI, MO(_FN), MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
-},
-/* Colemak
- * ,-----------------------------------------------------------------------------------.
- * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Ctrl | Alt  | GUI  |Func  |Lower |    Space    |Raise | Left | Down |  Up  |Right 
- * `-----------------------------------------------------------------------------------'
- */
-[_CM] = {
-  {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_LCTL, KC_LALT, KC_LGUI, MO(_FN), MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
-},
-/* Raise
- * ,-----------------------------------------------------------------------------------.
- * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp 
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  |   |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift|  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |   _  |   +  |   {  |   }  |Enter |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Ctrl | Alt  | GUI  |Func  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
- * `-----------------------------------------------------------------------------------'
- */
-[_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_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_PIPE},
-  {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, 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}
-},
-/* Lower
- * ,-----------------------------------------------------------------------------------.
- * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc  | Reset| Ins  | Home | PGUP |Colemk| Left |   -  |   =  |   [  |   ]  |  \   |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift| Brite| Del  | End  | PGDN |Qwerty| Del  |   _  |   +  |   {  |   }  |Enter |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Ctrl | Alt  | GUI  |Func  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
- * `-----------------------------------------------------------------------------------'
- */
-[_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_TRNS, RESET,   KC_INS,  KC_HOME, KC_PGUP, DF(_CM), KC_LEFT, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
-  {KC_TRNS, M(0),    KC_DEL,  KC_END,  KC_PGDN, DF(_QW), KC_DEL,  KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, 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}
-},
-/* Function
- * ,-----------------------------------------------------------------------------------.
- * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc  | GUI  |   X  |   C  |   V  |  Z   | Left | Down |  Up  |Right | Del  |  \   |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * |Shift | Ctrl |   X  |   C  |   V  |  Z   | Next | Mute | Vol- | Vol+ | Play |Enter |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Ctrl | Alt  | GUI  |Func  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
- * `-----------------------------------------------------------------------------------'
- */
-[_FN] = {
-  {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_RGUI, KC_X,    KC_C,    KC_V,    KC_Z,    KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT, KC_DEL,  KC_BSLS},
-  {KC_TRNS, KC_RCTL, KC_X,    KC_C,    KC_V,    KC_Z,    KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY, 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[] = {
-
-};
-
-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);
-            #ifdef BACKLIGHT_ENABLE
-              backlight_step();
-            #endif
-          } else {
-            unregister_code(KC_RSFT);
-          }
-        break;
-      }
-    return MACRO_NONE;
-};
diff --git a/keyboard/planck/keymaps/tak3over/tak3over.c b/keyboard/planck/keymaps/tak3over/tak3over.c
new file mode 100644 (file)
index 0000000..7d8243d
--- /dev/null
@@ -0,0 +1,130 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+//
+//Dropped the Dvorak layer and added two my layer buttons.  Both Raise and lower can be accessed from either side now.
+
+#include "planck.h"
+#ifdef BACKLIGHT_ENABLE
+  #include "backlight.h"
+#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 _LW 2
+#define _RS 3
+#define _FN 4
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt  | GUI  |Func  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QW] = {
+  {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 },
+  {KC_LCTL, KC_LALT, KC_LGUI, MO(_FN), MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt  | GUI  |Func  |Lower |    Space    |Raise | Left | Down |  Up  |Right 
+ * `-----------------------------------------------------------------------------------'
+ */
+[_CM] = {
+  {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_LCTL, KC_LALT, KC_LGUI, MO(_FN), MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp 
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  |   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |   _  |   +  |   {  |   }  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt  | GUI  |Func  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_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_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_PIPE},
+  {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, 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}
+},
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  | Reset| Ins  | Home | PGUP |Colemk| Left |   -  |   =  |   [  |   ]  |  \   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Brite| Del  | End  | PGDN |Qwerty| Del  |   _  |   +  |   {  |   }  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt  | GUI  |Func  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_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_TRNS, RESET,   KC_INS,  KC_HOME, KC_PGUP, DF(_CM), KC_LEFT, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
+  {KC_TRNS, M(0),    KC_DEL,  KC_END,  KC_PGDN, DF(_QW), KC_DEL,  KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, 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}
+},
+/* Function
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  | GUI  |   X  |   C  |   V  |  Z   | Left | Down |  Up  |Right | Del  |  \   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |Shift | Ctrl |   X  |   C  |   V  |  Z   | Next | Mute | Vol- | Vol+ | Play |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt  | GUI  |Func  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_FN] = {
+  {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_RGUI, KC_X,    KC_C,    KC_V,    KC_Z,    KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT, KC_DEL,  KC_BSLS},
+  {KC_TRNS, KC_RCTL, KC_X,    KC_C,    KC_V,    KC_Z,    KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY, 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[] = {
+
+};
+
+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);
+            #ifdef BACKLIGHT_ENABLE
+              backlight_step();
+            #endif
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+      }
+    return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/unicode/keymap.c b/keyboard/planck/keymaps/unicode/keymap.c
new file mode 100644 (file)
index 0000000..d73e7e0
--- /dev/null
@@ -0,0 +1,326 @@
+/*
+   Copyright
+   2015 Jack Humbert <jack.humb@gmail.com>
+   2016 Francois Marlier <fmarlier@gmail.com>
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   For more info on how this works per OS, see here
+   https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input
+*/
+
+
+#include "planck.h"
+#include "action_layer.h"
+#ifdef AUDIO_ENABLE
+  #include "audio.h"
+#endif
+#include "eeconfig.h"
+
+extern keymap_config_t keymap_config;
+
+// 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 _QWERTY 0
+#define _COLEMAK 1
+#define _DVORAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _PLOVER 5
+#define _ADJUST 16
+
+// Macro name shortcuts
+#define QWERTY M(_QWERTY)
+#define COLEMAK M(_COLEMAK)
+#define DVORAK M(_DVORAK)
+#define LOWER M(_LOWER)
+#define RAISE M(_RAISE)
+#define M_BL 5
+#define PLOVER M(12)
+#define EXT_PLV M(13)
+#define TOG_OUT M(14)
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_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(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_COLEMAK] = {
+  {KC_TAB,  UC_q,    UC_w,    UC_f,    UC_p,    UC_g,    UC_j,    UC_l,    UC_u,    UC_y,    UC_SCLN, UC_BSPC},
+  {KC_ESC,  UC_a,    UC_r,    UC_s,    UC_t,    UC_d,    UC_h,    UC_n,    UC_e,    UC_i,    UC_o,    UC_QUOT},
+  {KC_LSFT, UC_z,    UC_x,    UC_c,    UC_v,    UC_b,    UC_k,    UC_m,    UC_COMM, UC_DOT,  UC_SLSH, KC_ENT},
+  {KC_TRNS, KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   "  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |  /   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   ;  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_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(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      |      |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_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,  _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      |      |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_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,  _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Plover layer (http://opensteno.org)
+ * ,-----------------------------------------------------------------------------------.
+ * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |TogOut|   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Exit |      |      |   A  |   O  |             |   E  |   U  |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+
+[_PLOVER] = {
+  {KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1   },
+  {XXXXXXX, KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC},
+  {TOG_OUT, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
+  {EXT_PLV, XXXXXXX, XXXXXXX, KC_C,    KC_V,    XXXXXXX, XXXXXXX, KC_N,    KC_M,    XXXXXXX, XXXXXXX, XXXXXXX}
+},
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover|      |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |Voice-|Voice+|Mus on|Musoff|      |      |      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = {
+  {_______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
+  {_______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  PLOVER,  _______},
+  {_______, MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
+}
+
+
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+#ifdef AUDIO_ENABLE
+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_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 goodbye[][2] = SONG(GOODBYE_SOUND);
+#endif
+
+
+void persistant_default_layer_set(uint16_t default_layer) {
+  eeconfig_update_default_layer(default_layer);
+  default_layer_set(default_layer);
+}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+      switch(id) {
+        case _QWERTY:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+            #endif
+            persistant_default_layer_set(1UL<<_QWERTY);
+          }
+          break;
+        case _COLEMAK:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+            #endif
+            persistant_default_layer_set(1UL<<_COLEMAK);
+          }
+          break;
+        case _DVORAK:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+            #endif
+            persistant_default_layer_set(1UL<<_DVORAK);
+          }
+          break;
+        case _LOWER:
+          if (record->event.pressed) {
+            layer_on(_LOWER);
+            update_tri_layer(_LOWER, _RAISE, _ADJUST);
+          } else {
+            layer_off(_LOWER);
+            update_tri_layer(_LOWER, _RAISE, _ADJUST);
+          }
+          break;
+        case _RAISE:
+          if (record->event.pressed) {
+            layer_on(_RAISE);
+            update_tri_layer(_LOWER, _RAISE, _ADJUST);
+          } else {
+            layer_off(_RAISE);
+            update_tri_layer(_LOWER, _RAISE, _ADJUST);
+          }
+          break;
+        case M_BL:
+          if (record->event.pressed) {
+            register_code(KC_RSFT);
+            #ifdef BACKLIGHT_ENABLE
+              backlight_step();
+            #endif
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+        case 12:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              stop_all_notes();
+              PLAY_NOTE_ARRAY(tone_plover, false, 0);
+            #endif
+            layer_off(_RAISE);
+            layer_off(_LOWER);
+            layer_off(_ADJUST);
+            layer_on(_PLOVER);
+            if (!eeconfig_is_enabled()) {
+                eeconfig_init();
+            }
+            keymap_config.raw = eeconfig_read_keymap();
+            keymap_config.nkro = 1;
+            eeconfig_update_keymap(keymap_config.raw);
+          }
+        break;
+        case 13:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              PLAY_NOTE_ARRAY(tone_plover_gb, false, 0);
+            #endif
+            layer_off(_PLOVER);
+          }
+        break;
+        case 14:
+          if (record->event.pressed) {
+            return MACRO( D(E), D(R), D(F), D(V), D(O), D(L), U(E), U(R), U(F), U(V), U(O), U(L), END );
+          }
+        break;
+      }
+    return MACRO_NONE;
+};
+
+void matrix_init_user(void) {
+  #ifdef AUDIO_ENABLE
+    _delay_ms(20); // stops the tick
+    PLAY_NOTE_ARRAY(tone_startup, false, 0);
+  #endif
+}
+
+#ifdef AUDIO_ENABLE
+void play_goodbye_tone()
+{
+  PLAY_NOTE_ARRAY(goodbye, false, 0);
+  _delay_ms(150);
+}
+#endif
+
+
diff --git a/keyboard/planck/keymaps/unicode/makefile.mk b/keyboard/planck/keymaps/unicode/makefile.mk
new file mode 100644 (file)
index 0000000..9b27b08
--- /dev/null
@@ -0,0 +1 @@
+UNICODE_ENABLE   = yes  # Unicode
index 65585015044ed5d7f268cb0c3242029ba9b1b935..da7b3a1702b6f2fddd8ac9b5dd3edb32ff8141db 100644 (file)
@@ -7,7 +7,12 @@ __attribute__ ((weak))
 void matrix_scan_user(void) {}
 
 __attribute__ ((weak))
-void process_action_user(keyrecord_t *record) {}
+bool process_action_user(keyrecord_t *record) {
+    return true;
+}
+
+__attribute__ ((weak))
+void led_set_user(uint8_t usb_led) {}
 
 void matrix_init_kb(void) {
 #ifdef BACKLIGHT_ENABLE
@@ -29,12 +34,26 @@ void matrix_scan_kb(void) {
        matrix_scan_user();
 }
 
-void process_action_kb(keyrecord_t *record) {
-       process_action_user(record);
+bool process_action_kb(keyrecord_t *record) {
+       return 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);
 }
 
 #ifdef BACKLIGHT_ENABLE
 #define CHANNEL OCR1C
+#define BREATHING_NO_HALT  0
+#define BREATHING_HALT_OFF 1
+#define BREATHING_HALT_ON  2
+
+static uint8_t breath_intensity;
+static uint8_t breath_speed;
+static uint16_t breathing_index;
+static uint8_t breathing_halt;
 
 void backlight_init_ports()
 {
@@ -60,22 +79,22 @@ void backlight_init_ports()
     TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
 
     backlight_init();
+    breathing_defaults();
 }
 
 void backlight_set(uint8_t level)
 {
+    // Prevent backlight blink on lowest level
+    PORTB &= ~(_BV(PORTB7));
+
     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
@@ -83,13 +102,205 @@ void backlight_set(uint8_t level)
     }
     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));
     }
+    breathing_intensity_default();
+}
+
+
+void breathing_enable(void)
+{
+    if (get_backlight_level() == 0)
+    {
+        breathing_index = 0;
+    }
+    else
+    {
+        // Set breathing_index to be at the midpoint (brightest point)
+        breathing_index = 0x20 << breath_speed;
+    }
+
+    breathing_halt = BREATHING_NO_HALT;
+
+    // Enable breathing interrupt
+    TIMSK1 |= _BV(OCIE1A);
+}
+
+void breathing_pulse(void)
+{
+    if (get_backlight_level() == 0)
+    {
+        breathing_index = 0;
+    }
+    else
+    {
+        // Set breathing_index to be at the midpoint + 1 (brightest point)
+        breathing_index = 0x21 << breath_speed;
+    }
+
+    breathing_halt = BREATHING_HALT_ON;
+
+    // Enable breathing interrupt
+    TIMSK1 |= _BV(OCIE1A);
+}
+
+void breathing_disable(void)
+{
+    // Disable breathing interrupt
+    TIMSK1 &= ~_BV(OCIE1A);
+    backlight_set(get_backlight_level());
+}
+
+void breathing_self_disable(void)
+{
+    if (get_backlight_level() == 0)
+    {
+        breathing_halt = BREATHING_HALT_OFF;
+    }
+    else
+    {
+        breathing_halt = BREATHING_HALT_ON;
+    }
+
+    //backlight_set(get_backlight_level());
+}
+
+void breathing_toggle(void)
+{
+    if (!is_breathing())
+    {
+        if (get_backlight_level() == 0)
+        {
+            breathing_index = 0;
+        }
+        else
+        {
+            // Set breathing_index to be at the midpoint + 1 (brightest point)
+            breathing_index = 0x21 << breath_speed;
+        }
+
+        breathing_halt = BREATHING_NO_HALT;
+    }
+
+    // Toggle breathing interrupt
+    TIMSK1 ^= _BV(OCIE1A);
+
+    // Restore backlight level
+    if (!is_breathing())
+    {
+        backlight_set(get_backlight_level());
+    }
+}
+
+bool is_breathing(void)
+{
+    return (TIMSK1 && _BV(OCIE1A));
+}
+
+void breathing_intensity_default(void)
+{
+    //breath_intensity = (uint8_t)((uint16_t)100 * (uint16_t)get_backlight_level() / (uint16_t)BACKLIGHT_LEVELS);
+    breath_intensity = ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2));
+}
+
+void breathing_intensity_set(uint8_t value)
+{
+    breath_intensity = value;
+}
+
+void breathing_speed_default(void)
+{
+    breath_speed = 4;
+}
+
+void breathing_speed_set(uint8_t value)
+{
+    bool is_breathing_now = is_breathing();
+    uint8_t old_breath_speed = breath_speed;
+
+    if (is_breathing_now)
+    {
+        // Disable breathing interrupt
+        TIMSK1 &= ~_BV(OCIE1A);
+    }
+
+    breath_speed = value;
+
+    if (is_breathing_now)
+    {
+        // Adjust index to account for new speed
+        breathing_index = (( (uint8_t)( (breathing_index) >> old_breath_speed ) ) & 0x3F) << breath_speed;
+
+        // Enable breathing interrupt
+        TIMSK1 |= _BV(OCIE1A);
+    }
+
 }
 
+void breathing_speed_inc(uint8_t value)
+{
+    if ((uint16_t)(breath_speed - value) > 10 )
+    {
+        breathing_speed_set(0);
+    }
+    else
+    {
+        breathing_speed_set(breath_speed - value);
+    }
+}
+
+void breathing_speed_dec(uint8_t value)
+{
+    if ((uint16_t)(breath_speed + value) > 10 )
+    {
+        breathing_speed_set(10);
+    }
+    else
+    {
+        breathing_speed_set(breath_speed + value);
+    }
+}
+
+void breathing_defaults(void)
+{
+    breathing_intensity_default();
+    breathing_speed_default();
+    breathing_halt = BREATHING_NO_HALT;
+}
+
+/* Breathing Sleep LED brighness(PWM On period) table
+ * (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle
+ *
+ * http://www.wolframalpha.com/input/?i=%28sin%28+x%2F64*pi%29**8+*+255%2C+x%3D0+to+63
+ * (0..63).each {|x| p ((sin(x/64.0*PI)**8)*255).to_i }
+ */
+static const uint8_t breathing_table[64] PROGMEM = {
+  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   4,   6,  10,
+ 15,  23,  32,  44,  58,  74,  93, 113, 135, 157, 179, 199, 218, 233, 245, 252,
+255, 252, 245, 233, 218, 199, 179, 157, 135, 113,  93,  74,  58,  44,  32,  23,
+ 15,  10,   6,   4,   2,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+};
+
+ISR(TIMER1_COMPA_vect)
+{
+    // CHANNEL = (pgm_read_byte(&breathing_table[ ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F ] )) * breath_intensity;
+
+
+    uint8_t local_index = ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F;
+
+    if (((breathing_halt == BREATHING_HALT_ON) && (local_index == 0x20)) || ((breathing_halt == BREATHING_HALT_OFF) && (local_index == 0x3F)))
+    {
+        // Disable breathing interrupt
+        TIMSK1 &= ~_BV(OCIE1A);
+    }
+
+    CHANNEL = (uint16_t)(((uint16_t)pgm_read_byte(&breathing_table[local_index]) * 257)) >> breath_intensity;
+
+}
+
+
+
 #endif
\ No newline at end of file
index c5b59d9998a4cb50f0a5084125224d16a1b0ec24..8aec6b2627896bd74c2dd3860b101e30ace4e63e 100644 (file)
@@ -1,19 +1,7 @@
 #ifndef PLANCK_H
 #define PLANCK_H
 
-#include "matrix.h"
-#include "keymap_common.h"
-#ifdef BACKLIGHT_ENABLE
-       #include "backlight.h"
-#endif
-#ifdef RGBLIGHT_ENABLE
-  #include "rgblight.h"
-#endif
-#include <stddef.h>
-#include <avr/io.h>
-#ifdef MIDI_ENABLE
-       #include <keymap_midi.h>
-#endif
+#include "quantum.h"
 
 #define PLANCK_MIT( \
        k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
 
 void matrix_init_user(void);
 void matrix_scan_user(void);
-void process_action_user(keyrecord_t *record);
+bool process_action_user(keyrecord_t *record);
+
+void led_set_user(uint8_t usb_led);
+void backlight_init_ports(void);
+
+void breathing_enable(void);
+void breathing_pulse(void);
+void breathing_disable(void);
+void breathing_self_disable(void);
+void breathing_toggle(void);
+bool is_breathing(void);
+
+
+void breathing_defaults(void);
+void breathing_intensity_default(void);
+void breathing_speed_default(void);
+void breathing_speed_set(uint8_t value);
+void breathing_speed_inc(uint8_t value);
+void breathing_speed_dec(uint8_t value);
 
 #endif
index b3aa14dcbe3c63766fda214ef09abf091b1270f2..06e6647136d177ddf9df39b59e7a682003dccd13 100644 (file)
@@ -14,7 +14,6 @@
 #define _DVORAK 2
 #define _LOWER 3
 #define _RAISE 4
-#define _MUSIC 5
 #define _ADJUST 16
 
 // Macro name shortcuts
 #define LOWER M(_LOWER)
 #define RAISE M(_RAISE)
 #define M_BL 5
-#define AUD_OFF M(6)
-#define AUD_ON M(7)
-#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
@@ -108,7 +101,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * |------+------+------+------+------+-------------+------+------+------+------+------|
  * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
  * |------+------+------+------+------+------|------+------+------+------+------+------|
- * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      |      |      |      |Enter |
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | |      |      |Enter |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
  * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
  * `-----------------------------------------------------------------------------------'
@@ -117,7 +110,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   {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},
-  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  _______, _______, _______, _______, _______},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______},
   {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
 },
 
@@ -129,7 +122,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * |------+------+------+------+------+-------------+------+------+------+------+------|
  * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
  * |------+------+------+------+------+------|------+------+------+------+------+------|
- * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      |      |      |      |Enter |
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |      |      |Enter |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
  * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
  * `-----------------------------------------------------------------------------------'
@@ -138,21 +131,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   {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},
-  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  _______, _______, _______, _______, _______},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, _______, _______, _______},
   {_______, _______, _______, _______, _______, _______, _______, _______, 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 |
@@ -169,8 +151,8 @@ 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,  _______, _______},
-  {_______, VC_DE,   VC_IN,   MUS_ON,  MUS_OFF, _______, _______, _______, _______, _______, _______, _______},
+  {_______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  _______, _______},
+  {_______, MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  _______, _______, _______, _______, _______},
   {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
 }
 
@@ -193,7 +175,6 @@ float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
 float tone_dvorak[][2]     = SONG(DVORAK_SOUND);
 float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
 
-float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
 float goodbye[][2] = SONG(GOODBYE_SOUND);
 #endif
 
@@ -257,53 +238,6 @@ 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) {
-            #ifdef AUDIO_ENABLE
-              audio_off();
-            #endif
-          }
-        break;
-        case 7:
-          if (record->event.pressed) {
-            #ifdef AUDIO_ENABLE
-              audio_on();
-              PLAY_NOTE_ARRAY(start_up, 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(music_scale, false, 0);
-              layer_on(_MUSIC);
-            #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;
 };
@@ -318,21 +252,6 @@ void matrix_init_user(void) {
 
 #ifdef AUDIO_ENABLE
 
-uint8_t starting_note = 0x0C;
-int offset = 0;
-
-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 play_goodbye_tone()
 {
   PLAY_NOTE_ARRAY(goodbye, false, 0);
index 211f8d029645ada6c32ae4079094a84e5d833e68..13e05c65a73440788964eaef1bfb64f400baa8bb 100644 (file)
@@ -11,8 +11,8 @@ void matrix_scan_user(void) {
 };
 
 __attribute__ ((weak))
-void process_action_user(keyrecord_t *record) {
-
+bool process_action_user(keyrecord_t *record) {
+    return true;
 };
 
 void matrix_init_kb(void) {
@@ -36,8 +36,8 @@ void matrix_scan_kb(void) {
        matrix_scan_user();
 };
 
-void process_action_kb(keyrecord_t *record) {
-       process_action_user(record);
+bool process_action_kb(keyrecord_t *record) {
+       return process_action_user(record);
 }
 
 #ifdef BACKLIGHT_ENABLE
index 030acdadb40a2a9621806026f56021c2b9670417..feb87977440c1188793ace88e525bdb3b811e0ff 100644 (file)
@@ -1,19 +1,7 @@
 #ifndef PREONIC_H
 #define PREONIC_H
 
-#include "matrix.h"
-#include "keymap_common.h"
-#ifdef BACKLIGHT_ENABLE
-       #include "backlight.h"
-#endif
-#ifdef RGBLIGHT_ENABLE
-  #include "rgblight.h"
-#endif
-#include <stddef.h>
-#include <avr/io.h>
-#ifdef MIDI_ENABLE
-       #include <keymap_midi.h>
-#endif
+#include "quantum.h"
 
 #define PREONIC_MIT( \
        k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
@@ -47,6 +35,6 @@
 
 void matrix_init_user(void);
 void matrix_scan_user(void);
-void process_action_kb(keyrecord_t *record);
+bool process_action_kb(keyrecord_t *record);
 
 #endif
index e85370d958381cd311972b43077aaacf42552d67..32f64417ed659b7ba5c61ede337161f79a3825ab 100644 (file)
@@ -1,6 +1,6 @@
 #include <stdio.h>
 #include <string.h>
-#include <math.h>
+//#include <math.h>
 #include <avr/pgmspace.h>
 #include <avr/interrupt.h>
 #include <avr/io.h>
 
 #include "eeconfig.h"
 
-#ifdef VIBRATO_ENABLE
-    #include "vibrato_lut.h"
-#endif
+#define CPU_PRESCALER 8
 
-#define PI 3.14159265
+// -----------------------------------------------------------------------------
+// Timer Abstractions
+// -----------------------------------------------------------------------------
 
-#define CPU_PRESCALER 8
+// TIMSK3 - Timer/Counter #3 Interrupt Mask Register
+// Turn on/off 3A interputs, stopping/enabling the ISR calls
+#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A)
+#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A)
 
-#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
+// TCCR3A: Timer/Counter #3 Control Register
+// Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6
+#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1);
+#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0));
 
-    float places[8] = {0, 0, 0, 0, 0, 0, 0, 0};
-    uint16_t place_int = 0;
-    bool repeat = true;
-#endif
+// Fast PWM Mode Controls
+#define TIMER_3_PERIOD     ICR3
+#define TIMER_3_DUTY_CYCLE OCR3A
+
+// -----------------------------------------------------------------------------
 
-void delay_us(int count) {
-  while(count--) {
-    _delay_us(1);
-  }
-}
 
 int voices = 0;
 int voice_place = 0;
@@ -45,26 +43,23 @@ 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;
+
+bool     playing_notes = false;
+bool     playing_note = false;
+float    note_frequency = 0;
+float    note_length = 0;
+uint8_t  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;
+bool     notes_repeat;
+float    notes_rest;
+bool     note_resting = false;
 
 uint8_t current_note = 0;
 uint8_t rest_counter = 0;
@@ -77,175 +72,65 @@ float vibrato_rate = 0.125;
 
 float polyphony_rate = 0;
 
-bool inited = false;
+static bool audio_initialized = false;
 
 audio_config_t audio_config;
 
 uint16_t envelope_index = 0;
 
-void audio_toggle(void) {
-    audio_config.enable ^= 1;
-    eeconfig_update_audio(audio_config.raw);
-}
-
-void audio_on(void) {
-    audio_config.enable = 1;
-    eeconfig_update_audio(audio_config.raw);
-}
-
-void audio_off(void) {
-    audio_config.enable = 0;
-    eeconfig_update_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() {
+void audio_init()
+{
 
-    /* check signature */
-    if (!eeconfig_is_enabled()) {
+    // Check EEPROM
+    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 */
+       // Set port PC6 (OC3A and /OC4A) as output
+    DDRC |= _BV(PORTC6);
 
-        /* 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;
+    DISABLE_AUDIO_COUNTER_3_ISR;
 
-        /* Enable the OC4A output */
-        DDRC |= _BV(PORTC6);
+       // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers
+       // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6
+       // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A)
+       // Clock Select (CS3n) = 0b010 = Clock / 8
+    TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
+    TCCR3B = (1 << WGM33)  | (1 << WGM32)  | (0 << CS32)  | (1 << CS31) | (0 << CS30);
 
-        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;
+    audio_initialized = true;
 }
 
-void stop_all_notes() {
-    if (!inited) {
+void stop_all_notes()
+{
+    if (!audio_initialized) {
         audio_init();
     }
     voices = 0;
-    #ifdef PWM_AUDIO
-        TIMSK3 &= ~_BV(OCIE3A);
-    #else
-        TIMSK3 &= ~_BV(OCIE3A);
-        TCCR3A &= ~_BV(COM3A1);
-    #endif
-    notes = false;
-    note = false;
+
+    DISABLE_AUDIO_COUNTER_3_ISR;
+    DISABLE_AUDIO_COUNTER_3_OUTPUT;
+
+    playing_notes = false;
+    playing_note = false;
     frequency = 0;
     volume = 0;
 
-    for (int i = 0; i < 8; i++) {
+    for (uint8_t i = 0; i < 8; i++)
+    {
         frequencies[i] = 0;
         volumes[i] = 0;
     }
 }
 
-void stop_note(float freq) {
-    if (note) {
-        if (!inited) {
+void stop_note(float freq)
+{
+    if (playing_note) {
+        if (!audio_initialized) {
             audio_init();
         }
-        #ifdef PWM_AUDIO
-            freq = freq / SAMPLE_RATE;
-        #endif
         for (int i = 7; i >= 0; i--) {
             if (frequencies[i] == freq) {
                 frequencies[i] = 0;
@@ -266,15 +151,11 @@ void stop_note(float freq) {
             voice_place = 0;
         }
         if (voices == 0) {
-            #ifdef PWM_AUDIO
-                TIMSK3 &= ~_BV(OCIE3A);
-            #else
-                TIMSK3 &= ~_BV(OCIE3A);
-                TCCR3A &= ~_BV(COM3A1);
-            #endif
+            DISABLE_AUDIO_COUNTER_3_ISR;
+            DISABLE_AUDIO_COUNTER_3_OUTPUT;
             frequency = 0;
             volume = 0;
-            note = false;
+            playing_note = false;
         }
     }
 }
@@ -289,9 +170,9 @@ float mod(float a, int b)
 
 float vibrato(float average_freq) {
     #ifdef VIBRATO_STRENGTH_ENABLE
-        float vibrated_freq = average_freq * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength);
+        float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
     #else
-        float vibrated_freq = average_freq * VIBRATO_LUT[(int)vibrato_counter];
+        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;
@@ -299,309 +180,315 @@ float vibrato(float average_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;
-                    } 
-                }
+ISR(TIMER3_COMPA_vect)
+{
+       float freq;
+
+       if (playing_note) {
+               if (voices > 0) {
+                       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 {
+                                               freq = frequencies[voice_place];
+                                       }
+                               #else
+                                       freq = frequencies[voice_place];
+                               #endif
+                       } 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 {
+                                               freq = frequency;
+                                       }
+                               #else
+                                       freq = frequency;
+                               #endif
+                       }
+
+                       if (envelope_index < 65535) {
+                               envelope_index++;
+                       }
+
+                       freq = voice_envelope(freq);
+
+                       if (freq < 30.517578125) {
+                               freq = 30.52;
+                       }
+
+                       TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER));
+                       TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre);
+               }
+       }
+
+       if (playing_notes) {
+               if (note_frequency > 0) {
+                       #ifdef VIBRATO_ENABLE
+                               if (vibrato_strength > 0) {
+                                       freq = vibrato(note_frequency);
+                               } else {
+                                       freq = note_frequency;
+                               }
+                       #else
+                                       freq = note_frequency;
+                       #endif
+
+                       if (envelope_index < 65535) {
+                               envelope_index++;
+                       }
+                       freq = voice_envelope(freq);
+
+                       TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER));
+                       TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre);
+               } else {
+                       TIMER_3_PERIOD = 0;
+                       TIMER_3_DUTY_CYCLE = 0;
+               }
+
+               note_position++;
+               bool end_of_note = false;
+               if (TIMER_3_PERIOD > 0) {
+                       end_of_note = (note_position >= (note_length / TIMER_3_PERIOD * 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 {
+                                       DISABLE_AUDIO_COUNTER_3_ISR;
+                                       DISABLE_AUDIO_COUNTER_3_OUTPUT;
+                                       playing_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;
+                               envelope_index = 0;
+                               note_frequency = (*notes_pointer)[current_note][0];
+                               note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
+                       }
+
+                       note_position = 0;
+               }
+       }
+
+       if (!audio_config.enable) {
+               playing_notes = false;
+               playing_note = false;
+       }
+}
 
-                if (envelope_index < 65535) {
-                    envelope_index++;
-                }
-                freq = voice_envelope(freq);
+void play_note(float freq, int vol) {
 
-                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
+    if (!audio_initialized) {
+        audio_init();
     }
 
-    // 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 (audio_config.enable && voices < 8) {
+           DISABLE_AUDIO_COUNTER_3_ISR;
 
-                if (envelope_index < 65535) {
-                    envelope_index++;
-                }
-                freq = voice_envelope(freq);
+           // Cancel notes if notes are playing
+           if (playing_notes)
+               stop_all_notes();
 
-                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;
-        }
+           playing_note = true;
 
-    }
+           envelope_index = 0;
+
+           if (freq > 0) {
+               frequencies[voices] = freq;
+               volumes[voices] = vol;
+               voices++;
+           }
+
+        ENABLE_AUDIO_COUNTER_3_ISR;
+        ENABLE_AUDIO_COUNTER_3_OUTPUT;
+       }
 
-    if (!audio_config.enable) {
-        notes = false;
-        note = false;
-    }
 }
 
-void play_note(float freq, int vol) {
+void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest)
+{
 
-    if (!inited) {
+    if (!audio_initialized) {
         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++;
-    }
+       if (audio_config.enable) {
+
+           DISABLE_AUDIO_COUNTER_3_ISR;
+
+               // Cancel note if a note is playing
+           if (playing_note)
+               stop_all_notes();
+
+           playing_notes = true;
+
+           notes_pointer = np;
+           notes_count = n_count;
+           notes_repeat = n_repeat;
+           notes_rest = n_rest;
+
+           place = 0;
+           current_note = 0;
+
+        note_frequency = (*notes_pointer)[current_note][0];
+        note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
+           note_position = 0;
+
+
+        ENABLE_AUDIO_COUNTER_3_ISR;
+        ENABLE_AUDIO_COUNTER_3_OUTPUT;
+       }
 
-    #ifdef PWM_AUDIO
-        TIMSK3 |= _BV(OCIE3A);
-    #else
-        TIMSK3 |= _BV(OCIE3A);
-        TCCR3A |= _BV(COM3A1);
-    #endif
 }
 
+bool is_playing_notes(void) {
+       return playing_notes;
 }
 
-void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) {
+bool is_audio_on(void) {
+    return (audio_config.enable != 0);
+}
 
-    if (!inited) {
-        audio_init();
-    }
+void audio_toggle(void) {
+    audio_config.enable ^= 1;
+    eeconfig_update_audio(audio_config.raw);
+    if (audio_config.enable)
+        audio_on_user();
+}
 
-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;
+void audio_on(void) {
+    audio_config.enable = 1;
+    eeconfig_update_audio(audio_config.raw);
+    audio_on_user();
+}
 
+void audio_off(void) {
+    audio_config.enable = 0;
+    eeconfig_update_audio(audio_config.raw);
+}
 
-    #ifdef PWM_AUDIO
-        TIMSK3 |= _BV(OCIE3A);
-    #else
-        TIMSK3 |= _BV(OCIE3A);
-        TCCR3A |= _BV(COM3A1);
-    #endif
+#ifdef VIBRATO_ENABLE
+
+// Vibrato rate functions
+
+void set_vibrato_rate(float rate) {
+    vibrato_rate = rate;
 }
 
+void increase_vibrato_rate(float change) {
+    vibrato_rate *= change;
 }
 
-#ifdef PWM_AUDIO
-void play_sample(uint8_t * s, uint16_t l, bool r) {
-    if (!inited) {
-        audio_init();
-    }
+void decrease_vibrato_rate(float change) {
+    vibrato_rate /= change;
+}
 
-    if (audio_config.enable) {
-        TIMSK3 &= ~_BV(OCIE3A);
-        stop_all_notes();
-        place_int = 0;
-        sample = s;
-        sample_length = l;
-        repeat = r;
+#ifdef VIBRATO_STRENGTH_ENABLE
 
-        TIMSK3 |= _BV(OCIE3A);
+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  /* VIBRATO_STRENGTH_ENABLE */
+
+#endif /* VIBRATO_ENABLE */
+
+// 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(uint8_t tempo) {
+    note_tempo = tempo;
+}
+
+void decrease_tempo(uint8_t tempo_change) {
+    note_tempo += tempo_change;
+}
+
+void increase_tempo(uint8_t tempo_change) {
+    if (note_tempo - tempo_change < 10) {
+        note_tempo = 10;
+    } else {
+        note_tempo -= tempo_change;
     }
 }
-#endif
+
 
 //------------------------------------------------------------------------------
 // Override these functions in your keymap file to play different tunes on
 // startup and bootloader jump
 __attribute__ ((weak))
-void play_startup_tone()
-{
-}
-
+void play_startup_tone() {}
 
+__attribute__ ((weak))
+void play_goodbye_tone() {}
 
 __attribute__ ((weak))
-void play_goodbye_tone()
-{
+void audio_on_user() {}
 
-}
+__attribute__ ((weak))
+void play_music_scale() {}
 //------------------------------------------------------------------------------
index 89769507e1bf48175ea0905100060bcd28aa423f..b46f587bb4028a3d2cd8637e8da2607dd1994ef2 100644 (file)
@@ -25,6 +25,7 @@ typedef union {
     };
 } audio_config_t;
 
+bool is_audio_on(void);
 void audio_toggle(void);
 void audio_on(void);
 void audio_off(void);
@@ -56,7 +57,7 @@ void increase_polyphony_rate(float change);
 void decrease_polyphony_rate(float change);
 
 void set_timbre(float timbre);
-void set_tempo(float tempo);
+void set_tempo(uint8_t tempo);
 
 void increase_tempo(uint8_t tempo_change);
 void decrease_tempo(uint8_t tempo_change);
@@ -71,11 +72,11 @@ 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), }
+#define SCALE (int8_t []){ 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.
@@ -83,7 +84,12 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest)
 #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(&note_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat), (note_rest_style));
 
+
+bool is_playing_notes(void);
+
 void play_goodbye_tone(void);
 void play_startup_tone(void);
+void audio_on_user(void);
+void play_music_scale(void);
 
 #endif
\ No newline at end of file
diff --git a/quantum/audio/audio_pwm.c b/quantum/audio/audio_pwm.c
new file mode 100644 (file)
index 0000000..328a253
--- /dev/null
@@ -0,0 +1,643 @@
+#include <stdio.h>
+#include <string.h>
+//#include <math.h>
+#include <avr/pgmspace.h>
+#include <avr/interrupt.h>
+#include <avr/io.h>
+#include "print.h"
+#include "audio.h"
+#include "keymap_common.h"
+
+#include "eeconfig.h"
+
+#define PI 3.14159265
+
+#define CPU_PRESCALER 8
+
+
+// Timer Abstractions
+
+// TIMSK3 - Timer/Counter #3 Interrupt Mask Register
+// Turn on/off 3A interputs, stopping/enabling the ISR calls
+#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A)
+#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A)
+
+
+// TCCR3A: Timer/Counter #3 Control Register
+// Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6
+#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1);
+#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0));
+
+
+#define NOTE_PERIOD ICR3
+#define NOTE_DUTY_CYCLE OCR3A
+
+
+#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;
+
+float place = 0;
+
+uint8_t * sample;
+uint16_t sample_length = 0;
+// float freq = 0;
+
+bool     playing_notes = false;
+bool     playing_note = false;
+float    note_frequency = 0;
+float    note_length = 0;
+uint8_t  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;
+
+static bool audio_initialized = false;
+
+audio_config_t audio_config;
+
+uint16_t envelope_index = 0;
+
+void audio_init() {
+
+    // Check EEPROM
+    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);
+
+        DISABLE_AUDIO_COUNTER_3_ISR; // 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
+
+       // Set port PC6 (OC3A and /OC4A) as output
+        DDRC |= _BV(PORTC6);
+
+        DISABLE_AUDIO_COUNTER_3_ISR;
+
+               // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers
+               // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6
+               // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A)
+               // Clock Select (CS3n) = 0b010 = Clock / 8
+        TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
+        TCCR3B = (1 << WGM33)  | (1 << WGM32)  | (0 << CS32)  | (1 << CS31) | (0 << CS30);
+
+    #endif
+
+    audio_initialized = true;
+}
+
+void stop_all_notes() {
+    if (!audio_initialized) {
+        audio_init();
+    }
+    voices = 0;
+    #ifdef PWM_AUDIO
+           DISABLE_AUDIO_COUNTER_3_ISR;
+    #else
+        DISABLE_AUDIO_COUNTER_3_ISR;
+        DISABLE_AUDIO_COUNTER_3_OUTPUT;
+    #endif
+
+    playing_notes = false;
+    playing_note = false;
+    frequency = 0;
+    volume = 0;
+
+    for (uint8_t i = 0; i < 8; i++)
+    {
+        frequencies[i] = 0;
+        volumes[i] = 0;
+    }
+}
+
+void stop_note(float freq)
+{
+    if (playing_note) {
+        if (!audio_initialized) {
+            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
+                DISABLE_AUDIO_COUNTER_3_ISR;
+            #else
+                DISABLE_AUDIO_COUNTER_3_ISR;
+                DISABLE_AUDIO_COUNTER_3_OUTPUT;
+            #endif
+            frequency = 0;
+            volume = 0;
+            playing_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 (playing_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;
+                NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period
+                NOTE_DUTY_CYCLE = (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
+    //         DISABLE_AUDIO_COUNTER_3_ISR;
+
+
+    if (playing_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);
+
+                NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period
+                NOTE_DUTY_CYCLE = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
+            } else {
+                NOTE_PERIOD = 0;
+                NOTE_DUTY_CYCLE = 0;
+            }
+        #endif
+
+
+        note_position++;
+        bool end_of_note = false;
+        if (NOTE_PERIOD > 0)
+            end_of_note = (note_position >= (note_length / NOTE_PERIOD * 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
+                        DISABLE_AUDIO_COUNTER_3_ISR;
+                    #else
+                        DISABLE_AUDIO_COUNTER_3_ISR;
+                        DISABLE_AUDIO_COUNTER_3_OUTPUT;
+                    #endif
+                    playing_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] * (((float)note_tempo) / 100);
+                #else
+                    envelope_index = 0;
+                    note_frequency = (*notes_pointer)[current_note][0];
+                    note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
+                #endif
+            }
+            note_position = 0;
+        }
+
+    }
+
+    if (!audio_config.enable) {
+        playing_notes = false;
+        playing_note = false;
+    }
+}
+
+void play_note(float freq, int vol) {
+
+    if (!audio_initialized) {
+        audio_init();
+    }
+
+       if (audio_config.enable && voices < 8) {
+           DISABLE_AUDIO_COUNTER_3_ISR;
+
+           // Cancel notes if notes are playing
+           if (playing_notes)
+               stop_all_notes();
+
+           playing_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
+               ENABLE_AUDIO_COUNTER_3_ISR;
+           #else
+               ENABLE_AUDIO_COUNTER_3_ISR;
+               ENABLE_AUDIO_COUNTER_3_OUTPUT;
+           #endif
+       }
+
+}
+
+void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest)
+{
+
+    if (!audio_initialized) {
+        audio_init();
+    }
+
+       if (audio_config.enable) {
+
+           DISABLE_AUDIO_COUNTER_3_ISR;
+
+               // Cancel note if a note is playing
+           if (playing_note)
+               stop_all_notes();
+
+           playing_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] * (((float)note_tempo) / 100);
+           #else
+               note_frequency = (*notes_pointer)[current_note][0];
+               note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
+           #endif
+           note_position = 0;
+
+
+           #ifdef PWM_AUDIO
+               ENABLE_AUDIO_COUNTER_3_ISR;
+           #else
+               ENABLE_AUDIO_COUNTER_3_ISR;
+               ENABLE_AUDIO_COUNTER_3_OUTPUT;
+           #endif
+       }
+
+}
+
+#ifdef PWM_AUDIO
+void play_sample(uint8_t * s, uint16_t l, bool r) {
+    if (!audio_initialized) {
+        audio_init();
+    }
+
+    if (audio_config.enable) {
+        DISABLE_AUDIO_COUNTER_3_ISR;
+        stop_all_notes();
+        place_int = 0;
+        sample = s;
+        sample_length = l;
+        repeat = r;
+
+        ENABLE_AUDIO_COUNTER_3_ISR;
+    }
+}
+#endif
+
+
+void audio_toggle(void) {
+    audio_config.enable ^= 1;
+    eeconfig_update_audio(audio_config.raw);
+}
+
+void audio_on(void) {
+    audio_config.enable = 1;
+    eeconfig_update_audio(audio_config.raw);
+}
+
+void audio_off(void) {
+    audio_config.enable = 0;
+    eeconfig_update_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  /* VIBRATO_STRENGTH_ENABLE */
+
+#endif /* VIBRATO_ENABLE */
+
+// 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(uint8_t tempo) {
+    note_tempo = tempo;
+}
+
+void decrease_tempo(uint8_t tempo_change) {
+    note_tempo += tempo_change;
+}
+
+void increase_tempo(uint8_t tempo_change) {
+    if (note_tempo - tempo_change < 10) {
+        note_tempo = 10;
+    } else {
+        note_tempo -= tempo_change;
+    }
+}
+
+
+//------------------------------------------------------------------------------
+// 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/frequency_lut.h b/quantum/audio/frequency_lut.h
deleted file mode 100644 (file)
index e62da5b..0000000
+++ /dev/null
@@ -1,357 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <avr/pgmspace.h>
-
-#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
diff --git a/quantum/audio/luts.c b/quantum/audio/luts.c
new file mode 100644 (file)
index 0000000..9f3de9a
--- /dev/null
@@ -0,0 +1,382 @@
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/pgmspace.h>
+#include "luts.h"
+
+const float vibrato_lut[VIBRATO_LUT_LENGTH] =
+{
+       1.0022336811487,
+       1.0042529943610,
+       1.0058584256028,
+       1.0068905285205,
+       1.0072464122237,
+       1.0068905285205,
+       1.0058584256028,
+       1.0042529943610,
+       1.0022336811487,
+       1.0000000000000,
+       0.9977712970630,
+       0.9957650169978,
+       0.9941756956510,
+       0.9931566259436,
+       0.9928057204913,
+       0.9931566259436,
+       0.9941756956510,
+       0.9957650169978,
+       0.9977712970630,
+       1.0000000000000,
+};
+
+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,
+};
+
diff --git a/quantum/audio/luts.h b/quantum/audio/luts.h
new file mode 100644 (file)
index 0000000..7df3078
--- /dev/null
@@ -0,0 +1,15 @@
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/pgmspace.h>
+
+#ifndef LUTS_H
+#define LUTS_H
+
+#define VIBRATO_LUT_LENGTH 20
+
+#define FREQUENCY_LUT_LENGTH 349
+
+extern const float vibrato_lut[VIBRATO_LUT_LENGTH];
+extern const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH];
+
+#endif /* LUTS_H */
\ No newline at end of file
diff --git a/quantum/audio/vibrato_lut.h b/quantum/audio/vibrato_lut.h
deleted file mode 100644 (file)
index a2b1f3e..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <avr/pgmspace.h>
-
-#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
index d2316ba1b3bfebf01c1e51bf7248e1bf2f8b5061..6d4172a06c2dedd3def472ea500ec233f69eb4a8 100644 (file)
@@ -1,6 +1,6 @@
 #include "voices.h"
+#include "audio.h"
 #include "stdlib.h"
-#include "vibrato_lut.h"
 
 // these are imported from audio.c
 extern uint16_t envelope_index;
@@ -109,7 +109,7 @@ float voice_envelope(float frequency) {
                 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)];
+                    frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
                     break;
             }
             break;
@@ -160,4 +160,6 @@ float voice_envelope(float frequency) {
     }
 
     return frequency;
-}
\ No newline at end of file
+}
+
+
index 74c873f42f042f9ed3982734cd75db8135422f20..b2495b23b57b796c927f180936ba8c86101fddd3 100644 (file)
@@ -2,8 +2,7 @@
 #include <stdbool.h>
 #include <avr/io.h>
 #include <util/delay.h>
-#include "musical_notes.h"
-#include "song_list.h"
+#include "luts.h"
 
 #ifndef VOICES_H
 #define VOICES_H
index 4b4bd62109b3243e7d62ff7bc7cff4bc4b1c3ab7..1d9ab2e05c74a64c575140c0a162268e78af505d 100644 (file)
@@ -24,10 +24,13 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "action_macro.h"
 #include "debug.h"
 #include "backlight.h"
-#include "keymap_midi.h"
 #include "bootloader.h"
 #include "eeconfig.h"
 
+#ifdef MIDI_ENABLE
+       #include "keymap_midi.h"
+#endif
+
 extern keymap_config_t keymap_config;
 
 #include <stdio.h>
@@ -150,20 +153,22 @@ static action_t keycode_to_action(uint16_t keycode)
         case KC_TRNS:
             action.code = ACTION_TRANSPARENT;
             break;
-        case 0x0100 ... 0x1FFF: ;
+        case LCTL(0) ... 0x1FFF: ;
             // Has a modifier
             // Split it up
             action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
             break;
-        case 0x2000 ... 0x2FFF:
+        case FUNC(0) ... FUNC(0xFFF): ;
             // 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.
+        case M(0) ... M(0xFF):
             action.code = ACTION_MACRO(keycode & 0xFF);
             break;
+        case LT(0, 0) ... LT(0xFF, 0xF):
+            action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
+            break;
     #ifdef BACKLIGHT_ENABLE
         case BL_0 ... BL_15:
             action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F);
@@ -197,7 +202,7 @@ static action_t keycode_to_action(uint16_t keycode)
             print("\nDEBUG: enabled.\n");
             debug_enable = true;
             break;
-        case 0x5002 ... 0x50FF:
+        case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_UNSWAP_ALT_GUI:
             // MAGIC actions (BOOTMAGIC without the boot)
             if (!eeconfig_is_enabled()) {
                 eeconfig_init();
@@ -247,7 +252,7 @@ static action_t keycode_to_action(uint16_t keycode)
             }
             eeconfig_update_keymap(keymap_config.raw);
             break;
-        case 0x5100 ... 0x5FFF: ;
+        case TO(0, 1) ... OSM(0xFF): ;
             // Layer movement shortcuts
             // See .h to see constraints/usage
             int type = (keycode >> 0x8) & 0xF;
@@ -268,25 +273,19 @@ static action_t keycode_to_action(uint16_t keycode)
                 // Set default layer
                 int layer = keycode & 0xFF;
                 action.code = ACTION_LAYER_TOGGLE(layer);
+            } else if (type == 0x5) {
+                // OSL(layer) - One-shot layer
+                int layer = keycode & 0xFF;
+                action.code = ACTION_LAYER_ONESHOT(layer);
+            } else if (type == 0x6) {
+                // OSM(mod) - One-shot mod
+                int mod = keycode & 0xFF;
+                action.code = ACTION_MODS_ONESHOT(mod);
             }
             break;
-    #ifdef MIDI_ENABLE
-        case 0x6000 ... 0x6FFF:
-            action.code =  ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
-            break;
-    #endif
-        case 0x7000 ... 0x7FFF:
+        case MT(0, 0) ... MT(0xF, 0xFF):
             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;
index 0ede0296b98fbe013f71f37595d249815409bb0c..91d5c09c1cff1a7d4d630783239693efe52465a4 100644 (file)
@@ -67,6 +67,9 @@ extern const uint16_t fn_actions[];
 #define MEH(kc) kc  | 0x0700
 #define LCAG(kc) kc  | 0x0D00 // Modifier Ctrl Alt and GUI
 
+#define MOD_HYPR 0xf
+#define MOD_MEH 0x7
+
 #define RCTL(kc) kc | 0x1100
 #define RSFT(kc) kc | 0x1200
 #define RALT(kc) kc | 0x1400
@@ -84,8 +87,11 @@ extern const uint16_t fn_actions[];
 #define KC_EXCLAIM  KC_EXLM
 
 #define KC_AT   LSFT(KC_2)      // @
+
+
 #define KC_HASH LSFT(KC_3)      // #
 
+
 #define KC_DLR  LSFT(KC_4)      // $
 #define KC_DOLLAR   KC_DLR
 
@@ -107,22 +113,43 @@ extern const uint16_t fn_actions[];
 #define KC_RPRN LSFT(KC_0)      // )
 #define KC_RIGHT_PAREN  KC_RPRN
 
+
 #define KC_UNDS LSFT(KC_MINS)   // _
 #define KC_UNDERSCORE   KC_UNDS
 
 #define KC_PLUS LSFT(KC_EQL)    // +
 
+
 #define KC_LCBR LSFT(KC_LBRC)   // {
 #define KC_LEFT_CURLY_BRACE KC_LCBR
 
 #define KC_RCBR LSFT(KC_RBRC)   // }
 #define KC_RIGHT_CURLY_BRACE    KC_RCBR
 
+#define KC_LABK LSFT(KC_COMM)   // <
+#define KC_LEFT_ANGLE_BRACKET   KC_LABK
+
+#define KC_RABK LSFT(KC_DOT)    // >
+#define KC_RIGHT_ANGLE_BRACKET  KC_RABK
+
 #define KC_COLN LSFT(KC_SCLN)   // :
 #define KC_COLON    KC_COLN
 
 #define KC_PIPE LSFT(KC_BSLS)   // |
 
+#define KC_LT LSFT(KC_COMM)     // <
+
+
+#define KC_GT LSFT(KC_DOT)      // >
+
+
+#define KC_QUES LSFT(KC_SLSH)   // ?
+#define KC_QUESTION KC_QUES
+
+
+#define KC_DQT LSFT(KC_QUOT)   // "
+#define KC_DOUBLE_QUOTE KC_DQT
+
 #define KC_DELT KC_DELETE // Del key (four letter code)
 
 // Alias for function layers than expand past FN31
@@ -132,35 +159,14 @@ extern const uint16_t fn_actions[];
 #define S(kc) LSFT(kc)
 #define F(kc) FUNC(kc)
 
-#define M(kc) kc | 0x3000
+#define M(kc) (kc | 0x3000)
 
 #define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE)
 
-// These affect the backlight (if your keyboard has one).
-// We don't need to comment them out if your keyboard doesn't have a backlight,
-// since they don't take up any space.
-#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
+// 0x3100+ is free
+
+// L-ayer, T-ap - 256 keycode max, 16 layer max
+#define LT(layer, kc) (kc | 0x4000 | ((layer & 0xF) << 8))
 
 #define RESET 0x5000
 #define DEBUG 0x5001
@@ -188,6 +194,51 @@ extern const uint16_t fn_actions[];
 #define AG_SWAP MAGIC_SWAP_ALT_GUI
 #define AG_NORM MAGIC_UNSWAP_ALT_GUI
 
+#define KC_LEAD 0x5014
+
+// Audio on/off
+#define AU_ON  0x5020
+#define AU_OFF 0x5021
+#define AU_TOG 0x5022
+
+// Music mode on/off
+#define MU_ON  0x5023
+#define MU_OFF 0x5024
+#define MU_TOG 0x5025
+
+// Music voice iterate
+#define MUV_IN 0x5026
+#define MUV_DE 0x5027
+
+// Midi mode on/off
+#define MI_ON  0x5028
+#define MI_OFF 0x5029
+
+// These affect the backlight (if your keyboard has one).
+// We don't need to comment them out if your keyboard doesn't have a backlight,
+// since they don't take up any space.
+#define BL_ON 0x5079
+#define BL_OFF 0x5070
+#define BL_0 0x5070
+#define BL_1 0x5071
+#define BL_2 0x5072
+#define BL_3 0x5073
+#define BL_4 0x5074
+#define BL_5 0x5075
+#define BL_6 0x5076
+#define BL_7 0x5077
+#define BL_8 0x5078
+#define BL_9 0x5079
+#define BL_10 0x507A
+#define BL_11 0x507B
+#define BL_12 0x507C
+#define BL_13 0x507D
+#define BL_14 0x507E
+#define BL_15 0x507F
+#define BL_DEC 0x5080
+#define BL_INC 0x5081
+#define BL_TOGG 0x5082
+#define BL_STEP 0x5083
 
 // GOTO layer - 16 layers max
 // when:
@@ -205,6 +256,14 @@ extern const uint16_t fn_actions[];
 // Toggle to layer - 256 layer max
 #define TG(layer) (layer | 0x5400)
 
+// One-shot layer - 256 layer max
+#define OSL(layer) (layer | 0x5500)
+
+// One-shot mod
+#define OSM(layer) (layer | 0x5600)
+
+// chording is currently at 0x57xx
+
 // M-od, T-ap - 256 keycode max
 #define MT(mod, kc) (kc | 0x7000 | ((mod & 0xF) << 8))
 #define CTL_T(kc) MT(0x1, kc)
@@ -220,14 +279,13 @@ extern const uint16_t fn_actions[];
 #define KC_HYPR HYPR(KC_NO)
 #define KC_MEH  MEH(KC_NO)
 
-// L-ayer, T-ap - 256 keycode max, 16 layer max
-#define LT(layer, kc) (kc | 0x8000 | ((layer & 0xF) << 8))
-
-// For sending unicode codes.
-// You may not send codes over 1FFF -- this supports most of UTF8.
-// To have a key that sends out Œ, go UC(0x0152)
-#define UNICODE(n) (n | 0x8000)
-#define UC(n) UNICODE(n)
+#ifdef UNICODE_ENABLE
+    // For sending unicode codes.
+    // You may not send codes over 7FFF -- this supports most of UTF8.
+    // To have a key that sends out Œ, go UC(0x0152)
+    #define UNICODE(n) (n | 0x8000)
+    #define UC(n) UNICODE(n)
+#endif
 
 // For tri-layer
 void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3);
diff --git a/quantum/keymap_extras/keymap_german_ch.h b/quantum/keymap_extras/keymap_german_ch.h
new file mode 100644 (file)
index 0000000..0874abf
--- /dev/null
@@ -0,0 +1,102 @@
+#ifndef KEYMAP_SWISS_GERMAN
+#define KEYMAP_SWISS_GERMAN
+
+#include "keymap_common.h"
+
+// Alt gr
+#define ALGR(kc) kc | 0x1400
+#define CH_ALGR KC_RALT
+
+// normal characters
+#define CH_Z KC_Y
+#define CH_Y KC_Z
+
+#define CH_A KC_A
+#define CH_B KC_B
+#define CH_C KC_C
+#define CH_D KC_D
+#define CH_E KC_E
+#define CH_F KC_F
+#define CH_G KC_G
+#define CH_H KC_H
+#define CH_I KC_I
+#define CH_J KC_J
+#define CH_K KC_K
+#define CH_L KC_L
+#define CH_M KC_M
+#define CH_N KC_N
+#define CH_O KC_O
+#define CH_P KC_P
+#define CH_Q KC_Q
+#define CH_R KC_R
+#define CH_S KC_S
+#define CH_T KC_T
+#define CH_U KC_U
+#define CH_V KC_V
+#define CH_W KC_W
+#define CH_X KC_X
+
+#define CH_0 KC_0
+#define CH_1 KC_1
+#define CH_2 KC_2
+#define CH_3 KC_3
+#define CH_4 KC_4
+#define CH_5 KC_5
+#define CH_6 KC_6
+#define CH_7 KC_7
+#define CH_8 KC_8
+#define CH_9 KC_9
+
+#define CH_DOT KC_DOT
+#define CH_COMM KC_COMM
+
+#define CH_QUOT KC_MINS // ' ? ´
+#define CH_AE KC_QUOT
+#define CH_UE KC_LBRC
+#define CH_OE KC_SCLN
+
+#define CH_PARA KC_GRAVE // secction sign § and °
+#define CH_CARR KC_EQL // carret ^ ` ~
+#define CH_DIER KC_RBRC // dieresis ¨ ! ]
+#define CH_DLR KC_BSLS // $ £ }
+#define CH_LESS KC_NUBS // < and > and backslash
+#define CH_MINS KC_SLSH // - and _
+
+// shifted characters
+#define CH_RING LSFT(CH_PARA) // °
+#define CH_PLUS LSFT(KC_1) // +
+#define CH_DQOT LSFT(KC_2) // "
+#define CH_PAST LSFT(KC_3) // *
+#define CH_CELA  LSFT(KC_4) // ç
+#define CH_PERC LSFT(KC_5) // %
+#define CH_AMPR LSFT(KC_6) // &
+#define CH_SLSH LSFT(KC_7) // /
+#define CH_LPRN LSFT(KC_8) // (
+#define CH_RPRN LSFT(KC_9) // )
+#define CH_EQL  LSFT(KC_0) // =
+#define CH_QST  LSFT(CH_QUOT) // ?
+#define CH_GRV  LSFT(CH_CARR) // `
+#define CH_EXLM LSFT(CH_DIER) // !
+#define CH_POND LSFT(CH_DLR) // £
+#define CH_MORE LSFT(CH_LESS) // >
+#define CH_COLN LSFT(KC_DOT) // :
+#define CH_SCLN LSFT(KC_COMM) // ;
+#define CH_UNDS LSFT(CH_MINS) // _
+
+// Alt Gr-ed characters
+#define CH_BRBR ALGR(KC_1) // ¦ brocken bar
+#define CH_AT ALGR(KC_2) // @
+#define CH_HASH ALGR(KC_3) // #
+#define CH_NOTL ALGR(KC_6) // ¬ negative logic
+#define CH_PIPE ALGR(KC_7) // |
+#define CH_CENT ALGR(KC_8) // ¢ cent
+#define CH_ACUT ALGR(CH_QUOT) // ´
+#define CH_TILD ALGR(CH_CARR) // ~
+#define CH_EURO ALGR(KC_E) // €
+#define CH_LBRC ALGR(CH_UE) // [
+#define CH_RBRC ALGR(CH_DIER) // ]
+#define CH_LCBR ALGR(CH_AE) // {
+#define CH_RCBR ALGR(CH_DLR) // }
+#define CH_BSLS ALGR(CH_LESS) // backslash
+
+#endif
index 795f26380ed8fb5eb53ac5b2999e358769cb1f09..3a2bf3afff6aa4dba10e95570e21d5102f61eee8 100644 (file)
@@ -25,11 +25,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #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 SCALE (int8_t []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
+                           0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
+                           0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
+                           0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
+                           0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
 
 #define N_CN1  (0x600C + (12 * -1) + 0 )
 #define N_CN1S (0x600C + (12 * -1) + 1 )
diff --git a/quantum/keymap_unicode.c b/quantum/keymap_unicode.c
deleted file mode 100644 (file)
index a44965e..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
-Copyright 2015 Jack Humbert <jack.humb@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "keymap_common.h"
-
-uint16_t hextokeycode(int hex) {
-    if (hex == 0x0) {
-        return KC_0;
-    } else if (hex < 0xA) {
-        return KC_1 + (hex - 0x1);
-    } else {
-        return KC_A + (hex - 0xA);
-    }
-}
-
-void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-
-    // For more info on how this works per OS, see here: https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input
-
-    if (record->event.pressed) {
-        uint16_t unicode = (opt << 8) | id;
-        register_code(KC_LALT);
-
-        register_code(hextokeycode((unicode & 0xF000) >> 12));
-        unregister_code(hextokeycode((unicode & 0xF000) >> 12));
-        register_code(hextokeycode((unicode & 0x0F00) >> 8));
-        unregister_code(hextokeycode((unicode & 0x0F00) >> 8));
-        register_code(hextokeycode((unicode & 0x00F0) >> 4));
-        unregister_code(hextokeycode((unicode & 0x00F0) >> 4));
-        register_code(hextokeycode((unicode & 0x000F)));
-        unregister_code(hextokeycode((unicode & 0x000F)));
-        
-        /* Test 'a' */
-        // register_code(hextokeycode(0x0));
-        // unregister_code(hextokeycode(0x0));
-        // register_code(hextokeycode(0x0));
-        // unregister_code(hextokeycode(0x0));
-        // register_code(hextokeycode(0x6));
-        // unregister_code(hextokeycode(0x6));
-        // register_code(hextokeycode(0x1));
-        // unregister_code(hextokeycode(0x1));
-
-        unregister_code(KC_LALT);
-    }
-    return;
-}
\ No newline at end of file
index 2dab6ae941e0cf8320bb74b122b6c9151f2bdfcf..cab39e117a41bc13cb9f69d68d4b962c3a94bccb 100644 (file)
@@ -42,18 +42,25 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS];
     static matrix_row_t matrix_reversed_debouncing[MATRIX_COLS];
 #endif
 
+
+#if MATRIX_COLS > 16
+    #define SHIFTER 1UL
+#else
+    #define SHIFTER 1
+#endif
+
 static matrix_row_t read_cols(void);
 static void init_cols(void);
 static void unselect_rows(void);
 static void select_row(uint8_t row);
 
 __attribute__ ((weak))
-void matrix_init_kb(void) {
+void matrix_init_quantum(void) {
 
 }
 
 __attribute__ ((weak))
-void matrix_scan_kb(void) {
+void matrix_scan_quantum(void) {
 
 }
 
@@ -86,7 +93,7 @@ void matrix_init(void)
         matrix_debouncing[i] = 0;
     }
 
-    matrix_init_kb();
+    matrix_init_quantum();
 }
 
 
@@ -150,7 +157,7 @@ uint8_t matrix_scan(void)
     }
 #endif
 
-    matrix_scan_kb();
+    matrix_scan_quantum();
 
     return 1;
 }
@@ -235,15 +242,15 @@ static matrix_row_t read_cols(void)
 #endif
 
         if ((col & 0xF0) == 0x20) { 
-            result |= (PINB&(1<<(col & 0x0F)) ? 0 : (1<<x)); 
+            result |= (PINB&(1<<(col & 0x0F)) ? 0 : (SHIFTER<<x)); 
         } else if ((col & 0xF0) == 0x30) { 
-            result |= (PINC&(1<<(col & 0x0F)) ? 0 : (1<<x)); 
+            result |= (PINC&(1<<(col & 0x0F)) ? 0 : (SHIFTER<<x)); 
         } else if ((col & 0xF0) == 0x40) { 
-            result |= (PIND&(1<<(col & 0x0F)) ? 0 : (1<<x)); 
+            result |= (PIND&(1<<(col & 0x0F)) ? 0 : (SHIFTER<<x)); 
         } else if ((col & 0xF0) == 0x50) { 
-            result |= (PINE&(1<<(col & 0x0F)) ? 0 : (1<<x)); 
+            result |= (PINE&(1<<(col & 0x0F)) ? 0 : (SHIFTER<<x)); 
         } else if ((col & 0xF0) == 0x60) { 
-            result |= (PINF&(1<<(col & 0x0F)) ? 0 : (1<<x)); 
+            result |= (PINF&(1<<(col & 0x0F)) ? 0 : (SHIFTER<<x)); 
         } 
     }
     return result;
diff --git a/quantum/quantum.c b/quantum/quantum.c
new file mode 100644 (file)
index 0000000..34c575a
--- /dev/null
@@ -0,0 +1,463 @@
+#include "quantum.h"
+#include "timer.h"
+
+__attribute__ ((weak))
+void matrix_init_kb(void) {}
+
+__attribute__ ((weak))
+void matrix_scan_kb(void) {}
+
+__attribute__ ((weak))
+bool process_action_kb(keyrecord_t *record) {
+  return true;
+}
+
+__attribute__ ((weak))
+void leader_start(void) {}
+
+__attribute__ ((weak))
+void leader_end(void) {}
+
+uint8_t starting_note = 0x0C;
+int offset = 7;
+
+#ifdef AUDIO_ENABLE
+  bool music_activated = false;
+  float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
+
+  // music sequencer
+  static bool music_sequence_recording = false;
+  static bool music_sequence_playing = false;
+  static float music_sequence[16] = {0};
+  static uint8_t music_sequence_count = 0;
+  static uint8_t music_sequence_position = 0;
+
+  static uint16_t music_sequence_timer = 0;
+  static uint16_t music_sequence_interval = 100;
+
+#endif
+
+#ifdef MIDI_ENABLE
+  bool midi_activated = false;
+#endif
+
+// Leader key stuff
+bool leading = false;
+uint16_t leader_time = 0;
+
+uint16_t leader_sequence[3] = {0, 0, 0};
+uint8_t leader_sequence_size = 0;
+
+// Chording stuff
+#define CHORDING_MAX 4
+bool chording = false;
+
+uint8_t chord_keys[CHORDING_MAX] = {0};
+uint8_t chord_key_count = 0;
+uint8_t chord_key_down = 0;
+
+#ifdef UNICODE_ENABLE
+  static uint8_t input_mode;
+#endif
+
+bool keys_chord(uint8_t keys[]) {
+  uint8_t keys_size = sizeof(keys)/sizeof(keys[0]);
+  bool pass = true;
+  uint8_t in = 0;
+  for (uint8_t i = 0; i < chord_key_count; i++) {
+    bool found = false;
+    for (uint8_t j = 0; j < keys_size; j++) {
+      if (chord_keys[i] == (keys[j] & 0xFF)) {
+        in++; // detects key in chord
+        found = true;
+        break;
+      }
+    }
+    if (found)
+      continue;
+    if (chord_keys[i] != 0)  {
+      pass = false; // makes sure rest are blank
+    }
+  }
+  return (pass && (in == keys_size));
+}
+
+#ifdef UNICODE_ENABLE
+
+uint16_t hex_to_keycode(uint8_t hex)
+{
+  if (hex == 0x0) {
+    return KC_0;
+  } else if (hex < 0xA) {
+    return KC_1 + (hex - 0x1);
+  } else {
+    return KC_A + (hex - 0xA);
+  }
+}
+
+void set_unicode_mode(uint8_t os_target)
+{
+  input_mode = os_target;
+}
+
+#endif
+
+bool process_record_quantum(keyrecord_t *record) {
+
+  /* This gets the keycode from the key pressed */
+  keypos_t key = record->event.key;
+  uint16_t keycode;
+
+  #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
+    uint8_t layer;
+
+    if (record->event.pressed) {
+      layer = layer_switch_get_layer(key);
+      update_source_layers_cache(key, layer);
+    } else {
+      layer = read_source_layers_cache(key);
+    }
+    keycode = keymap_key_to_keycode(layer, key);
+  #else
+    keycode = keymap_key_to_keycode(layer_switch_get_layer(key), key);
+  #endif
+
+    // This is how you use actions here
+    // if (keycode == KC_LEAD) {
+    //   action_t action;
+    //   action.code = ACTION_DEFAULT_LAYER_SET(0);
+    //   process_action(record, action);
+    //   return false;
+    // }
+
+  #ifdef MIDI_ENABLE
+    if (keycode == MI_ON && record->event.pressed) {
+      midi_activated = true;
+      play_music_scale();
+      return false;
+    }
+
+    if (keycode == MI_OFF && record->event.pressed) {
+      midi_activated = false;
+      midi_send_cc(&midi_device, 0, 0x7B, 0);
+      return false;
+    }
+
+    if (midi_activated) {
+      if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) {
+          if (record->event.pressed) {
+              starting_note++; // Change key
+              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 false;
+      }
+      if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) {
+          if (record->event.pressed) {
+              starting_note--; // Change key
+              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 false;
+      }
+      if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
+          offset++; // Change scale
+          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 false;
+      }
+      if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
+          offset--; // Change scale
+          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 false;
+      }
+      // basic
+      // uint8_t note = (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row);
+      // advanced
+      // uint8_t note = (starting_note + record->event.key.col + offset)+12*(MATRIX_ROWS - record->event.key.row);
+      // guitar
+      uint8_t note = (starting_note + record->event.key.col + offset)+5*(MATRIX_ROWS - record->event.key.row);
+      // violin
+      // uint8_t note = (starting_note + record->event.key.col + offset)+7*(MATRIX_ROWS - record->event.key.row);
+
+      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, note, 127);
+      } else {
+        // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
+        midi_send_noteoff(&midi_device, 0, note, 127);
+      }
+
+      if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through
+        return false;
+    }
+  #endif
+
+  #ifdef AUDIO_ENABLE
+    if (keycode == AU_ON && record->event.pressed) {
+      audio_on();
+      return false;
+    }
+
+    if (keycode == AU_OFF && record->event.pressed) {
+      audio_off();
+      return false;
+    }
+
+    if (keycode == AU_TOG && record->event.pressed) {
+        if (is_audio_on())
+        {
+            audio_off();
+        }
+        else
+        {
+            audio_on();
+        }
+      return false;
+    }
+
+    if (keycode == MU_ON && record->event.pressed) {
+      music_on();
+      return false;
+    }
+
+    if (keycode == MU_OFF && record->event.pressed) {
+      music_off();
+      return false;
+    }
+
+    if (keycode == MU_TOG && record->event.pressed) {
+        if (music_activated)
+        {
+          music_off();
+        }
+        else
+        {
+          music_on();
+        }
+        return false;
+    }
+
+    if (keycode == MUV_IN && record->event.pressed) {
+      voice_iterate();
+      play_music_scale();
+      return false;
+    }
+
+    if (keycode == MUV_DE && record->event.pressed) {
+      voice_deiterate();
+      play_music_scale();
+      return false;
+    }
+
+    if (music_activated) {
+
+      if (keycode == KC_LCTL && record->event.pressed) { // Start recording
+        stop_all_notes();
+        music_sequence_recording = true;
+        music_sequence_playing = false;
+        music_sequence_count = 0;
+        return false;
+      }
+      if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing
+        stop_all_notes();
+        music_sequence_recording = false;
+        music_sequence_playing = false;
+        return false;
+      }
+      if (keycode == KC_LGUI && record->event.pressed) { // Start playing
+        stop_all_notes();
+        music_sequence_recording = false;
+        music_sequence_playing = true;
+        music_sequence_position = 0;
+        music_sequence_timer = 0;
+        return false;
+      }
+
+      if (keycode == KC_UP) {
+        if (record->event.pressed)
+          music_sequence_interval-=10;
+        return false;
+      }
+      if (keycode == KC_DOWN) {
+        if (record->event.pressed)
+          music_sequence_interval+=10;
+        return false;
+      }
+
+      float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row));
+      if (record->event.pressed) {
+        play_note(freq, 0xF);
+        if (music_sequence_recording) {
+          music_sequence[music_sequence_count] = freq;
+          music_sequence_count++;
+        }
+      } else {
+        stop_note(freq);
+      }
+
+      if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through
+        return false;
+    }
+  #endif
+
+#ifndef DISABLE_LEADER
+  // Leader key set-up
+  if (record->event.pressed) {
+    if (!leading && keycode == KC_LEAD) {
+      leader_start();
+      leading = true;
+      leader_time = timer_read();
+      leader_sequence_size = 0;
+      leader_sequence[0] = 0;
+      leader_sequence[1] = 0;
+      leader_sequence[2] = 0;
+      return false;
+    }
+    if (leading && timer_elapsed(leader_time) < LEADER_TIMEOUT) {
+      leader_sequence[leader_sequence_size] = keycode;
+      leader_sequence_size++;
+      return false;
+    }
+  }
+#endif
+
+#define DISABLE_CHORDING
+#ifndef DISABLE_CHORDING
+
+  if (keycode >= 0x5700 && keycode <= 0x57FF) {
+    if (record->event.pressed) {
+      if (!chording) {
+        chording = true;
+        for (uint8_t i = 0; i < CHORDING_MAX; i++)
+          chord_keys[i] = 0;
+        chord_key_count = 0;
+        chord_key_down = 0;
+      }
+      chord_keys[chord_key_count] = (keycode & 0xFF);
+      chord_key_count++;
+      chord_key_down++;
+      return false;
+    } else {
+      if (chording) {
+        chord_key_down--;
+        if (chord_key_down == 0) {
+          chording = false;
+          // Chord Dictionary
+          if (keys_chord((uint8_t[]){KC_ENTER, KC_SPACE})) {
+            register_code(KC_A);
+            unregister_code(KC_A);
+            return false;
+          }
+          for (uint8_t i = 0; i < chord_key_count; i++) {
+            register_code(chord_keys[i]);
+            unregister_code(chord_keys[i]);
+            return false;
+          }
+        }
+      }
+    }
+  }
+
+#endif
+
+#ifdef UNICODE_ENABLE
+
+  if (keycode > UNICODE(0) && record->event.pressed) {
+    uint16_t unicode = keycode & 0x7FFF;
+    switch(input_mode) {
+      case UC_OSX:
+        register_code(KC_LALT);
+        break;
+      case UC_LNX:
+        register_code(KC_LCTL);
+        register_code(KC_LSFT);
+        register_code(KC_U);
+        unregister_code(KC_U);
+        break;
+      case UC_WIN:
+        register_code(KC_LALT);
+        register_code(KC_PPLS);
+        unregister_code(KC_PPLS);
+        break;
+    }
+    for(int i = 3; i >= 0; i--) {
+        uint8_t digit = ((unicode >> (i*4)) & 0xF);
+        register_code(hex_to_keycode(digit));
+        unregister_code(hex_to_keycode(digit));
+    }
+    switch(input_mode) {
+      case UC_OSX:
+      case UC_WIN:
+        unregister_code(KC_LALT);
+        break;
+      case UC_LNX:
+        unregister_code(KC_LCTL);
+        unregister_code(KC_LSFT);
+        break;
+    }
+  }
+
+#endif
+
+  return process_action_kb(record);
+}
+
+void matrix_init_quantum() {
+  matrix_init_kb();
+}
+
+void matrix_scan_quantum() {
+  #ifdef AUDIO_ENABLE
+  if (music_sequence_playing) {
+    if ((music_sequence_timer == 0) || (timer_elapsed(music_sequence_timer) > music_sequence_interval)) {
+      music_sequence_timer = timer_read();
+      stop_note(music_sequence[(music_sequence_position - 1 < 0)?(music_sequence_position - 1 + music_sequence_count):(music_sequence_position - 1)]);
+      play_note(music_sequence[music_sequence_position], 0xF);
+      music_sequence_position = (music_sequence_position + 1) % music_sequence_count;
+    }
+  }
+
+  #endif
+
+  matrix_scan_kb();
+}
+#ifdef AUDIO_ENABLE
+  bool is_music_on(void) {
+      return (music_activated != 0);
+  }
+
+  void music_toggle(void) {
+      if (!music_activated) {
+          music_on();
+      } else {
+          music_off();
+      }
+  }
+
+  void music_on(void) {
+      music_activated = 1;
+      music_on_user();
+  }
+
+  void music_off(void) {
+      music_activated = 0;
+      stop_all_notes();
+  }
+
+#endif
+__attribute__ ((weak))
+void music_on_user() {}
diff --git a/quantum/quantum.h b/quantum/quantum.h
new file mode 100644 (file)
index 0000000..d4da772
--- /dev/null
@@ -0,0 +1,72 @@
+#ifndef QUANTUM_H
+#define QUANTUM_H
+
+#include "matrix.h"
+#include "keymap_common.h"
+#ifdef BACKLIGHT_ENABLE
+    #include "backlight.h"
+#endif
+#ifdef RGBLIGHT_ENABLE
+  #include "rgblight.h"
+#endif
+#ifdef AUDIO_ENABLE
+  #include "audio.h"
+#endif
+#ifdef MIDI_ENABLE
+       #include <lufa.h>
+#endif
+#ifdef UNICODE_ENABLE
+       #include "unicode.h"
+#endif
+
+#include "action_layer.h"
+#include "eeconfig.h"
+#include <stddef.h>
+#include <avr/io.h>
+
+extern uint32_t default_layer_state;
+
+#ifndef NO_ACTION_LAYER
+       extern uint32_t layer_state;
+#endif
+
+#ifdef AUDIO_ENABLE
+       bool music_activated;
+#endif
+
+#ifdef UNICODE_ENABLE
+       #define UC_OSX 0
+       #define UC_LNX 1
+       #define UC_WIN 2
+       #define UC_BSD 3
+
+       void set_unicode_input_mode(uint8_t os_target);
+#endif
+
+#ifndef DISABLE_LEADER
+       void leader_start(void);
+       void leader_end(void);
+
+       #ifndef LEADER_TIMEOUT
+               #define LEADER_TIMEOUT 200
+       #endif
+       #define SEQ_ONE_KEY(key) if (leader_sequence[0] == (key) && leader_sequence[1] == 0 && leader_sequence[2] == 0)
+       #define SEQ_TWO_KEYS(key1, key2) if (leader_sequence[0] == (key1) && leader_sequence[1] == (key2) && leader_sequence[2] == 0)
+       #define SEQ_THREE_KEYS(key1, key2, key3) if (leader_sequence[0] == (key1) && leader_sequence[1] == (key2) && leader_sequence[2] == (key3))
+
+       #define LEADER_EXTERNS() extern bool leading; extern uint16_t leader_time; extern uint16_t leader_sequence[3]; extern uint8_t leader_sequence_size
+       #define LEADER_DICTIONARY() if (leading && timer_elapsed(leader_time) > LEADER_TIMEOUT)
+#endif
+
+void matrix_init_kb(void);
+void matrix_scan_kb(void);
+bool process_action_kb(keyrecord_t *record);
+
+bool is_music_on(void);
+void music_toggle(void);
+void music_on(void);
+void music_off(void);
+
+void music_on_user(void);
+
+#endif
\ No newline at end of file
index 83c4f1d1db82f8dd833b2a7f1903e5f3af7426d9..c099d67939a8eed138af0d2d7e80b1f0ad3aa295 100644 (file)
@@ -1,7 +1,8 @@
 QUANTUM_DIR = quantum
 
 # # project specific files
-SRC += $(QUANTUM_DIR)/keymap_common.c \
+SRC += $(QUANTUM_DIR)/quantum.c \
+       $(QUANTUM_DIR)/keymap_common.c \
        $(QUANTUM_DIR)/led.c
 
 # ifdef KEYMAP_FILE
@@ -23,16 +24,14 @@ ifndef CUSTOM_MATRIX
        SRC += $(QUANTUM_DIR)/matrix.c
 endif
 
-ifeq ($(strip $(MIDI_ENABLE)), yes)
-       SRC += $(QUANTUM_DIR)/keymap_midi.c
-endif
+#ifeq ($(strip $(MIDI_ENABLE)), yes)
+#      SRC += $(QUANTUM_DIR)/keymap_midi.c
+#endif
 
 ifeq ($(strip $(AUDIO_ENABLE)), yes)
-       SRC += $(QUANTUM_DIR)/audio/audio.c $(QUANTUM_DIR)/audio/voices.c
-endif
-
-ifeq ($(strip $(UNICODE_ENABLE)), yes)
-       SRC += $(QUANTUM_DIR)/keymap_unicode.c
+    SRC += $(QUANTUM_DIR)/audio/audio.c
+    SRC += $(QUANTUM_DIR)/audio/voices.c
+    SRC += $(QUANTUM_DIR)/audio/luts.c
 endif
 
 ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
index 6050a2d20c572da19b337d338d777cc395a193d6..649072eb2e2ea3cc671279a8eb4c619ac3da2665 100644 (file)
@@ -11,8 +11,9 @@ void matrix_scan_user(void) {
 }
 
 __attribute__ ((weak))
-void process_action_user(keyrecord_t *record) {
+bool process_action_user(keyrecord_t *record) {
        // leave this function blank - it can be defined in a keymap file
+    return true;
 }
 
 __attribute__ ((weak))
@@ -34,11 +35,11 @@ void matrix_scan_kb(void) {
        matrix_scan_user();
 }
 
-void process_action_kb(keyrecord_t *record) {
+bool 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);
+       return process_action_user(record);
 }
 
 void led_set_kb(uint8_t usb_led) {
index 22742105a39b465cd4b223c6a3e073ff9c17aac9..8537e3b4be5303e319f0136e7408808ec5d5d8b3 100644 (file)
@@ -24,7 +24,7 @@
 
 void matrix_init_user(void);
 void matrix_scan_user(void);
-void process_action_user(keyrecord_t *record);
+bool process_action_user(keyrecord_t *record);
 void led_set_user(uint8_t usb_led);
 
 #endif
index 0702144238f243a81fedaee810d1be75bc18da43..5f355256def834c3b0e5105354ee73b782802da0 100644 (file)
@@ -1,6 +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
+    dfu-programmer atmega32u4 flash --eeprom eeprom_reset.hex
 
- 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
+ You'll need to reflash afterwards, because DFU requires the flash to be erased before messing with the eeprom.
diff --git a/quantum/unicode.h b/quantum/unicode.h
new file mode 100644 (file)
index 0000000..756ec8b
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+Copyright 2016 Jack Humbert <jack.humb@gmail.com>
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef UNICODE_H
+#define UNICODE_H
+
+#include "quantum.h"
+#include <math.h>
+
+#define UC_BSPC        UC(0x0008)
+
+#define UC_SPC UC(0x0020)
+
+#define UC_EXLM        UC(0x0021)
+#define UC_DQUT        UC(0x0022)
+#define UC_HASH        UC(0x0023)
+#define UC_DLR UC(0x0024)
+#define UC_PERC        UC(0x0025)
+#define UC_AMPR        UC(0x0026)
+#define UC_QUOT        UC(0x0027)
+#define UC_LPRN        UC(0x0028)
+#define UC_RPRN        UC(0x0029)
+#define UC_ASTR        UC(0x002A)
+#define UC_PLUS        UC(0x002B)
+#define UC_COMM        UC(0x002C)
+#define UC_DASH        UC(0x002D)
+#define UC_DOT UC(0x002E)
+#define UC_SLSH        UC(0x002F)
+
+#define UC_0   UC(0x0030)
+#define UC_1   UC(0x0031)
+#define UC_2   UC(0x0032)
+#define UC_3   UC(0x0033)
+#define UC_4   UC(0x0034)
+#define UC_5   UC(0x0035)
+#define UC_6   UC(0x0036)
+#define UC_7   UC(0x0037)
+#define UC_8   UC(0x0038)
+#define UC_9   UC(0x0039)
+
+#define UC_COLN UC(0x003A)
+#define UC_SCLN UC(0x003B)
+#define UC_LT  UC(0x003C)
+#define UC_EQL UC(0x003D)
+#define UC_GT  UC(0x003E)
+#define UC_QUES        UC(0x003F)
+#define UC_AT  UC(0x0040)
+
+#define UC_A   UC(0x0041)
+#define UC_B   UC(0x0042)
+#define UC_C   UC(0x0043)
+#define UC_D   UC(0x0044)
+#define UC_E   UC(0x0045)
+#define UC_F   UC(0x0046)
+#define UC_G   UC(0x0047)
+#define UC_H   UC(0x0048)
+#define UC_I   UC(0x0049)
+#define UC_J   UC(0x004A)
+#define UC_K   UC(0x004B)
+#define UC_L   UC(0x004C)
+#define UC_M   UC(0x004D)
+#define UC_N   UC(0x004E)
+#define UC_O   UC(0x004F)
+#define UC_P   UC(0x0050)
+#define UC_Q   UC(0x0051)
+#define UC_R   UC(0x0052)
+#define UC_S   UC(0x0053)
+#define UC_T   UC(0x0054)
+#define UC_U   UC(0x0055)
+#define UC_V   UC(0x0056)
+#define UC_W   UC(0x0057)
+#define UC_X   UC(0x0058)
+#define UC_Y   UC(0x0059)
+#define UC_Z   UC(0x005A)
+
+#define UC_LBRC        UC(0x005B)
+#define UC_BSLS        UC(0x005C)
+#define UC_RBRC        UC(0x005D)
+#define UC_CIRM        UC(0x005E)
+#define UC_UNDR        UC(0x005F)
+
+#define UC_GRV         UC(0x0060)
+
+#define UC_a   UC(0x0061)
+#define UC_b   UC(0x0062)
+#define UC_c   UC(0x0063)
+#define UC_d   UC(0x0064)
+#define UC_e   UC(0x0065)
+#define UC_f   UC(0x0066)
+#define UC_g   UC(0x0067)
+#define UC_h   UC(0x0068)
+#define UC_i   UC(0x0069)
+#define UC_j   UC(0x006A)
+#define UC_k   UC(0x006B)
+#define UC_l   UC(0x006C)
+#define UC_m   UC(0x006D)
+#define UC_n   UC(0x006E)
+#define UC_o   UC(0x006F)
+#define UC_p   UC(0x0070)
+#define UC_q   UC(0x0071)
+#define UC_r   UC(0x0072)
+#define UC_s   UC(0x0073)
+#define UC_t   UC(0x0074)
+#define UC_u   UC(0x0075)
+#define UC_v   UC(0x0076)
+#define UC_w   UC(0x0077)
+#define UC_x   UC(0x0078)
+#define UC_y   UC(0x0079)
+#define UC_z   UC(0x007A)
+
+#define UC_LCBR        UC(0x007B)
+#define UC_PIPE        UC(0x007C)
+#define UC_RCBR        UC(0x007D)
+#define UC_TILD        UC(0x007E)
+#define UC_DEL UC(0x007F)
+
+#endif
\ No newline at end of file
index 9cb2eb8ecd0916b3bff2bddf7962425a38e40f94..b5d7e39dd16173cd7861ddf1d5456700115d6f64 100644 (file)
@@ -60,6 +60,10 @@ ifeq ($(strip $(AUDIO_ENABLE)), yes)
     OPT_DEFS += -DAUDIO_ENABLE
 endif
 
+ifeq ($(strip $(UNICODE_ENABLE)), yes)
+    OPT_DEFS += -DUNICODE_ENABLE
+endif
+
 ifeq ($(strip $(USB_6KRO_ENABLE)), yes)
     OPT_DEFS += -DUSB_6KRO_ENABLE
 endif
index f9e6c17dc3bd9c37044f322424107ca15ec65563..be6dea2b799d6a8223984b52c86095b2caf46fae 100644 (file)
@@ -46,7 +46,7 @@ void action_exec(keyevent_t event)
 #ifndef NO_ACTION_TAPPING
     action_tapping_process(record);
 #else
-    process_action(&record);
+    process_record(&record);
     if (!IS_NOEVENT(record.event)) {
         dprint("processed: "); debug_record(record); dprintln();
     }
@@ -56,34 +56,32 @@ void action_exec(keyevent_t event)
 #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
 bool disable_action_cache = false;
 
-void process_action_nocache(keyrecord_t *record)
+void process_record_nocache(keyrecord_t *record)
 {
     disable_action_cache = true;
-    process_action(record);
+    process_record(record);
     disable_action_cache = false;
 }
 #else
-void process_action_nocache(keyrecord_t *record)
+void process_record_nocache(keyrecord_t *record)
 {
-    process_action(record);
+    process_record(record);
 }
 #endif
 
 __attribute__ ((weak))
-void process_action_kb(keyrecord_t *record) {}
+bool process_record_quantum(keyrecord_t *record) {
+    return true;
+}
 
-void process_action(keyrecord_t *record)
+void process_record(keyrecord_t *record) 
 {
-    keyevent_t event = record->event;
-#ifndef NO_ACTION_TAPPING
-    uint8_t tap_count = record->tap.count;
-#endif
-
-    if (IS_NOEVENT(event)) { return; }
+    if (IS_NOEVENT(record->event)) { return; }
 
-    process_action_kb(record);
+    if(!process_record_quantum(record))
+        return;
 
-    action_t action = store_or_get_action(event.pressed, event.key);
+    action_t action = store_or_get_action(record->event.pressed, record->event.key);
     dprint("ACTION: "); debug_action(action);
 #ifndef NO_ACTION_LAYER
     dprint(" layer_state: "); layer_debug();
@@ -91,10 +89,37 @@ void process_action(keyrecord_t *record)
 #endif
     dprintln();
 
+    process_action(record, action);
+}
+
+void process_action(keyrecord_t *record, action_t action)
+{
+    bool do_release_oneshot = false;
+    keyevent_t event = record->event;
+#ifndef NO_ACTION_TAPPING
+    uint8_t tap_count = record->tap.count;
+#endif
+
+#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
+    if (has_oneshot_layer_timed_out()) {
+        dprintf("Oneshot layer: timeout\n");
+        clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+    }
+#endif
+
     if (event.pressed) {
         // clear the potential weak mods left by previously pressed keys
         clear_weak_mods();
     }
+
+#ifndef NO_ACTION_ONESHOT
+    // notice we only clear the one shot layer if the pressed key is not a modifier.
+    if (is_oneshot_layer_active() && event.pressed && !IS_MOD(action.key.code)) {
+        clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+        do_release_oneshot = !is_oneshot_layer_active();
+    }
+#endif
+
     switch (action.kind.id) {
         /* Key and Mods */
         case ACT_LMODS:
@@ -139,24 +164,37 @@ void process_action(keyrecord_t *record)
                         // Oneshot modifier
                         if (event.pressed) {
                             if (tap_count == 0) {
+                                dprint("MODS_TAP: Oneshot: 0\n");
                                 register_mods(mods);
-                            }
-                            else if (tap_count == 1) {
+                            } else if (tap_count == 1) {
                                 dprint("MODS_TAP: Oneshot: start\n");
                                 set_oneshot_mods(mods);
-                            }
-                            else {
+                    #if defined(ONESHOT_TAP_TOGGLE) && ONESHOT_TAP_TOGGLE > 1
+                            } else if (tap_count == ONESHOT_TAP_TOGGLE) {
+                                dprint("MODS_TAP: Toggling oneshot");
+                                clear_oneshot_mods();
+                                set_oneshot_locked_mods(mods);
+                                register_mods(mods);
+                    #endif
+                            } else {
                                 register_mods(mods);
                             }
                         } else {
                             if (tap_count == 0) {
                                 clear_oneshot_mods();
                                 unregister_mods(mods);
-                            }
-                            else if (tap_count == 1) {
+                            } else if (tap_count == 1) {
                                 // Retain Oneshot mods
-                            }
-                            else {
+                    #if defined(ONESHOT_TAP_TOGGLE) && ONESHOT_TAP_TOGGLE > 1
+                                if (mods & get_mods()) {
+                                    clear_oneshot_locked_mods();
+                                    clear_oneshot_mods();
+                                    unregister_mods(mods);
+                                }
+                            } else if (tap_count == ONESHOT_TAP_TOGGLE) {
+                                // Toggle Oneshot Layer
+                    #endif
+                            } else {
                                 clear_oneshot_mods();
                                 unregister_mods(mods);
                             }
@@ -309,6 +347,44 @@ void process_action(keyrecord_t *record)
                     event.pressed ? layer_move(action.layer_tap.val) :
                                     layer_clear();
                     break;
+            #ifndef NO_ACTION_ONESHOT
+                case OP_ONESHOT:
+                    // Oneshot modifier
+                #if defined(ONESHOT_TAP_TOGGLE) && ONESHOT_TAP_TOGGLE > 1
+                    do_release_oneshot = false;
+                    if (event.pressed) {
+                        del_mods(get_oneshot_locked_mods());
+                        if (get_oneshot_layer_state() == ONESHOT_TOGGLED) {
+                            reset_oneshot_layer();
+                            layer_off(action.layer_tap.val);
+                            break;
+                        } else if (tap_count < ONESHOT_TAP_TOGGLE) {
+                            layer_on(action.layer_tap.val);
+                            set_oneshot_layer(action.layer_tap.val, ONESHOT_START);
+                        }
+                    } else {
+                        add_mods(get_oneshot_locked_mods());
+                        if (tap_count >= ONESHOT_TAP_TOGGLE) {
+                            reset_oneshot_layer();
+                            clear_oneshot_locked_mods();
+                            set_oneshot_layer(action.layer_tap.val, ONESHOT_TOGGLED);
+                        } else {
+                            clear_oneshot_layer_state(ONESHOT_PRESSED);
+                        }
+                    }
+                #else
+                    if (event.pressed) {
+                        layer_on(action.layer_tap.val);
+                        set_oneshot_layer(action.layer_tap.val, ONESHOT_START);
+                    } else {
+                        clear_oneshot_layer_state(ONESHOT_PRESSED);
+                        if (tap_count > 1) {
+                            clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+                        }
+                    }
+                #endif
+                    break;
+            #endif
                 default:
                     /* tap key */
                     if (event.pressed) {
@@ -372,6 +448,18 @@ void process_action(keyrecord_t *record)
         default:
             break;
     }
+
+#ifndef NO_ACTION_ONESHOT
+    /* Because we switch layers after a oneshot event, we need to release the
+     * key before we leave the layer or no key up event will be generated.
+     */
+    if (do_release_oneshot && !(get_oneshot_layer_state() & ONESHOT_PRESSED )   ) {
+        record->event.pressed = false;
+        layer_on(get_oneshot_layer());
+        process_record(record);
+        layer_off(get_oneshot_layer());
+    }
+#endif
 }
 
 
@@ -560,6 +648,7 @@ bool is_tap_key(keypos_t key)
             switch (action.layer_tap.code) {
                 case 0x00 ... 0xdf:
                 case OP_TAP_TOGGLE:
+                case OP_ONESHOT:
                     return true;
             }
             return false;
index 44ec3047ba5a03a0fdb33c39edee4085c7b7e92c..e8aa12a7cbda9fefde923411b46a7d4ea166b419 100644 (file)
@@ -59,14 +59,15 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt);
 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt);
 
 /* keyboard-specific key event (pre)processing */
-void process_action_kb(keyrecord_t *record);
+bool process_record_quantum(keyrecord_t *record);
 
 /* Utilities for actions.  */
 #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
 extern bool disable_action_cache;
 #endif
-void process_action_nocache(keyrecord_t *record);
-void process_action(keyrecord_t *record);
+void process_record_nocache(keyrecord_t *record);
+void process_record(keyrecord_t *record);
+void process_action(keyrecord_t *record, action_t action);
 void register_code(uint8_t code);
 void unregister_code(uint8_t code);
 void register_mods(uint8_t mods);
index 2b0b0b077ef16292006588f5f0e3e7cecbf55615..ca729aaece26a8e3b7ea0ffd72f40989867c0782 100644 (file)
@@ -76,7 +76,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * 101E|LLLL|1111 0001   On/Off                 (0xF1)   [NOT TAP]
  * 101E|LLLL|1111 0010   Off/On                 (0xF2)   [NOT TAP]
  * 101E|LLLL|1111 0011   Set/Clear              (0xF3)   [NOT TAP]
- * 101E|LLLL|1111 xxxx   Reserved               (0xF4-FF)
+ * 101E|LLLL|1111 0100   One Shot Layer         (0xF4)   [TAP]
+ * 101E|LLLL|1111 xxxx   Reserved               (0xF5-FF)
  *   ELLLL: layer 0-31(E: extra bit for layer 16-31)
  *
  *
@@ -250,6 +251,7 @@ enum layer_pram_tap_op {
     OP_ON_OFF,
     OP_OFF_ON,
     OP_SET_CLEAR,
+    OP_ONESHOT,
 };
 #define ACTION_LAYER_BITOP(op, part, bits, on)      (ACT_LAYER<<12 | (op)<<10 | (on)<<8 | (part)<<5 | ((bits)&0x1f))
 #define ACTION_LAYER_TAP(layer, key)                (ACT_LAYER_TAP<<12 | (layer)<<8 | (key))
@@ -266,6 +268,7 @@ enum layer_pram_tap_op {
 #define ACTION_LAYER_ON_OFF(layer)                  ACTION_LAYER_TAP((layer), OP_ON_OFF)
 #define ACTION_LAYER_OFF_ON(layer)                  ACTION_LAYER_TAP((layer), OP_OFF_ON)
 #define ACTION_LAYER_SET_CLEAR(layer)               ACTION_LAYER_TAP((layer), OP_SET_CLEAR)
+#define ACTION_LAYER_ONESHOT(layer)                 ACTION_LAYER_TAP((layer), OP_ONESHOT)
 #define ACTION_LAYER_MODS(layer, mods)              ACTION_LAYER_TAP((layer), 0xe0 | ((mods)&0x0f))
 /* With Tapping */
 #define ACTION_LAYER_TAP_KEY(layer, key)            ACTION_LAYER_TAP((layer), (key))
index e6343e6da7f9f759e1b2b2038899de2753e18275..ff78d7f2aba08efd7f60e9806390692fc901e049 100644 (file)
@@ -89,7 +89,7 @@ bool process_tapping(keyrecord_t *keyp)
                     debug("Tapping: First tap(0->1).\n");
                     tapping_key.tap.count = 1;
                     debug_tapping_key();
-                    process_action(&tapping_key);
+                    process_record(&tapping_key);
 
                     // copy tapping state
                     keyp->tap = tapping_key.tap;
@@ -103,7 +103,7 @@ bool process_tapping(keyrecord_t *keyp)
                  */
                 else if (IS_RELEASED(event) && waiting_buffer_typed(event)) {
                     debug("Tapping: End. No tap. Interfered by typing key\n");
-                    process_action(&tapping_key);
+                    process_record(&tapping_key);
                     tapping_key = (keyrecord_t){};
                     debug_tapping_key();
                     // enqueue
@@ -131,7 +131,7 @@ bool process_tapping(keyrecord_t *keyp)
                     }
                     // Release of key should be process immediately.
                     debug("Tapping: release event of a key pressed before tapping\n");
-                    process_action(keyp);
+                    process_record(keyp);
                     return true;
                 }
                 else {
@@ -148,7 +148,7 @@ bool process_tapping(keyrecord_t *keyp)
                 if (IS_TAPPING_KEY(event.key) && !event.pressed) {
                     debug("Tapping: Tap release("); debug_dec(tapping_key.tap.count); debug(")\n");
                     keyp->tap = tapping_key.tap;
-                    process_action(keyp);
+                    process_record(keyp);
                     tapping_key = *keyp;
                     debug_tapping_key();
                     return true;
@@ -157,7 +157,7 @@ bool process_tapping(keyrecord_t *keyp)
                     if (tapping_key.tap.count > 1) {
                         debug("Tapping: Start new tap with releasing last tap(>1).\n");
                         // unregister key
-                        process_action(&(keyrecord_t){
+                        process_record(&(keyrecord_t){
                                 .tap = tapping_key.tap,
                                 .event.key = tapping_key.event.key,
                                 .event.time = event.time,
@@ -175,7 +175,7 @@ bool process_tapping(keyrecord_t *keyp)
                     if (!IS_NOEVENT(event)) {
                         debug("Tapping: key event while last tap(>0).\n");
                     }
-                    process_action(keyp);
+                    process_record(keyp);
                     return true;
                 }
             }
@@ -185,7 +185,7 @@ bool process_tapping(keyrecord_t *keyp)
             if (tapping_key.tap.count == 0) {
                 debug("Tapping: End. Timeout. Not tap(0): ");
                 debug_event(event); debug("\n");
-                process_action(&tapping_key);
+                process_record(&tapping_key);
                 tapping_key = (keyrecord_t){};
                 debug_tapping_key();
                 return false;
@@ -193,7 +193,7 @@ bool process_tapping(keyrecord_t *keyp)
                 if (IS_TAPPING_KEY(event.key) && !event.pressed) {
                     debug("Tapping: End. last timeout tap release(>0).");
                     keyp->tap = tapping_key.tap;
-                    process_action(keyp);
+                    process_record(keyp);
                     tapping_key = (keyrecord_t){};
                     return true;
                 }
@@ -201,7 +201,7 @@ bool process_tapping(keyrecord_t *keyp)
                     if (tapping_key.tap.count > 1) {
                         debug("Tapping: Start new tap with releasing last timeout tap(>1).\n");
                         // unregister key
-                        process_action(&(keyrecord_t){
+                        process_record(&(keyrecord_t){
                                 .tap = tapping_key.tap,
                                 .event.key = tapping_key.event.key,
                                 .event.time = event.time,
@@ -219,7 +219,7 @@ bool process_tapping(keyrecord_t *keyp)
                     if (!IS_NOEVENT(event)) {
                         debug("Tapping: key event while last timeout tap(>0).\n");
                     }
-                    process_action(keyp);
+                    process_record(keyp);
                     return true;
                 }
             }
@@ -233,7 +233,7 @@ bool process_tapping(keyrecord_t *keyp)
                         keyp->tap = tapping_key.tap;
                         if (keyp->tap.count < 15) keyp->tap.count += 1;
                         debug("Tapping: Tap press("); debug_dec(keyp->tap.count); debug(")\n");
-                        process_action(keyp);
+                        process_record(keyp);
                         tapping_key = *keyp;
                         debug_tapping_key();
                         return true;
@@ -253,12 +253,12 @@ bool process_tapping(keyrecord_t *keyp)
                     // should none in buffer
                     // FIX: interrupted when other key is pressed
                     tapping_key.tap.interrupted = true;
-                    process_action(keyp);
+                    process_record(keyp);
                     return true;
                 }
             } else {
                 if (!IS_NOEVENT(event)) debug("Tapping: other key just after tap.\n");
-                process_action(keyp);
+                process_record(keyp);
                 return true;
             }
         } else {
@@ -280,7 +280,7 @@ bool process_tapping(keyrecord_t *keyp)
             debug_tapping_key();
             return true;
         } else {
-            process_action(keyp);
+            process_record(keyp);
             return true;
         }
     }
@@ -347,7 +347,7 @@ void waiting_buffer_scan_tap(void)
                 WITHIN_TAPPING_TERM(waiting_buffer[i].event)) {
             tapping_key.tap.count = 1;
             waiting_buffer[i].tap.count = 1;
-            process_action(&tapping_key);
+            process_record(&tapping_key);
 
             debug("waiting_buffer_scan_tap: found at ["); debug_dec(i); debug("]\n");
             debug_waiting_buffer();
index a2d6577b24dae29d44de82032bdfeadc97bba00a..61ff202befa510b9d08f3604f7fad50c607c11b7 100644 (file)
@@ -18,6 +18,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "report.h"
 #include "debug.h"
 #include "action_util.h"
+#include "action_layer.h"
 #include "timer.h"
 
 static inline void add_key_byte(uint8_t code);
@@ -47,11 +48,70 @@ report_keyboard_t *keyboard_report = &(report_keyboard_t){};
 
 #ifndef NO_ACTION_ONESHOT
 static int8_t oneshot_mods = 0;
+static int8_t oneshot_locked_mods = 0;
+int8_t get_oneshot_locked_mods(void) { return oneshot_locked_mods; }
+void set_oneshot_locked_mods(int8_t mods) { oneshot_locked_mods = mods; }
+void clear_oneshot_locked_mods(void) { oneshot_locked_mods = 0; }
 #if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
 static int16_t oneshot_time = 0;
+inline bool has_oneshot_mods_timed_out() {
+  return TIMER_DIFF_16(timer_read(), oneshot_time) >= ONESHOT_TIMEOUT;
+}
 #endif
 #endif
 
+/* oneshot layer */
+#ifndef NO_ACTION_ONESHOT
+/* oneshot_layer_data bits
+* LLLL LSSS
+* where:
+*   L => are layer bits
+*   S => oneshot state bits
+*/
+static int8_t oneshot_layer_data = 0;
+
+inline uint8_t get_oneshot_layer(void) { return oneshot_layer_data >> 3; }
+inline uint8_t get_oneshot_layer_state(void) { return oneshot_layer_data & 0b111; }
+
+#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
+static int16_t oneshot_layer_time = 0;
+inline bool has_oneshot_layer_timed_out() {
+    return TIMER_DIFF_16(timer_read(), oneshot_layer_time) >= ONESHOT_TIMEOUT &&
+        !(get_oneshot_layer_state() & ONESHOT_TOGGLED);
+}
+#endif
+
+/* Oneshot layer */
+void set_oneshot_layer(uint8_t layer, uint8_t state)
+{
+    oneshot_layer_data = layer << 3 | state;
+    layer_on(layer);
+#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
+    oneshot_layer_time = timer_read();
+#endif
+}
+void reset_oneshot_layer(void) {
+    oneshot_layer_data = 0;
+#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
+    oneshot_layer_time = 0;
+#endif
+}
+void clear_oneshot_layer_state(oneshot_fullfillment_t state)
+{
+    uint8_t start_state = oneshot_layer_data;
+    oneshot_layer_data &= ~state;
+    if (!get_oneshot_layer_state() && start_state != oneshot_layer_data) {
+        layer_off(get_oneshot_layer());
+#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
+    oneshot_layer_time = 0;
+#endif
+    }
+}
+bool is_oneshot_layer_active(void)
+{
+    return get_oneshot_layer_state();
+}
+#endif
 
 void send_keyboard_report(void) {
     keyboard_report->mods  = real_mods;
@@ -60,7 +120,7 @@ void send_keyboard_report(void) {
 #ifndef NO_ACTION_ONESHOT
     if (oneshot_mods) {
 #if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
-        if (TIMER_DIFF_16(timer_read(), oneshot_time) >= ONESHOT_TIMEOUT) {
+        if (has_oneshot_mods_timed_out()) {
             dprintf("Oneshot: timeout\n");
             clear_oneshot_mods();
         }
@@ -70,6 +130,7 @@ void send_keyboard_report(void) {
             clear_oneshot_mods();
         }
     }
+
 #endif
     host_keyboard_send(keyboard_report);
 }
@@ -143,11 +204,12 @@ void clear_oneshot_mods(void)
     oneshot_time = 0;
 #endif
 }
+uint8_t get_oneshot_mods(void)
+{
+    return oneshot_mods;
+}
 #endif
 
-
-
-
 /*
  * inspect keyboard state
  */
index 1a95cec10ec1ced084be192e7dd172602564e99e..dd0c4c2bfe71c56669c53a27161c41b9c2942502 100644 (file)
@@ -56,10 +56,30 @@ void clear_macro_mods(void);
 
 /* oneshot modifier */
 void set_oneshot_mods(uint8_t mods);
+uint8_t get_oneshot_mods(void);
 void clear_oneshot_mods(void);
 void oneshot_toggle(void);
 void oneshot_enable(void);
 void oneshot_disable(void);
+bool has_oneshot_mods_timed_out(void);
+
+int8_t get_oneshot_locked_mods(void);
+void set_oneshot_locked_mods(int8_t mods);
+void clear_oneshot_locked_mods(void);
+
+typedef enum {
+  ONESHOT_PRESSED = 0b01,
+  ONESHOT_OTHER_KEY_PRESSED = 0b10,
+  ONESHOT_START = 0b11,
+  ONESHOT_TOGGLED = 0b100
+} oneshot_fullfillment_t;
+void set_oneshot_layer(uint8_t layer, uint8_t state);
+uint8_t get_oneshot_layer(void);
+void clear_oneshot_layer_state(oneshot_fullfillment_t state);
+void reset_oneshot_layer(void);
+bool is_oneshot_layer_active(void);
+uint8_t get_oneshot_layer_state(void);
+bool has_oneshot_layer_timed_out(void);
 
 /* inspect */
 uint8_t has_anykey(void);
index 2f6fc1cd6c40a5e41b35e6f8dba8754746900925..c9e8fd3fd2ddbe3fce3afd0096f13f3cfab1f2c2 100644 (file)
@@ -83,3 +83,8 @@ void backlight_level(uint8_t level)
     eeconfig_update_backlight(backlight_config.raw);
     backlight_set(backlight_config.level);
 }
+
+uint8_t get_backlight_level(void)
+{
+    return backlight_config.level;
+}
\ No newline at end of file
index 525ec8bbef067e8377d4874a66d0de04cc3221c0..f5730926745c579426abd896010b2745193aff59 100644 (file)
@@ -36,5 +36,6 @@ void backlight_toggle(void);
 void backlight_step(void);
 void backlight_set(uint8_t level);
 void backlight_level(uint8_t level);
+uint8_t get_backlight_level(void);
 
 #endif
index f06abaf7f02b9af7374cba20127d5ca0efd493b7..9edcc42a05b48fc56ad3115acd517d394f60d31f 100644 (file)
@@ -357,9 +357,11 @@ static bool command_common(uint8_t code)
             clear_keyboard(); // clear to prevent stuck keys
             print("\n\nJumping to bootloader... ");
             #ifdef AUDIO_ENABLE
+                   stop_all_notes();
                 play_goodbye_tone();
+            #else
+                   _delay_ms(1000);
             #endif
-            _delay_ms(1000);
             bootloader_jump(); // not return
             break;
 
index 0b013fc989aedd8a10a2a50c9f2f9c7b7a61a74a..ad0871bfb735f85254bfcc5d14285e215aef0093 100644 (file)
@@ -64,8 +64,8 @@ void matrix_power_up(void);
 void matrix_power_down(void);
 
 /* keyboard-specific setup/loop functionality */
-void matrix_init_kb(void);
-void matrix_scan_kb(void);
+void matrix_init_quantum(void);
+void matrix_scan_quantum(void);
 
 #ifdef __cplusplus
 }
index 93309ada4761f356ee82b7bba2b3871ad7a236dc..5e18656e5bf180747a7137c2778a8603c87fe0ca 100644 (file)
@@ -16,10 +16,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #ifndef NODEBUG_H
-#define NODEBUG_H 1
+#define NODEBUG_H
 
-#define NO_DEBUG
-#include "debug.h"
-#undef NO_DEBUG
+#ifndef NO_DEBUG
+       #define NO_DEBUG
+       #include "debug.h"
+       #undef NO_DEBUG
+#else
+       #include "debug.h"
+#endif
 
 #endif
index d4a129b208150062ff8a7bf7705396ce1d1f32a5..4d42fbe5cb95ac2f69d1a024e28d9d780ed51e8d 100644 (file)
@@ -528,14 +528,20 @@ This is a feature to assign both toggle layer and momentary switch layer action
 
 
 ### 4.3 Oneshot Modifier
-This runs onetime effects which modify only on just one following key. It works as normal modifier key when holding down while oneshot modifier when tapping.
+This runs onetime effects which modify only on just one following key. It works as normal modifier key when holding down while oneshot modifier when tapping. The behavior of oneshot modifiers is similar to the [sticky keys](https://en.wikipedia.org/wiki/StickyKeys) functionality found in most operating systems.
 
     ACTION_MODS_ONESHOT(MOD_LSFT)
 
+Oneshot layer key:
+
+    ACTION_LAYER_ONESHOT(MY_LAYER)
+
 Say you want to type 'The', you have to push and hold Shift key before type 't' then release it before type 'h' and 'e', otherwise you'll get 'THe' or 'the' unintentionally. With Oneshot Modifier you can tap Shift then type 't', 'h' and 'e' normally, you don't need to holding Shift key properly here. This mean you can release Shift before 't' is pressed down.
 
 Oneshot effect is cancel unless following key is pressed down within `ONESHOT_TIMEOUT` of `config.h`. No timeout when it is `0` or not defined.
 
+Most implementations of sticky keys allow you to lock a modifier by double tapping the modifier. The layer then remains locked untill the modifier is tapped again. To enable this behaviour for oneshot modifiers set `ONESHOT_TAP_TOGGLE` to the number taps required. The feature is disabled if `ONESHOT_TAP_TOGGLE<2` or not defined.
+
 
 ### 4.4 Tap Toggle Mods
 Similar to layer tap toggle, this works as a momentary modifier when holding, but toggles on with several taps. A single tap will 'unstick' the modifier again.
index f03f9a9b929429e1d6b4fbc3aa7783c733f0ecbe..aba94cd597f9dc12955fe5125560cf5b8fe18b22 100644 (file)
@@ -883,7 +883,7 @@ int main(void)
     midi_register_cc_callback(&midi_device, cc_callback);
     midi_register_sysex_callback(&midi_device, sysex_callback);
 
-    init_notes();
+    // init_notes();
     // midi_send_cc(&midi_device, 0, 1, 2);
     // midi_send_cc(&midi_device, 15, 1, 0);
     // midi_send_noteon(&midi_device, 0, 64, 127);
index 860fc1a9310da970ebecba597c150802f522f37e..552f32331a9b1939c734574c0af2cb4f18abdafd 100644 (file)
@@ -142,6 +142,9 @@ CFLAGS += $(CSTANDARD)
 ifdef CONFIG_H
     CFLAGS += -include $(CONFIG_H)
 endif
+ifdef CONFIG_USER_H
+    CFLAGS += -include $(CONFIG_USER_H)
+endif
 
 
 #---------------- Compiler Options C++ ----------------
@@ -176,6 +179,9 @@ CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
 ifdef CONFIG_H
     CPPFLAGS += -include $(CONFIG_H)
 endif
+ifdef CONFIG_USER_H
+    CPPFLAGS += -include $(CONFIG_USER_H)
+endif
 
 
 #---------------- Assembler Options ----------------
@@ -192,6 +198,9 @@ ASFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
 ifdef CONFIG_H
     ASFLAGS += -include $(CONFIG_H)
 endif
+ifdef CONFIG_USER_H
+    ASFLAGS += -include $(CONFIG_USER_H)
+endif
 
 
 #---------------- Library Options ----------------
@@ -419,7 +428,7 @@ flip: $(TARGET).hex
        batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
        batchisp -hardware usb -device $(MCU) -operation start reset 0
 
-dfu: $(TARGET).hex
+dfu: $(TARGET).hex sizeafter
 ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1)))
        dfu-programmer $(MCU) erase --force
 else