Merge remote-tracking branch 'upstream/master'

pull/324/head
Tobias Matt 8 years ago
commit 65645fb8ca

4
.gitignore vendored

@ -16,8 +16,8 @@ build/
.vagrant/
.DS_STORE
# Eclipse Settings
# Eclipse/PyCharm/Other IDE Settings
.cproject
.project
.settings/
.idea

@ -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

@ -1,11 +1,13 @@
# Quantum MK Firmware
# Quantum Mechanical Keyboard Firmware
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) and the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard.
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.
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).
The OLKB product firmwares are maintained by Jack, the Ergodox EZ by Erez, and the Clueboard by [Zach White](https://github.com/skullydazed).
## Important background info: TMK documentation
The documentation below explains QMK customizations and elaborates on some of the more useful features of TMK. To understand the base firmware, and especially what *layers* are and how they work, please see [TMK_README.md](/TMK_README.md).
@ -31,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).
@ -39,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
@ -78,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.
@ -211,6 +227,23 @@ This will clear all keys besides the mods currently pressed.
If the user attempts to activate layer 1 AND layer 2 at the same time (for example, by hitting their respective layer keys), layer 3 will be activated. Layers 1 and 2 will _also_ be activated, for the purposes of fallbacks (so a given key will fall back from 3 to 2, to 1 -- and only then to 0).
#### Naming your macros
If you have a bunch of macros you want to refer to from your keymap, while keeping the keymap easily readable, you can just name them like so:
```
#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)
```
As was done on the [Planck default keymap](/keyboard/planck/keymaps/default/keymap.c#L33-L40)
#### Timer functionality
It's possible to start timers and read values for time-specific events - here's an example:
@ -227,11 +260,91 @@ if (timer_elapsed(key_timer) < 100) {
It's best to declare the `static uint16_t key_timer;` outside of the macro block (top of file, etc).
#### Example 1: Single-key copy/paste (hold to copy, tap to paste)
With QMK, it's easy to make one key do two things, as long as one of those things is being a modifier. :) So if you want a key to act as Ctrl when held and send the letter R when tapped, that's easy: `CTL_T(KC_R)`. But what do you do when you want that key to send Ctrl-V (paste) when tapped, and Ctrl-C (copy) when held?
Here's what you do:
```
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.
}
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) > 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap.
return MACRO( D(LCTL), T(C), U(LCTL), END );
}
else {
return MACRO( D(LCTL), T(V), U(LCTL), END );
}
}
break;
}
}
return MACRO_NONE;
};
```
And then, to assign this macro to a key on your keyboard layout, you just use `M(0)` on the key you want to press for copy/paste.
#### Example 2: Space Cadet Shift (making it easy to send opening and closing parentheses)
In the [Modern Space Cadet Keyboard](http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#shift-parentheses), one of cooler features is the Shift Parentheses. To quote Steve Losh:
> When held while pressing other keys, act like Shift.
> When pressed and released on their own, type an opening or closing parenthesis (left and right shift respectively).
```
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) < 150) { // 150 being 150ms, 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) < 150) {
register_code(KC_0);
unregister_code(KC_0);
}
unregister_code(KC_RSFT);
}
break;
}
}
return MACRO_NONE;
};
```
And then, to assign this macro to a key on your keyboard layout, you just use `M(0)` on the key you want to press for left shift/opening parens, and `M(1)` for right shift/closing parens.
## Additional keycode aliases for software-implemented layouts (Colemak, Dvorak, etc)
Everything is assuming you're in Qwerty (in software) by default, but there is built-in support for using a Colemak or Dvorak layout by including this at the top of your keymap:
#include <keymap_extras/keymap_colemak.h>
#include <keymap_colemak.h>
If you use Dvorak, use `keymap_dvorak.h` instead of `keymap_colemak.h` for this line. After including this line, you will get access to:
@ -264,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.

@ -171,10 +171,6 @@ endif
endif
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
SRC := backlight.c $(SRC)
endif
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax

@ -2,27 +2,27 @@
__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
// leave this function blank - it can be defined in a keymap file
}
__attribute__ ((weak))
void led_set_user(uint8_t usb_led) {
// leave this function blank - it can be defined in a keymap file
// leave this function blank - it can be defined in a keymap file
}
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
// put your keyboard start-up code here
// runs once when the firmware starts up
MCUCR |= (1<<JTD);
MCUCR |= (1<<JTD);
@ -35,25 +35,290 @@ 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
// put your per-action keyboard code here
// runs for every action, just before processing by the firmware
process_action_user(record);
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()
{
// Setup PB7 as output and output low.
DDRB |= (1<<7);
PORTB &= ~(1<<7);
// Use full 16-bit resolution.
ICR1 = 0xFFFF;
// I could write a wall of text here to explain... but TL;DW
// Go read the ATmega32u4 datasheet.
// And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
// Pin PB7 = OCR1C (Timer 1, Channel C)
// Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
// (i.e. start high, go low when counter matches.)
// WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
// Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
backlight_init();
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;
}
else if ( level >= BACKLIGHT_LEVELS )
{
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness to max
CHANNEL = 0xFFFF;
}
else
{
// 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

@ -3,8 +3,11 @@
#include "matrix.h"
#include "keymap_common.h"
#include "backlight.h"
#ifdef BACKLIGHT_ENABLE
#include "backlight.h"
#endif
#include <stddef.h>
#include <avr/io.h>
// This a shortcut to help you visually see your layout.
// The following is an example using the Planck MIT layout
@ -30,4 +33,20 @@ void 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

@ -1,63 +0,0 @@
#include <avr/io.h>
#include "backlight.h"
#include "atomic.h"
#define CHANNEL OCR1C
void backlight_init_ports()
{
// Setup PB7 as output and output low.
DDRB |= (1<<7);
PORTB &= ~(1<<7);
// Use full 16-bit resolution.
ICR1 = 0xFFFF;
// I could write a wall of text here to explain... but TL;DW
// Go read the ATmega32u4 datasheet.
// And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
// Pin PB7 = OCR1C (Timer 1, Channel C)
// Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
// (i.e. start high, go low when counter matches.)
// WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
// Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
backlight_init();
}
void backlight_set(uint8_t level)
{
if ( level == 0 )
{
// Turn off PWM control on PB7, revert to output low.
TCCR1A &= ~(_BV(COM1C1));
CHANNEL = 0x0;
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
}
else if ( level == BACKLIGHT_LEVELS )
{
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness
CHANNEL = 0xFFFF;
}
else
{
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness
CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
}
}

@ -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

@ -8,42 +8,45 @@
#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_MUSIC 7
#define LAYER_ADJUST 8
#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)
@ -53,12 +56,15 @@
#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 MUS_TOG M(MACRO_MUSIC_TOGGLE)
#define AUD_TOG M(MACRO_AUDIO_TOGGLE)
#define VC_UP M(MACRO_INC_VOICE)
#define VC_DOWN M(MACRO_DEC_VOICE)
@ -74,6 +80,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 +99,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 | RAISED | XXXXXX . SPACE | LOWER | RALT | HOME | END | 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_LGUI, 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 +121,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 | RAISED | XXXXXX . SPACE | LOWER | RALT | HOME | END | 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_LGUI, 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 +143,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 | RAISED | XXXXXX . SPACE | LOWER | RALT | HOME | END | 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_LGUI, 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 +209,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 +219,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
#endif
[LAYER_MUSIC] = { /* MUSIC */
[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 },
{ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_UPPER, 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, _______, _______, _______, MUS_TOG, AUD_TOG, ________________ },
{ _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______ },
{ _______, _______, _______, _______, _______, RESET, _______, M_MOUSE, _______, _______, _______, ________________, VC_UP, _______ },
{ _______, _______, _______, _______, M_BACKL, RESET, _______, M_MOUSE, _______, _______, _______, ________________, VC_UP, _______ },
{ _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, VC_DOWN, _______ },
},
/*
[LAYER_EMPTY] = {
[LAYER_EMPTY] = { // LAYER
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______ },
@ -242,6 +276,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,11 +286,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);
PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO);
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO);
#endif /* AUDIO_ENABLE */
}
break;
@ -263,7 +328,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);
PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
#endif /* AUDIO_ENABLE */
}
break;
@ -271,44 +338,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);
PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO);
#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;
@ -324,6 +400,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
#endif /* MOUSEKEY_ENABLE */
#ifdef AUDIO_ENABLE
case MACRO_TIMBRE_1:
if (record->event.pressed) set_timbre(TIMBRE_12);
@ -357,42 +434,34 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
}
break;
case MACRO_AUDIO_OFF:
case MACRO_AUDIO_TOGGLE:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
audio_off();
#endif
}
break;
case MACRO_AUDIO_ON:
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;
@ -416,6 +485,16 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
}
break;
#endif /* AUDIO_ENABLE */
#ifdef BACKLIGHT_ENABLE
case MACRO_BACKLIGHT:
if (record->event.pressed)
{
backlight_step();
}
#endif
default:
break;
@ -460,36 +539,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 (!is_playing_notes())
{
// 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);
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;
}
@ -503,7 +586,8 @@ 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();
}
#endif /* AUDIO_ENABLE */

@ -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

@ -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}

@ -0,0 +1,137 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# Target file name (without extension).
TARGET = clueboard1
# Directory common source filess exist
TOP_DIR = ../..
TMK_DIR = ../../tmk_core
# Directory keyboard dependent files exist
TARGET_DIR = .
# # project specific files
SRC = clueboard1.c \
led.c
ifdef KEYMAP
SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
else
SRC := keymaps/keymap_default.c $(SRC)
endif
CONFIG_H = config.h
# MCU name
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
AUDIO_ENABLE = no
RGBLIGHT_ENABLE = no # Enable keyboard underlight functionality
MIDI_ENABLE = no # MIDI controls
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR)
include $(TOP_DIR)/quantum/quantum.mk

@ -0,0 +1,23 @@
#include "clueboard1.h"
__attribute__ ((weak))
void matrix_init_user(void) {
// leave these blank
}
__attribute__ ((weak))
void matrix_scan_user(void) {
// leave these blank
}
void matrix_init_kb(void) {
#ifdef RGBLIGHT_ENABLE
rgblight_init();
#endif
matrix_init_user();
}
void matrix_scan_kb(void) {
matrix_scan_user();
}

@ -0,0 +1,52 @@
#ifndef CLUEBOARD1_H
#define CLUEBOARD1_H
#include "matrix.h"
#include "keymap_common.h"
#include <stddef.h>
/* Clueboard matrix layout
* ,-----------------------------------------------------------. ,---.
* | 00| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| | 0F|
* |-----------------------------------------------------------| |---|
* | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C| 1D| | 1F|
* |-----------------------------------------------------------| `---'
* | 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 2A| 2B| 2C| 2D|
* |------------------------------------------------------------.
* | 30| 31| 32| 33| 34| 35| 36| 37| 38| 39| 3A| 3B| 3C| 3D|3E|
* |------------------------------------------------------------------.
* | 40| 41| 42| 43| 45| 46| 49| 4A| 4B| 4C| 4D| 4E| 4F|
* `------------------------------------------------------------------'
* ,-----------------------------------------------------------. ,---.
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Yen| BS| |Ins|
* |-----------------------------------------------------------| |---|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|
* |-----------------------------------------------------------| `---'
* |Caps | A| S| D| F| G| H| J| k| L| ;| '| # | Ent|
* |--------------------------------------------------------------.
* |Shift| \| Z| X| C| V| B| N| M| ,| .| /| \|Shift| Up|
* |------------------------------------------------------------------.
* |Ctrl|Alt|Gui |MHen| Space| Space|Henk|Gui |Ctrl| Fn|Left|Down|Rgt|
* `------------------------------------------------------------------'
*/
// The first section contains all of the arguements
// The second converts the arguments into a two-dimensional array
#define KEYMAP( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1F, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, k3E, \
k40, k41, k42, k43, k45, k46, k49, k4A, k4B, k4C, k4D, k4E, k4F \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, KC_NO, k1F }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, k3E }, \
{ k40, k41, k42, k43, KC_NO, k45, k46, KC_NO, KC_NO, k49, k4A, k4B, k4C, k4D, k4E, k4F } \
}
void matrix_init_user(void);
void matrix_scan_user(void);
#endif

@ -0,0 +1,96 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xC1ED
#define PRODUCT_ID 0x2301
#define DEVICE_VER 0x0003
#define MANUFACTURER Clueboard
#define PRODUCT Clueboard
#define DESCRIPTION QMK keyboard firmware for Clueboard
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 16
// COLS: Left to right, ROWS: Top to bottom
/* Column pin configuration
* col: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
* pin: B3 F1 F4 F5 F6 C7 C6 B6 B5 B4 D7 D6 D4 F7 B0 B1
*/
#define COLS (int []){ B3, F1, F4, F5, F6, C7, C6, B6, B5, B4, D7, D6, D4, F7, B0, B1 }
/* Row pin configuration
* row: 0 1 2 3 4
* pin: D1 D0 D2 D5 D3
*/
#define ROWS (int []){ D1, D0, D2, D5, D3 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* Underlight configuration
*/
#define ws2812_PORTREG PORTB
#define ws2812_DDRREG DDRB
#define ws2812_pin 2
#define RGBLED_NUM 14 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,184 @@
#include "clueboard1.h"
#ifdef RGBLIGHT_ENABLE
#include "rgblight.h"
#endif
// Used for SHIFT_ESC
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
// 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 _BL 0
#define _FL 1
#define _RS 2
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer
* ,--------------------------------------------------------------------------. ,----.
* |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP|
* |--------------------------------------------------------------------------| |----|
* | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN|
* |--------------------------------------------------------------------------| `----'
* |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent|
* |-----------------------------------------------------------------------------.
* |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP|
* |------------------------------------------------------------------------|----|----.
* | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT|
* `----------------------------------------------------------------------------------'
*/
[_BL] = KEYMAP(
F(0), 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_GRV, KC_BSPC, KC_PGUP, \
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_PGDN, \
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_NUHS, KC_ENT, \
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \
KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT),
/* Keymap _FL: Function Layer
* ,--------------------------------------------------------------------------. ,----.
* | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN|
* |--------------------------------------------------------------------------| |----|
* | | | | | | | | |PScr|SLck|Paus| | | | |BLDE|
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | |PGUP|
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL|HOME|PGDN| END|
* `----------------------------------------------------------------------------------'
*/
[_FL] = KEYMAP(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, BL_STEP, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_HOME, KC_PGDN, KC_END),
/* Keymap _RS: Reset layer
* ,--------------------------------------------------------------------------. ,----.
* | | | | | | | | | | | | | | | | | |
* |--------------------------------------------------------------------------| |----|
* | | | | |RESET| | | | | | | | | | | |
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL| | | |
* `----------------------------------------------------------------------------------'
*/
[_RS] = KEYMAP(
#ifdef RGBLIGHT_ENABLE
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), F(7), \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(8), \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), F(5), \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, F(2), F(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(4), F(6), F(3)),
#else
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_TRNS, KC_TRNS, KC_TRNS),
#endif
};
enum function_id {
SHIFT_ESC,
#ifdef RGBLIGHT_ENABLE
RGBLED_TOGGLE,
RGBLED_STEP_MODE,
RGBLED_INCREASE_HUE,
RGBLED_DECREASE_HUE,
RGBLED_INCREASE_SAT,
RGBLED_DECREASE_SAT,
RGBLED_INCREASE_VAL,
RGBLED_DECREASE_VAL
#endif
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_FUNCTION(SHIFT_ESC),
#ifdef RGBLIGHT_ENABLE
[1] = ACTION_FUNCTION(RGBLED_TOGGLE),
[2] = ACTION_FUNCTION(RGBLED_STEP_MODE),
[3] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
[4] = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
[5] = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
[6] = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
[7] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
[8] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
#endif
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
static uint8_t shift_esc_shift_mask;
switch (id) {
case SHIFT_ESC:
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
if (record->event.pressed) {
if (shift_esc_shift_mask) {
add_key(KC_GRV);
send_keyboard_report();
} else {
add_key(KC_ESC);
send_keyboard_report();
}
} else {
if (shift_esc_shift_mask) {
del_key(KC_GRV);
send_keyboard_report();
} else {
del_key(KC_ESC);
send_keyboard_report();
}
}
break;
//led operations
#ifdef RGBLIGHT_ENABLE
case RGBLED_TOGGLE:
if (record->event.pressed) {
rgblight_toggle();
}
break;
case RGBLED_INCREASE_HUE:
if (record->event.pressed) {
rgblight_increase_hue();
}
break;
case RGBLED_DECREASE_HUE:
if (record->event.pressed) {
rgblight_decrease_hue();
}
break;
case RGBLED_INCREASE_SAT:
if (record->event.pressed) {
rgblight_increase_sat();
}
break;
case RGBLED_DECREASE_SAT:
if (record->event.pressed) {
rgblight_decrease_sat();
}
break;
case RGBLED_INCREASE_VAL:
if (record->event.pressed) {
rgblight_increase_val();
}
break;
case RGBLED_DECREASE_VAL:
if (record->event.pressed) {
rgblight_decrease_val();
}
break;
case RGBLED_STEP_MODE:
if (record->event.pressed) {
rgblight_step();
}
break;
#endif
}
}

@ -0,0 +1,32 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <avr/io.h>
#include "stdint.h"
#include "led.h"
void led_set_kb(uint8_t usb_led) {
DDRF |= (1<<0);
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
// Turn capslock on
PORTF |= (1<<0);
} else {
// Turn capslock off
PORTF &= ~(1<<0);
}
}

@ -0,0 +1,141 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# Target file name (without extension).
TARGET = clueboard2
# Directory common source filess exist
TOP_DIR = ../..
TMK_DIR = ../../tmk_core
# Directory keyboard dependent files exist
TARGET_DIR = .
# # project specific files
SRC = clueboard2.c led.c
ifdef KEYMAP
SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
else
SRC := keymaps/keymap_default.c $(SRC)
endif
CONFIG_H = config.h
# MCU name
#MCU = at90usb1287
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
RGBLIGHT_ENABLE = no # Enable keyboard underlight functionality (+4870)
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality (+1150)
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
#ifdef BACKLIGHT_ENABLE
SRC := backlight.c $(SRC)
#endif
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR)
include $(TOP_DIR)/quantum/quantum.mk

@ -0,0 +1,41 @@
#include <avr/io.h>
#include "backlight.h"
#include "print.h"
/* Clueboard 2.0 LED locations:
*
* Capslock: B4, pull high to turn on
* LCtrl: Shared with Capslock, DO NOT INSTALL LED'S IN BOTH
* Page Up: B7, pull high to turn on
* Escape: D6, pull high to turn on
* Arrows: D4, pull high to turn on
*/
void init_backlight_pin(void) {
print("init_backlight_pin()\n");
// Set our LED pins as output
DDRD |= (1<<6); // Esc
DDRB |= (1<<7); // Page Up
DDRD |= (1<<4); // Arrows
// Set our LED pins low
PORTD &= ~(1<<6); // Esc
PORTB &= ~(1<<7); // Page Up
PORTD &= ~(1<<4); // Arrows
}
void backlight_set(uint8_t level) {
if ( level == 0 ) {
// Turn off light
PORTD |= (1<<6); // Esc
PORTB |= (1<<7); // Page Up
PORTD |= (1<<4); // Arrows
} else {
// Turn on light
PORTD &= ~(1<<6); // Esc
PORTB &= ~(1<<7); // Page Up
PORTD &= ~(1<<4); // Arrows
}
}

@ -0,0 +1,44 @@
#include "clueboard2.h"
#ifdef BACKLIGHT_ENABLE
#include "backlight.h"
#endif
__attribute__ ((weak))
void matrix_init_user(void) {
// leave these blank
};
__attribute__ ((weak))
void matrix_scan_user(void) {
// leave these blank
};
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
if (matrix_init_user) {
(*matrix_init_user)();
}
led_init_ports();
#ifdef BACKLIGHT_ENABLE
init_backlight_pin();
#endif
#ifdef RGBLIGHT_ENABLE
rgblight_init();
#endif
// JTAG disable for PORT F. write JTD bit twice within four cycles.
MCUCR |= (1<<JTD);
MCUCR |= (1<<JTD);
};
void matrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
if (matrix_scan_user) {
(*matrix_scan_user)();
}
};

@ -0,0 +1,57 @@
#ifndef CLUEBOARD2_H
#define CLUEBOARD2_H
#include "matrix.h"
#include "keymap_common.h"
#include <stddef.h>
/* Clueboard matrix layout
* ,-----------------------------------------------------------. ,---.
* | 00| 01| 02| 03| 04| 05| 06| 07| 50| 51| 52| 53| 54| 55| 56| | 57|
* |-----------------------------------------------------------| |---|
* | 10| 11| 12| 13| 14| 15| 16| 17| 60| 61| 62| 63| 64| 65| | 67|
* |-----------------------------------------------------------| `---'
* | 20| 21| 22| 23| 24| 25| 26| 27| 70| 71| 72| 73| 74| 75|
* |------------------------------------------------------------.
* | 30| 31| 32| 33| 34| 35| 36| 37| 80| 81| 82| 83| 84| 85|86|
* |------------------------------------------------------------------.
* | 40| 41| 42| 43| 45| 46| 90| 91| 92| 93| 94| 95| 96|
* `------------------------------------------------------------------'
* ,-----------------------------------------------------------. ,---.
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Yen| BS| |Ins|
* |-----------------------------------------------------------| |---|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|
* |-----------------------------------------------------------| `---'
* |Caps | A| S| D| F| G| H| J| k| L| ;| '| # | Ent|
* |--------------------------------------------------------------.
* |Shift| \| Z| X| C| V| B| N| M| ,| .| /| \|Shift| Up|
* |------------------------------------------------------------------.
* |Ctrl|Alt|Gui |MHen| Space| Space|Henk|Gui |Ctrl| Fn|Left|Down|Rgt|
* `------------------------------------------------------------------'
*/
// The first section contains all of the arguments
// The second converts the arguments into a two-dimensional array
#define KEYMAP( \
k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k55, k56, k57, \
k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k74, k75, \
k30, k31, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k84, k85, k86, \
k40, k41, k42, k43, k45, k46, k90, k92, k93, k94, k95, k96, k97 \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07 }, \
{ k10, k11, k12, k13, k14, k15, k16, k17 }, \
{ k20, k21, k22, k23, k24, k25, k26, k27 }, \
{ k30, k31, k32, k33, k34, k35, k36, k37 }, \
{ k40, k41, k42, k43, KC_NO, k45, k46, KC_NO }, \
{ k50, k51, k52, k53, k54, k55, k56, k57 }, \
{ k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
{ k70, k71, k72, k73, k74, k75, KC_NO, KC_NO }, \
{ k80, k81, k82, k83, k84, k85, k86, KC_NO }, \
{ k90, KC_NO, k92, k93, k94, k95, k96, k97 } \
}
void matrix_init_user(void);
void matrix_scan_user(void);
#endif

@ -0,0 +1,100 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xC1ED
#define PRODUCT_ID 0x2320
#define DEVICE_VER 0x0001
#define MANUFACTURER Clueboard
#define PRODUCT Clueboard with RGB Underlighting
#define DESCRIPTION QMK keyboard firmware for Clueboard
/* key matrix size */
#define MATRIX_ROWS 10
#define MATRIX_COLS 8
// COLS: Left to right, ROWS: Top to bottom
/* Column pin configuration
* col: 0 1 2 3 4 5 6 7
* pin: F0 F1 F4 F5 F6 F7 E6 B1
*/
#define COLS (int []){ F0, F1, F4, F5, F6, F7, E6, B1 }
/* Row pin configuration
* row: 0 1 2 3 4 5 6 7 8 9
* pin: B2 C7 C6 B6 B5 B0 B3 D5 D3 D2
*/
#define ROWS (int []){ B2, C7, C6, B6, B5, B0, B3, D5, D3, D2 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* Backlight configuration
*/
#define BACKLIGHT_LEVELS 1
/* Underlight configuration
*/
#define ws2812_PORTREG PORTD
#define ws2812_DDRREG DDRD
#define ws2812_pin 7
#define RGBLED_NUM 14 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,183 @@
#include "clueboard2.h"
#ifdef RGBLIGHT_ENABLE
#include "rgblight.h"
#endif
// Used for SHIFT_ESC
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
// 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 _BL 0
#define _FL 1
#define _RS 2
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer
* ,--------------------------------------------------------------------------. ,----.
* |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP|
* |--------------------------------------------------------------------------| |----|
* | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN|
* |--------------------------------------------------------------------------| `----'
* |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent|
* |-----------------------------------------------------------------------------.
* |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP|
* |------------------------------------------------------------------------|----|----.
* | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT|
* `----------------------------------------------------------------------------------'
*/
[_BL] = KEYMAP(
F(0), 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_GRV, KC_BSPC, KC_PGUP, \
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_PGDN, \
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_NUHS, KC_ENT, \
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \
KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT),
/* Keymap _FL: Function Layer
* ,--------------------------------------------------------------------------. ,----.
* | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN|
* |--------------------------------------------------------------------------| |----|
* | | | | | | | | |PScr|SLck|Paus| | | | |BLDE|
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | |PGUP|
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL|HOME|PGDN| END|
* `----------------------------------------------------------------------------------'
*/
[_FL] = KEYMAP(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, BL_STEP, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_HOME, KC_PGDN, KC_END),
/* Keymap _RS: Reset layer
* ,--------------------------------------------------------------------------. ,----.
* | | | | | | | | | | | | | | | | | |
* |--------------------------------------------------------------------------| |----|
* | | | | |RESET| | | | | | | | | | | |
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL| | | |
* `----------------------------------------------------------------------------------'
*/
[_RS] = KEYMAP(
#ifdef RGBLIGHT_ENABLE
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), F(7), \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(8), \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), F(5), \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, F(2), F(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(4), F(6), F(3)),
#else
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_TRNS, KC_TRNS, KC_TRNS),
#endif
};
enum function_id {
SHIFT_ESC,
#ifdef RGBLIGHT_ENABLE
RGBLED_TOGGLE,
RGBLED_STEP_MODE,
RGBLED_INCREASE_HUE,
RGBLED_DECREASE_HUE,
RGBLED_INCREASE_SAT,
RGBLED_DECREASE_SAT,
RGBLED_INCREASE_VAL,
RGBLED_DECREASE_VAL
#endif
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_FUNCTION(SHIFT_ESC),
#ifdef RGBLIGHT_ENABLE
[1] = ACTION_FUNCTION(RGBLED_TOGGLE),
[2] = ACTION_FUNCTION(RGBLED_STEP_MODE),
[3] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
[4] = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
[5] = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
[6] = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
[7] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
[8] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
#endif
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
static uint8_t shift_esc_shift_mask;
switch (id) {
case SHIFT_ESC:
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
if (record->event.pressed) {
if (shift_esc_shift_mask) {
add_key(KC_GRV);
send_keyboard_report();
} else {
add_key(KC_ESC);
send_keyboard_report();
}
} else {
if (shift_esc_shift_mask) {
del_key(KC_GRV);
send_keyboard_report();
} else {
del_key(KC_ESC);
send_keyboard_report();
}
}
break;
//led operations
#ifdef RGBLIGHT_ENABLE
case RGBLED_TOGGLE:
if (record->event.pressed) {
rgblight_toggle();
}
break;
case RGBLED_INCREASE_HUE:
if (record->event.pressed) {
rgblight_increase_hue();
}
break;
case RGBLED_DECREASE_HUE:
if (record->event.pressed) {
rgblight_decrease_hue();
}
break;
case RGBLED_INCREASE_SAT:
if (record->event.pressed) {
rgblight_increase_sat();
}
break;
case RGBLED_DECREASE_SAT:
if (record->event.pressed) {
rgblight_decrease_sat();
}
break;
case RGBLED_INCREASE_VAL:
if (record->event.pressed) {
rgblight_increase_val();
}
break;
case RGBLED_DECREASE_VAL:
if (record->event.pressed) {
rgblight_decrease_val();
}
break;
case RGBLED_STEP_MODE:
if (record->event.pressed) {
rgblight_step();
}
break;
#endif
}
}

@ -0,0 +1,147 @@
#include "clueboard2.h"
#ifdef ENABLE_RGBLIGHT
#include "rgblight.h"
#endif
// Used for SHIFT_ESC
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
// 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 _BL 0
#define _FL 1
#define _RS 2
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer
* ,--------------------------------------------------------------------------. ,----.
* | Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| ~| BS| |PgUp|
* |--------------------------------------------------------------------------| |----|
* | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PgDn|
* |--------------------------------------------------------------------------| `----'
* |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent|
* |-----------------------------------------------------------------------------.
* |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| Up|
* |------------------------------------------------------------------------|----|----.
* | Ctrl| Alt| Gui| MHen| Space| Space| Hen| Gui| Alt| Ctrl|Left|Down|Rght|
* `----------------------------------------------------------------------------------'
*/
[_BL] = KEYMAP(
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_GRV, KC_BSPC, KC_PGUP, \
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_PGDN, \
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_NUHS, KC_ENT, \
MO(_FL), KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FL), KC_UP, \
KC_LCTL, KC_LALT, KC_LGUI,KC_MHEN, KC_SPC, KC_SPC, KC_HENK, KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
/* Keymap _FL: Function Layer
* ,--------------------------------------------------------------------------. ,----.
* | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN|
* |--------------------------------------------------------------------------| |----|
* | | | | | | | | |PScr|SLck|Paus| | | | |BLDE|
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | |PGUP|
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL|HOME|PGDN| END|
* `----------------------------------------------------------------------------------'
*/
[_FL] = KEYMAP(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, BL_STEP, \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_PGUP, \
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_END),
/* Keymap _RS: Reset/Underlight layer
* ,--------------------------------------------------------------------------. ,----.
* | | | | | | | | | | | | | | | | | |
* |--------------------------------------------------------------------------| |----|
* | | | | |RESET| | | | | | | | | | | |
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL| | | |
* `----------------------------------------------------------------------------------'
*/
[_RS] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(0), F(6), \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(7), \
KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), F(4), \
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, F(1), F(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(3), F(5), F(2)),
};
enum function_id {
RGBLED_TOGGLE,
RGBLED_STEP_MODE,
RGBLED_INCREASE_HUE,
RGBLED_DECREASE_HUE,
RGBLED_INCREASE_SAT,
RGBLED_DECREASE_SAT,
RGBLED_INCREASE_VAL,
RGBLED_DECREASE_VAL,
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_FUNCTION(RGBLED_TOGGLE),
[1] = ACTION_FUNCTION(RGBLED_STEP_MODE),
[2] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
[3] = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
[4] = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
[5] = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
[6] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
[7] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
switch (id) {
case RGBLED_TOGGLE:
//led operations
if (record->event.pressed) {
rgblight_toggle();
}
break;
case RGBLED_INCREASE_HUE:
if (record->event.pressed) {
rgblight_increase_hue();
}
break;
case RGBLED_DECREASE_HUE:
if (record->event.pressed) {
rgblight_decrease_hue();
}
break;
case RGBLED_INCREASE_SAT:
if (record->event.pressed) {
rgblight_increase_sat();
}
break;
case RGBLED_DECREASE_SAT:
if (record->event.pressed) {
rgblight_decrease_sat();
}
break;
case RGBLED_INCREASE_VAL:
if (record->event.pressed) {
rgblight_increase_val();
}
break;
case RGBLED_DECREASE_VAL:
if (record->event.pressed) {
rgblight_decrease_val();
}
break;
case RGBLED_STEP_MODE:
if (record->event.pressed) {
rgblight_step();
}
break;
}
}

@ -0,0 +1,108 @@
#include "clueboard2.h"
// Used for SHIFT_ESC
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
// 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 _BL 0
#define _FL 1
#define _RS 2
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer
* ,--------------------------------------------------------------------------. ,----.
* |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP|
* |--------------------------------------------------------------------------| |----|
* | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN|
* |--------------------------------------------------------------------------| `----'
* |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent|
* |-----------------------------------------------------------------------------.
* |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP|
* |------------------------------------------------------------------------|----|----.
* | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT|
* `----------------------------------------------------------------------------------'
*/
[_BL] = KEYMAP(
F(0), 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_GRV, KC_BSPC, KC_PGUP, \
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_PGDN, \
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_NUHS, KC_ENT, \
KC_LSFT,KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \
KC_LCTL,KC_LALT,KC_LGUI,MO(_FL), KC_SPC, KC_SPC, MO(_FL), KC_RGUI, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT),
/* Keymap _FL: Function Layer
* ,--------------------------------------------------------------------------. ,----.
* | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN|
* |--------------------------------------------------------------------------| |----|
* | | | | | | | | |PScr|SLck|Paus| | | | |BLDE|
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | |PGUP|
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL|HOME|PGDN| END|
* `----------------------------------------------------------------------------------'
*/
[_FL] = KEYMAP(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,KC_DEL, BL_STEP, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \
KC_TRNS,KC_TRNS,MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_PGUP, \
KC_TRNS,KC_TRNS,KC_TRNS,MO(_FL), KC_TRNS,KC_TRNS, MO(_FL),KC_TRNS,KC_TRNS,MO(_FL),KC_HOME,KC_PGDN,KC_END),
/* Keymap _RS: Reset layer
* ,--------------------------------------------------------------------------. ,----.
* | | | | | | | | | | | | | | | | | |
* |--------------------------------------------------------------------------| |----|
* | | | | |RESET| | | | | | | | | | | |
* |--------------------------------------------------------------------------| `----'
* | | | _RS| | | | | | | | | | | |
* |-----------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |------------------------------------------------------------------------|----|----.
* | | | | | | | | | | _FL| | | |
* `----------------------------------------------------------------------------------'
*/
[_RS] = KEYMAP(
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \
KC_TRNS,KC_TRNS,MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,MO(_FL),KC_TRNS, KC_TRNS, KC_TRNS),
};
enum function_id {
SHIFT_ESC,
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_FUNCTION(SHIFT_ESC),
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
static uint8_t shift_esc_shift_mask;
switch (id) {
case SHIFT_ESC:
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
if (record->event.pressed) {
if (shift_esc_shift_mask) {
add_key(KC_GRV);
send_keyboard_report();
} else {
add_key(KC_ESC);
send_keyboard_report();
}
} else {
if (shift_esc_shift_mask) {
del_key(KC_GRV);
send_keyboard_report();
} else {
del_key(KC_ESC);
send_keyboard_report();
}
}
break;
}
}

@ -0,0 +1,36 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <avr/io.h>
#include "stdint.h"
#include "led.h"
void led_init_ports() {
// * Set our LED pins as output
DDRB |= (1<<4);
}
void led_set_kb(uint8_t usb_led) {
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
// Turn capslock on
PORTB |= (1<<4);
} else {
// Turn capslock off
PORTB &= ~(1<<4);
}
}

@ -0,0 +1,136 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# Target file name (without extension).
TARGET = cluepad
# Directory common source filess exist
TOP_DIR = ../..
TMK_DIR = ../../tmk_core
# Directory keyboard dependent files exist
TARGET_DIR = .
# # project specific files
SRC = cluepad.c backlight.c
ifdef KEYMAP
SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
else
SRC := keymaps/keymap_default.c $(SRC)
endif
CONFIG_H = config.h
# MCU name
#MCU = at90usb1287
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
# MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
# EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
# CONSOLE_ENABLE = yes # Console for debug(+400)
# COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable numpad's backlight functionality
RGBLIGHT_ENABLE = yes
# MIDI_ENABLE = YES # MIDI controls
# UNICODE_ENABLE = YES # Unicode
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR)
include $(TOP_DIR)/quantum/quantum.mk

@ -0,0 +1,54 @@
#include <avr/io.h>
#include "backlight.h"
#include "led.h"
#include "print.h"
int pwm_level;
void led_set_kb(uint8_t usb_led)
{
print("led_set\n");
}
void init_backlight_pin(void)
{
// Set C7 to output
DDRC |= (1<<7);
// Initialize the timer
TC4H = 0x03;
OCR4C = 0xFF;
TCCR4A = 0b10000010;
TCCR4B = 0b00000001;
}
void backlight_set(uint8_t level)
{
// Determine the PWM level
switch (level)
{
case 0:
// 33%
pwm_level = 0x54;
break;
case 1:
// 66%
pwm_level = 0xA8;
break;
case 2:
// 100%
pwm_level = 0xFF;
break;
case 3:
// 0%
pwm_level = 0x00;
break;
default:
xprintf("Unknown level: %d\n", level);
}
// Write the PWM level to the timer
TC4H = pwm_level >> 8;
OCR4A = 0xFF & pwm_level;
}

@ -0,0 +1,39 @@
#include "cluepad.h"
__attribute__ ((weak))
void matrix_init_user(void) {
// leave these blank
};
__attribute__ ((weak))
void matrix_scan_user(void) {
// leave these blank
};
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
if (matrix_init_user) {
(*matrix_init_user)();
}
#ifdef BACKLIGHT_ENABLE
init_backlight_pin();
#endif
#ifdef RGBLIGHT_ENABLE
rgblight_init();
#endif
// JTAG disable for PORT F. write JTD bit twice within four cycles.
MCUCR |= (1<<JTD);
MCUCR |= (1<<JTD);
};
void matrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
if (matrix_scan_user) {
(*matrix_scan_user)();
}
};

@ -0,0 +1,41 @@
#ifndef CLUEPAD_H
#define CLUEPAD_H
#include "matrix.h"
#include "keymap_common.h"
#include <stddef.h>
/* Cluepad matrix layout
* .-------------------.
* |NLCK| /| *| -|
* |-------------------|
* | 7| 8| 9| |
* |--------------| |
* | 4| 5| 6| +|
* |-------------------|
* | 1| 2| 3| |
* |--------------| |
* | 0| .| Ent|
* '-------------------'
*/
// The first section contains all of the arguments
// The second converts the arguments into a two-dimensional array
#define KEYMAP( \
k00, k01, k02, k03, \
k10, k11, k12, k13, \
k20, k21, k22, \
k30, k31, k32, k33, \
k40, k42 \
) { \
{ k00, k01, k02, k03, }, \
{ k10, k11, k12, k13, }, \
{ k20, k21, k22, KC_NO, }, \
{ k30, k31, k32, k33, }, \
{ k40, KC_NO, k42, KC_NO } \
}
void matrix_init_user(void);
void matrix_scan_user(void);
#endif

@ -0,0 +1,102 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xC1ED
#define PRODUCT_ID 0x2312
#define DEVICE_VER 0x0001
#define MANUFACTURER Clueboard
#define PRODUCT Cluepad with RGB Underlighting
#define DESCRIPTION QMK keyboard firmware for Cluepad
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 4
// COLS: Left to right, ROWS: Top to bottom
/* Column pin configuration
* col: 0 1 2 3
* pin: F4 E6 B1 D2
*/
#define COLS (int []){ F4, E6, B1, D2 }
/* Row pin configuration
* row: 0 1 2 3 4
* pin:
*/
#define ROWS (int []){ B0, D3, D5, D4, D6 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Number of backlighting levels */
#define BACKLIGHT_LEVELS 3
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* Underlight configuration
*/
#define ws2812_PORTREG PORTF
#define ws2812_DDRREG DDRF
#define ws2812_pin 6
#define RGBLED_NUM 4 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* Debug forcibly enabled */
#define ALWAYS_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,122 @@
#include "cluepad.h"
#include "backlight.h"
#include "rgblight.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 _BL 0
#define _FL 1
#define _RS 2
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer
* .-------------------.
* |NL F| /| *| -|
* |-------------------|
* | 7| 8| 9| |
* |--------------| |
* | 4| 5| 6| +|
* |-------------------|
* | 1| 2| 3| |
* |--------------| |
* | 0| .| Ent|
* '-------------------'
*/
[_BL] = KEYMAP(
LT(_FL, KC_NLCK), KC_PSLS, KC_PAST, KC_PMNS, \
KC_P7, KC_P8, KC_P9, KC_PPLS, \
KC_P4, KC_P5, KC_P6, \
KC_P1, KC_P2, KC_P3, KC_PENT, \
KC_P0, KC_PDOT),
/* Keymap _FL: Function Layer
* .-------------------.
* |NL F| | | Fn0|
* |-------------------|
* | | Fn4| | |
* |--------------| |
* | Fn3|BL_S| Fn2| Fn6|
* |-------------------|
* | | Fn5| | |
* |--------------| |
* | Fn1| | Fn7|
* '-------------------'
*/
[_FL] = KEYMAP(
LT(_FL, KC_NLCK), KC_TRNS, KC_TRNS, F(0), \
KC_TRNS, F(4), KC_TRNS, F(6), \
F(3), BL_STEP, F(2), \
KC_TRNS, F(5), KC_TRNS, F(7), \
F(1), KC_TRNS)
};
enum function_id {
RGBLED_TOGGLE,
RGBLED_STEP_MODE,
RGBLED_INCREASE_HUE,
RGBLED_DECREASE_HUE,
RGBLED_INCREASE_SAT,
RGBLED_DECREASE_SAT,
RGBLED_INCREASE_VAL,
RGBLED_DECREASE_VAL,
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_FUNCTION(RGBLED_TOGGLE),
[1] = ACTION_FUNCTION(RGBLED_STEP_MODE),
[2] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
[3] = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
[4] = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
[5] = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
[6] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
[7] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
switch (id) {
case RGBLED_TOGGLE:
if (record->event.pressed) {
rgblight_toggle();
}
break;
case RGBLED_INCREASE_HUE:
if (record->event.pressed) {
rgblight_increase_hue();
}
break;
case RGBLED_DECREASE_HUE:
if (record->event.pressed) {
rgblight_decrease_hue();
}
break;
case RGBLED_INCREASE_SAT:
if (record->event.pressed) {
rgblight_increase_sat();
}
break;
case RGBLED_DECREASE_SAT:
if (record->event.pressed) {
rgblight_decrease_sat();
}
break;
case RGBLED_INCREASE_VAL:
if (record->event.pressed) {
rgblight_increase_val();
}
break;
case RGBLED_DECREASE_VAL:
if (record->event.pressed) {
rgblight_decrease_val();
}
break;
case RGBLED_STEP_MODE:
if (record->event.pressed) {
rgblight_step();
}
break;
}
}

@ -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

@ -0,0 +1,1146 @@
:100000000C940F020C9453020C9453020C94530260
:100010000C9453020C9453020C9453020C9453020C
:100020000C9453020C9453020C94190C0C94EB0C8A
:100030000C9453020C9453020C9453020C945302EC
:100040000C9453020C94CF210C9453020C94530241
:100050000C9453020C94631B0C9453020C945302A3
:100060000C9453020C9453020C9453020C945302BC
:100070000C9453020C9453020C9453020C945302AC
:100080000C9453020C9453020C9453020C9453029C
:100090000C9453020C9453020C9453020C9453028C
:1000A0000C9453020C9453020C945302500D720D95
:1000B0005D0E720D5D0EB40DD70D5D0E2C0E3F0E54
:1000C000391139117A117A11BC11F811F813F8139A
:1000D0001012F81307130713D213F813F813E613CB
:1000E00035002B003971E100E00000001E00140013
:1000F00004001D0029002F001F001A0016001B001D
:10010000E3004C002000080007000600E2002C007D
:100110002100150009001900E20026022200170044
:100120000A000500000006012300B60000004B0095
:1001300000002F022400B70000004E000000300233
:1001400025001C000B0011000000190126001800FA
:100150000D0010005200270227000C000E00360090
:1001600050002A002D0012000F0037004F00280019
:100170002E00130033003800510030002A003100F7
:100180002800340001540000290001000100010092
:10019000010000003A00010001000100010001001F
:1001A0003B000100F2000100010001003C00F000F2
:1001B000F1000100F40000503D000100F3000100D7
:1001C000F50001003E0001000100010000000100F7
:1001D0003F0001000000010000000100400001009C
:1001E00000000100000001004100010001000100C9
:1001F00000000100420001000100010001000100B7
:100200004300010001000100AA00010044000100B8
:1002100001000100A90001004500010001000100EA
:10022000A80001002A000100AE000100010000004A
:1002300016034500720067006F0044006F007800ED
:10024000200045005A0000001603450072006700B8
:100250006F0044006F007800200045005A00000045
:100260000403090409026D00040100A0FA09040056
:10027000000103010100092111010001223F0007D3
:1002800005810308000A09040100010301020009B5
:100290002111010001224D000705820308000A090F
:1002A00004020001030000000921110100012236AF
:1002B000000705830308000A090403000103000086
:1002C00000092111010001223900070584031000F3
:1002D000011201100100000008EDFE0713010001EA
:1002E00002000105010906A101050719E029E7152A
:1002F0000025019508750181020508190129059558
:1003000005750191029501750391010507190029F1
:100310007715002501957875018102C005010980D6
:10032000A101850216010026B7001A01002AB700B4
:10033000751095018100C0050C0901A10185031606
:100340000100269C021A01002A9C02751095018169
:1003500000C005010902A1010901A1000509190157
:100360002905150025019505750181029501750383
:1003700081010501093009311581257F9502750834
:10038000810609381581257F950175088106050CC0
:100390000A38021581257F950175088106C0C005C0
:1003A000010906A101050719E029E71500250195B6
:1003B0000875018102950175088101050819012957
:1003C00005950575019102950175039101050719C0
:1003D0000029FF150025FF950675088100C0000063
:1003E000000000000000000000010204060A0F17D0
:1003F000202C3A4A5D71879DB3C7DAE9F5FCFFFC12
:10040000F5E9DAC7B39D87715D4A3A2C20170F0AC8
:10041000060402010000000000000000000011249A
:100420001FBECFEFDAE0DEBFCDBF04B603FE24C0AF
:100430008091EE019091EF01A091F001B091F10156
:100440008730904BA740B04BB9F41092EE01109258
:10045000EF011092F0011092F10114BE84B7877F72
:1004600084BF88E10FB6F89480936000109260001A
:100470000FBEE0E0FFE3099511E0A0E0B1E0EAE49F
:10048000F7E402C005900D92A433B107D9F721E03B
:10049000A4E3B1E001C01D92AE3EB207E1F70E94B5
:1004A0005F090C94A3230C94000061110BC0FC01A4
:1004B0008281882321F085EE0E94C10F03C085EE62
:1004C0000E94891080E090E0089508956091B10144
:1004D0007091B2018091B3019091B4010E948A1A87
:1004E00056985E9825982D9826982E9827982F989C
:1004F000813019F0823021F00895259A2D9A0895BF
:10050000269A2E9A08950C94660256985E9825981D
:100510002D9826982E9827982F988FEF90E09093FB
:1005200089008093880090938B0080938A00909339
:100530008D0080938C00259A2D9A2FEF80E792E012
:10054000215080409040E1F700C00000269A2E9A8A
:100550002FEF80E792E0215080409040E1F700C00B
:100560000000279A2F9A2FEF80E792E021508040D9
:100570009040E1F700C0000025982D982FEF80E70C
:1005800092E0215080409040E1F700C000002698A2
:100590002E982FEF80E792E0215080409040E1F7C5
:1005A00000C0000027982F9856985E9825982D989F
:1005B00026982E9827982F98089589EA809380008E
:1005C00089E08093810024982C983F988AB18F7499
:1005D0008AB96E98479A8BB1806B8BB9769A0E94D4
:1005E00085020C94650280E28093000180913401C1
:1005F00081110EC00E94420381E0809334012FEFED
:1006000083ED90E3215080409040E1F700C000006E
:1006100080E40E9448038093000181112EC00E9453
:10062000720380930001811128C00E94720380939D
:100630000001811122C08FE30E94720380930001A8
:1006400081111BC00E946A0380E40E9448038093CA
:100650000001811112C08CE00E947203809300019E
:1006600081110BC00E94720380930001811105C0AB
:100670008FE30E947203809300010E946A038091BD
:10068000000108951092B9008AE08093B80008959F
:1006900094EA9093BC009091BC0097FFFCCF90919E
:1006A000B900987F983021F0903111F081E00895E1
:1006B0008093BB0084E88093BC008091BC0087FFDE
:1006C000FCCF8091B900887F883111F0803471F7B8
:1006D00080E0089584E98093BC008091BC0084FD93
:1006E000FCCF08958093BB0084E88093BC00809188
:1006F000BC0087FFFCCF9091B900987F81E09832D1
:1007000009F480E0089584E88093BC008091BC00E7
:1007100087FFFCCF8091BB0008958091000181117B
:1007200015C080E40E9448038093000181110CC031
:1007300082E10E94720380930001811105C08FEF56
:100740000E947203809300010E946A0384B1807F3B
:1007500084B985B1807F85B98AB1837F8AB98BB12D
:10076000837F8BB93E98469808950E94F302809348
:1007700000010E948D0380B38C7080BB81B3836FB6
:1007800081BBA6E3B1E0E4E4F1E08EE08E0F1192CC
:100790001D928E13FCCF0C94DD02BF92CF92DF929C
:1007A000EF92FF920F931F93CF93DF9380910001FD
:1007B000882379F0809135018F5F80933501811115
:1007C00008C00E94F30280930001811102C00E94C0
:1007D000850206E311E0C0E0D0E0DD24D39482E09E
:1007E000C82EEE24E394F12CC730D10500F580919A
:1007F0000001811164C080E40E94480380930001DD
:10080000811112C082E10E94720380930001811164
:100810000BC0C7010C2E01C0880F0A94EAF780951F
:100820000E947203809300010E946A0348C0CA308C
:10083000A1F028F4C83059F0C93061F005C0CC30BF
:1008400089F070F0CD3089F0209A289810C0219A54
:1008500029980DC0229A2A980AC0239A2B9807C07B
:10086000529A01C0539A5B9802C03E9A469890EA09
:100870009A95F1F79FB1799902C082E001C080E0BA
:1008800091709D25982B7C9902C084E001C080E086
:10089000892B7D9902C038E001C030E0832B7E991E
:1008A00002C020E101C020E0822B9FB19095991FEA
:1008B0009927991F9295990F907E892B0FC080914F
:1008C0000001811149C080E40E9448038093000127
:1008D000882379F1B12C0E946A038B2DF801908155
:1008E000981719F08083C09201010E948D03219610
:1008F0000F5F1F4FCE30D10509F076CF80910101F7
:10090000882361F1815080930101882339F08FE9B8
:100910009FE00197F1F700C0000020C0A4E4B1E01F
:10092000E6E3F1E0CF01825F91919D938E13FCCFBE
:1009300015C083E10E947203809300018111CACF28
:1009400081E40E944803809300018111C3CF0E947B
:100950008303B82EB094BFCF80E0C0CF0E94830243
:1009600081E0DF91CF911F910F91FF90EF90DF9089
:10097000CF90BF900895E82FF0E0EC5BFE4F8081B0
:1009800008950895089596E0799FF001112494E563
:10099000899FE00DF11D1124E60FF11DEE0FFF1FE1
:1009A000E052FF4F859194910895880F991FFC01A3
:1009B000E05AF040859194910895880F991FFC01A9
:1009C000E052FF4F8591949108950F931F93CF9319
:1009D000DF93EC018115904350F5C11580E2D807F3
:1009E00008F0B3C0CB3BD10590F4C83AD10508F06C
:1009F0005AC0C53AD10508F04BC0C430D10508F043
:100A0000BBC1219709F0B5C101E010E0F5C1CF3FAE
:100A1000D10511F008F0B0C1C03FD10508F092C077
:100A2000CE01805E9109089708F4A6C1A2C1C11544
:100A300091E5D907A8F4C23020E5D20708F09EC09E
:100A4000C11580E5D80709F485C008F091C0C1152B
:100A500020E4D20708F08DC1DD278E01106CCCC1D7
:100A6000C11580E8D80758F4C11590E7D90708F0F8
:100A70007CC1C11520E6D20708F422C17AC1C11594
:100A800080E9D80708F075C1DF708E01106AB4C123
:100A9000C53AD10509F472C1C63AD10509F071C150
:100AA00002E810E4A9C1C83AD10509F46DC1C93AF8
:100AB000D10509F46CC1CA3AD10509F46BC1CB3A2E
:100AC000D10509F46AC1CC3AD10509F469C1CD3A1E
:100AD000D10509F468C1C03BD10509F467C1CE3A1C
:100AE000D10509F466C1CF3AD10509F465C1C13B0E
:100AF000D10509F464C1C23BD10509F463C1C33B0C
:100B0000D10509F462C1C43BD10509F461C1C53BFB
:100B1000D10509F460C1C63BD10509F45FC1C73BEB
:100B2000D10509F45EC1C83BD10509F45DC1C93BDB
:100B3000D10509F45CC1CA3BD10509F45BC100E0F1
:100B400014E45AC18E01106557C1CE019F700E94F6
:100B5000DD0453C10E941B149FEF24E38CE09150ED
:100B600020408040E1F700C000000E94881B44C183
:100B70008091CD0181608093CD013EC10E94321DE4
:100B8000811102C00E94181D0E944F1D90E0909399
:100B9000EE018093ED01C23090E5D90721F48091F8
:100BA000ED01816086C0C43020E5D20721F4809138
:100BB000ED0182607EC0C63080E5D80721F48091C7
:100BC000ED01846076C0C83090E5D90719F48091B2
:100BD000ED0127C0CA3020E5D20721F48091ED0154
:100BE000806167C0CC3080E5D80721F48091ED01A9
:100BF00080625FC0CE3090E5D90721F48091ED018D
:100C0000806457C0C03120E5D20721F48091ED0106
:100C100080684FC0C23180E5D80729F48091ED018A
:100C20008460886046C0C33090E5D90721F4809184
:100C3000ED018E7F3EC0C53020E5D20721F48091C2
:100C4000ED018D7F36C0C73080E5D80721F4809153
:100C5000ED018B7F2EC0C93090E5D90719F4809142
:100C6000ED0126C0CB3020E5D20721F48091ED01C3
:100C70008F7E1FC0CD3080E5D80721F48091ED0133
:100C80008F7D17C0CF3090E5D90721F48091ED0119
:100C90008F7B0FC0C13120E5D20721F48091ED0197
:100CA0008F7707C0C331D04531F48091ED018B7F40
:100CB000877F8093ED018091ED010E94531D9CC0C0
:100CC0008D2F99278F70992781309105D9F49E0136
:100CD0002370332702C0880F991F2A95E2F79C687A
:100CE0008E0144E0000F111F4A95E1F700271370B1
:100CF000802B912B53E0CC0FDD1F5A95E1F7C07686
:100D0000DD272FC08230910531F4DC2FCC278E01F6
:100D1000016F106A71C08330910569F4CE01837050
:100D2000992701E010E002C0000F111F8A95E2F739
:100D3000C8019C680FC0049709F05EC0CE018370A3
:100D4000992701E010E002C0000F111F8A95E2F719
:100D5000C8019A6823E0CC0FDD1F2A95E1F7C07E19
:100D6000D7708C010C2B1D2B47C0DF708E011062D9
:100D700043C000E010E040C08E013EC001E810E436
:100D80003BC003E810E438C002EE14E435C009EEBD
:100D900014E432C00AEE14E42FC005EB14E42CC0B6
:100DA00006EB14E429C007EB14E426C00CEC14E4B1
:100DB00023C00DEC14E420C003E815E41DC00AE8CC
:100DC00015E41AC002E915E417C004E915E414C0DB
:100DD00001E216E411C003E216E40EC004E216E4D8
:100DE0000BC005E216E408C006E216E405C007E2FF
:100DF00016E402C00AE216E4C801DF91CF911F9108
:100E00000F91089596E0799FF001112494E5899F50
:100E1000E00DF11D1124E60FF11DEE0FFF1FE05252
:100E2000FF4F85919491803E9105E0F4803C9105BF
:100E300058F58133910509F46FC048F48932910562
:100E400009F463C08A32910509F46DC072C0893318
:100E50009105E9F082389105D1F08533910509F4C7
:100E60004DC067C0833E910581F138F4803E910505
:100E7000B9F0823E9105D9F05CC0863E910561F1E2
:100E8000873E9105A1F155C00E94D5040895209197
:100E9000ED0120FD02C021FF4CC080EE90E049C072
:100EA0008091ED0180FFF9CF89E390E042C080910D
:100EB000ED0182FF0EC08091ED0184FF03C080E050
:100EC00090E037C083EE90E034C08091ED0182FF66
:100ED000F2CF82EE90E02DC08091ED0183FF0BC038
:100EE0008091ED0184FDEBCF87EE90E022C08091F0
:100EF000ED0183FFF5CF86EE90E01BC08091ED0100
:100F000085FF07C089E290E014C08091ED0185FF64
:100F1000F9CF85E390E00DC08091ED0186FF07C019
:100F20008AE290E006C08091ED0186FFF9CF81E36F
:100F300090E00E94E504089508950C949C07809128
:100F400062010895CF93DF9300D01F92CDB7DEB733
:100F50002091E401243019F523E029839B838A83BF
:100F60002093E9008FEF9091E800815095FD06C035
:100F700095ED9A95F1F700008111F5CF8091E80089
:100F800085FF0DC040E050E063E070E0CE010196C7
:100F90000E940C0A8091E8008E778093E8000F9001
:100FA0000F900F90DF91CF910895CF93DF9300D0F2
:100FB0001F92CDB7DEB72091E401243021F522E065
:100FC00029839B838A8383E08093E9008FEF90914C
:100FD000E800815095FD06C095ED9A95F1F7000067
:100FE0008111F5CF8091E80085FF0DC040E050E011
:100FF00063E070E0CE0101960E940C0A8091E80047
:101000008E778093E8000F900F900F90DF91CF9133
:1010100008952091E4012430F1F422E02093E900C6
:101020002FEF3091E800215035FD06C035ED3A959F
:10103000F1F700002111F5CF2091E80025FF0BC04A
:1010400040E050E065E070E00E940C0A8091E8000A
:101050008E778093E8000895CF93DF93EC01809121
:10106000E401843009F046C090910C019923D9F035
:1010700090910D019923B9F08093E9008FEF909141
:10108000E800815095FD06C095E19A95F1F70000C2
:101090008111F5CF8091E80085FF2CC040E050E041
:1010A00060E170E017C081E08093E9008FEF9091DC
:1010B000E800815095FD06C095ED9A95F1F7000086
:1010C0008111F5CF8091E80085FF14C040E050E029
:1010D00068E070E0CE010E940C0A8091E8008E77F3
:1010E0008093E80080E1FE01A2E5B1E001900D925D
:1010F0008A95E1F7DF91CF9108958091E301811105
:1011000009C00E949E0B0E94FB0B8091E20084604C
:101110008093E20008951092E301089508950C94DD
:10112000BC210E941F1B0E94C2210E94980E0C9499
:101130009D0742E061EC81E00E94180B42E061EC07
:1011400082E00E94180B42E061EC83E00E94180BE1
:1011500042E161EC84E00C94180B8091E60183304D
:1011600009F455C030F4813071F0823009F48EC03A
:1011700008958A3009F47AC08B3009F460C0893050
:1011800009F09CC020C08091E501813A09F096C029
:101190008091E800877F8093E8008091E901909139
:1011A000EA01892B21F060E080E090E003C060E17B
:1011B00082E591E070E00E94550A8091E8008B770B
:1011C0008093E80008958091E501813209F076C0AE
:1011D0008091E9019091EA01009719F0039709F0D5
:1011E0006DC08091E800877F8093E8008091E800DF
:1011F00082FD05C08091E4018111F8CF5FC080912C
:10120000F100809362018091E8008B7753C0809158
:10121000E501813A09F052C08091E9019091EA011B
:10122000892B09F04BC08091E800877F8093E8000C
:101230008091E80080FFFCCF80910C0136C0809146
:10124000E5018132D9F58091E9019091EA01892B7C
:10125000A9F58091E800877F8093E8000E944D0BFC
:101260008091E70180930C010C941B148091E5019F
:10127000813221F58091E800877F8093E8000E9409
:101280004D0B8091E8018093630108958091E50101
:10129000813AA1F48091E800877F8093E8008091F3
:1012A000E80080FFFCCF809163018093F100809182
:1012B000E8008E778093E8000C944D0B089584B776
:1012C000877F84BF88E10FB6F89480936000109206
:1012D00060000FBE90E080E80FB6F8948093610044
:1012E000909361000FBE0E94E70E0E949E0B0E9429
:1012F000FB0B8091E20084608093E20078940E946E
:10130000760E0E94E90E82E091E00E94930E0E9408
:10131000AA218091E401853069F40E94DD1A809150
:10132000E2018823B1F30E940B1B882391F30E94F2
:10133000F609EFCF0E94EF0EECCF292F3327233091
:101340003105A9F06CF42130310509F442C0223096
:10135000310509F043C08DE690E024E632E042C05A
:1013600021323105C9F02232310519F137C09927F0
:101370008130910541F08230910541F0892B71F562
:10138000E0E6F2E005C0E8E4F2E002C0E0E3F2E00B
:10139000849190E09F0126C0643000F5E62FF0E0D4
:1013A000EE0FFF1FEE5DFE4F2081318189E090E05E
:1013B00019C0643098F4E62FF0E0DF01AA0FBB1FDC
:1013C000A65EBE4F2D913C91EA5EFE4F808190E07B
:1013D00009C082E190E021ED32E004C080E090E0BD
:1013E00020E030E0FA0131832083089580E189BD57
:1013F00082E189BD09B400FEFDCF8091D8008F7DC8
:101400008093D8008091E00082608093E00080911A
:10141000E00081FDFCCF0895CF92DF92EF92FF9222
:101420000F931F93CF93DF937C018B01EA010E94FE
:101430006E0B811131C0209731F088819981081B92
:10144000190BE80EF91EC12CD12C0115110519F14B
:101450008091E80085FD14C08091E8008E7780932C
:10146000E800209741F0888199818C0D9D1D99831A
:10147000888385E011C00E946E0B882331F30CC075
:10148000F70181917F018093F10001501109FFEF75
:10149000CF1ADF0ADACF80E0DF91CF911F910F9151
:1014A000FF90EF90DF90CF9008952091EB01309165
:1014B000EC012617370748F06115710539F42091C2
:1014C000E8002E772093E80001C0B901FC0120E07C
:1014D00061157105B9F18091E401882309F440C0D8
:1014E000853009F43FC08091E80083FD3DC08091C4
:1014F000E80082FF06C08091E80082FF26C080E0FD
:1015000008958091E80080FFE3CF2091F30080915F
:10151000F20090E0922B6115710551F08830910531
:1015200038F421912093F100615071090196F3CFB5
:1015300021E0089709F020E08091E8008E77809301
:10154000E800C6CF2111C7CFD6CF8091E401882310
:1015500039F0853039F08091E80083FFCCCF04C0AA
:1015600082E0089583E0089581E008952091EB01E1
:101570003091EC012617370748F06115710539F4F1
:101580002091E8002E772093E80001C0B901FC010A
:1015900020E061157105C1F18091E401882309F40F
:1015A00041C0853009F440C08091E80083FD3EC011
:1015B0008091E80082FF06C08091E80082FF27C08A
:1015C00080E008958091E80080FFE3CF2091F30050
:1015D0008091F20090E0922B6115710559F08830EE
:1015E000910540F424912093F100319661507109E6
:1015F0000196F2CF21E0089709F020E08091E80001
:101600008E778093E800C5CF2111C6CFD5CF8091CA
:10161000E401882339F0853039F08091E80083FFB8
:10162000CBCF04C082E0089583E0089581E008955F
:10163000982F973058F59093E900981739F07091EA
:10164000EC002091ED005091F00003C0242F762F84
:1016500050E021FF19C03091EB003E7F3093EB004A
:101660003091ED003D7F3093ED003091EB00316023
:101670003093EB007093EC002093ED005093F0005A
:101680002091EE0027FF07C09F5FD3CF8F7080931C
:10169000E90081E0089580E008958091E50187FDEB
:1016A00005C08091E80080FF0EC012C08091E80064
:1016B00082FD05C08091E4018111F8CF08958091E9
:1016C000E8008B7708C08091E4018111EACF08958A
:1016D0008091E8008E778093E80008958091E4007F
:1016E0009091E50045E62091EC0020FF21C020917B
:1016F000E80020FD21C02091E401222389F025305B
:1017000089F02091EB0025FD0FC02091E40030917D
:10171000E5002817390739F3415041F0C901E3CFFB
:1017200082E0089583E0089581E0089584E00895BB
:101730002091E80022FFDFCF80E008950E940C0C8A
:101740000E94140CE0EEF0E0808181608083E8ED7F
:10175000F0E080818F77808319BCA7EDB0E08C9199
:101760008E7F8C9380818F7E80831092E301089519
:101770000F931F93CF93DF930E940C0C0E94140CC5
:10178000C8EDD0E088818F778883888180688883DE
:1017900088818F7D888319BC1092E4011092E0014A
:1017A0001092E2011092E10100EE10E0F801808158
:1017B0008B7F808388818160888342E060E080E065
:1017C0000E94180BE1EEF0E080818E7F8083E2EED4
:1017D000F0E0808181608083808188608083F8016F
:1017E00080818E7F8083888180618883DF91CF9123
:1017F0001F910F910895E8EDF0E080818F7E808346
:10180000E7EDF0E080818160808384E082BF81E049
:101810008093E3010C94B80BE8EDF0E080818E7FBB
:1018200080831092E20008951092DA001092E10095
:1018300008951F920F920FB60F9211242F933F938A
:101840004F935F936F937F938F939F93AF93BF93C8
:10185000EF93FF938091E10082FF0BC08091E20043
:1018600082FF07C08091E1008B7F8093E1000E949E
:10187000750E8091DA0080FF1FC08091D80080FF34
:101880001BC08091DA008E7F8093DA008091D900AE
:1018900080FF0DC080E189BD82E189BD09B400FEF1
:1018A000FDCF81E08093E4010E947D0805C019BC52
:1018B0001092E4010E948B088091E10080FF19C022
:1018C0008091E20080FF15C08091E2008E7F8093BE
:1018D000E2008091E20080618093E2008091D80074
:1018E00080628093D80019BC85E08093E4010E9457
:1018F0008F088091E10084FF30C08091E20084FF76
:101900002CC080E189BD82E189BD09B400FEFDCF14
:101910008091D8008F7D8093D8008091E1008F7EE8
:101920008093E1008091E2008F7E8093E2008091BD
:10193000E20081608093E2008091E001882311F051
:1019400084E007C08091E30087FF02C083E001C00C
:1019500081E08093E4010E9491088091E10083FF7F
:1019600029C08091E20083FF25C08091E100877F3C
:101970008093E10082E08093E4011092E001809185
:10198000E1008E7F8093E1008091E2008E7F809362
:10199000E2008091E20080618093E20042E060E03A
:1019A00080E00E94180B8091F00088608093F00026
:1019B0000E948E08FF91EF91BF91AF919F918F91FF
:1019C0007F916F915F914F913F912F910F900FBE3B
:1019D0000F901F9018951F920F920FB60F9211241F
:1019E0002F933F934F935F936F937F938F939F9327
:1019F000AF93BF93CF93EF93FF93C091E900CF7064
:101A00008091EC001092E9008091F000877F809334
:101A1000F00078940E94270D1092E9008091F00068
:101A200088608093F000C093E900FF91EF91CF911F
:101A3000BF91AF919F918F917F916F915F914F91E6
:101A40003F912F910F900FBE0F901F9018951F93ED
:101A5000CF93DF93CDB7DEB7AA970FB6F894DEBF6A
:101A60000FBECDBFE5EEF1E08091F100819321E062
:101A7000ED3EF207C9F70E94AD088091E80083FFB0
:101A80001CC12091E5013091E601832F90E08A305E
:101A9000910508F012C1FC01EA5AFF4F0C94532340
:101AA000203881F0223809F008C18091E9018F7057
:101AB0008093E9008091EB0085FB882780F91092E4
:101AC000E90006C08091E1019091E20191118260EC
:101AD0009091E800977F9093E8008093F100109236
:101AE000F100C5C0822F8D7F09F0E7C0222319F0D5
:101AF000223061F0E2C08091E701813009F0DDC061
:101B0000333009F080E08093E20128C08091E70142
:101B1000811124C02091E9012F7009F4CEC02093D7
:101B2000E9008091EB0080FF19C08091EB00333019
:101B300011F4806211C080618093EB0081E090E03D
:101B4000022E01C0880F0A94EAF78093EA001092EF
:101B5000EA008091EB0088608093EB001092E9002E
:101B60008091E800877F86C02111A7C01091E7010E
:101B70001F778091E3008078812B8093E300809130
:101B8000E800877F8093E8000E944D0B8091E80079
:101B900080FFFCCF8091E30080688093E3001123F5
:101BA00011F083E001C082E08093E40186C02058F8
:101BB000223008F082C08091E7019091E8018C3DCD
:101BC00023E0920779F583E08A838AE289834FB71D
:101BD000F894DE01139620E03EE051E2E32FF0E0BE
:101BE00050935700E49120FF03C0E295EF703F5FF0
:101BF000EF708E2F90E0EA3010F0C79601C0C096CB
:101C00008D939D932F5F243149F74FBF8091E8005A
:101C1000877F8093E8006AE270E0CE0101960E941F
:101C2000550A14C0AE014F5F5F4F6091E9010E94F9
:101C30009D09009709F441C02091E800277F209377
:101C4000E800BC0189819A810E94B60A8091E8006F
:101C50008B778093E80031C0203879F58091E800D7
:101C6000877F8093E8008091E0018093F10080916C
:101C7000E8008E778093E8000E944D0B1EC0211172
:101C80001CC09091E7019230C0F48091E800877FFA
:101C90008093E8009093E0010E944D0B8091E00159
:101CA000811104C08091E30087FF02C084E001C07D
:101CB00081E08093E4010E9499088091E80083FF0D
:101CC0000AC08091E800877F8093E8008091EB0054
:101CD00080628093EB00AA960FB6F894DEBF0FBE29
:101CE000CDBFDF91CF911F9108950895CF9380913B
:101CF000E4018823B1F08091E9008F709091EC00AD
:101D000090FF02C090E801C090E0C92FC82B10924C
:101D1000E9008091E80083FD0E94270DCF70C093F9
:101D2000E900CF9108959093690180936801089527
:101D3000E0916801F0916901309721F00190F08104
:101D4000E02D099480E00895E0916801F091690127
:101D5000309721F00280F381E02D09940895E091FD
:101D60006801F0916901309721F00480F581E02D40
:101D700009940895209166013091670182179307B5
:101D800071F09093670180936601E0916801F09192
:101D90006901309721F00680F781E02D09940895BC
:101DA00020916401309165018217930771F090933F
:101DB000650180936401E0916801F09169013097B9
:101DC00021F00084F185E02D0994089508950C9484
:101DD000E60E0E94251B0E94B5030C94EB1BCF92CC
:101DE000DF92EF92FF920F931F93CF93DF93CDB7C4
:101DF000DEB72B970FB6F894DEBF0FBECDBF0E94A3
:101E0000CD038BE6C82E81E0D82E00E010E0E02E56
:101E1000802F0E94BB04F60141916F01F42EF82639
:101E2000B1F40F5F1F4F0E30110589F78FEF8983D3
:101E30008A831B820E942E1B8160782F9D838C8356
:101E400049815A816B818D810E94920F40C090918F
:101E5000CD0191FF04C08B870E94C1048B8520E0D7
:101E600030E04F2D50E0922FBA01022E02C075953E
:101E700067950A94E2F760FF24C02E83EF8221E089
:101E800030E0690102C0CC0CDD1C9A95E2F790E0CD
:101E90008C219D21892B09F420E028870E942E1B8C
:101EA0008160782F9A8789874E815F8168858A85CE
:101EB0000E94920FF801E559FE4F8081C826C0822A
:101EC00006C02F5F3F4F2630310569F6AACF0E942A
:101ED000D11E10916A010E94980E1817A1F00E945D
:101EE000980E80936A012B960FB6F894DEBF0FBE52
:101EF000CDBFDF91CF911F910F91FF90EF90DF90B9
:101F0000CF900C949D072B960FB6F894DEBF0FBEB2
:101F1000CDBFDF91CF911F910F91FF90EF90DF9098
:101F2000CF900895CF93DF93CDB7DEB72B970FB641
:101F3000F894DEBF0FBECDBF4F83588769877A877D
:101F40008B87DE01119686E0FD0111928A95E9F7F3
:101F500085E0FE01379601900D928A95E1F749815F
:101F60005A816B817C818D819E810E94E7162B9620
:101F70000FB6F894DEBF0FBECDBFDF91CF910895AD
:101F80000895CF93C82F882309F4C1C0823859F42B
:101F90000E94980E81FDBBC089E30E9491190E94A6
:101FA0005B1A89E30CC0833879F40E94980E80FD97
:101FB000AEC083E50E9491190E945B1A83E50E94DE
:101FC000D119CF910C945B1A843859F40E94980E61
:101FD00082FD9DC087E40E9491190E945B1A87E4EC
:101FE000EECF8CEF8C0F813A48F48C2F0E940F219A
:101FF00081118DC08C2F0E949119E3CF80E28C0F4C
:10200000883048F4C77081E001C0880FCA95EAF7AC
:102010000E94121AD6CF8BE58C0F833078F4C53A24
:1020200029F0C63A31F482E890E005C081E890E0FA
:1020300002C083E890E0CF910C94BA0E88E58C0F33
:10204000833108F064C0C83A39F1C93A41F1CA3A5B
:1020500049F1CB3A51F1CC3A59F1CD3A61F1C03B5B
:1020600069F1CE3A71F1CF3A79F1C13B81F1C23BCE
:1020700089F1C33B91F1C43B99F1C53BA1F1C63B4A
:10208000A9F1C73BB1F1C83BB9F1C93BC1F1CA3BAA
:10209000C9F58AE292E038C082EE90E035C089EE60
:1020A00090E032C08AEE90E02FC085EB90E02CC02B
:1020B00086EB90E029C087EB90E026C08CEC90E0A6
:1020C00023C08DEC90E020C083E891E01DC08AE839
:1020D00091E01AC082E991E017C084E991E014C050
:1020E00081E292E011C083E292E00EC084E292E0CD
:1020F0000BC085E292E008C086E292E005C087E26C
:1021000092E002C080E090E0CF910C94D00ECF918D
:102110000895882309F44BC0823859F40E94980E20
:1021200081FF45C089E30E9491190E945B1A89E3EF
:102130000CC0833871F40E94980E80FF38C083E58C
:102140000E9491190E945B1A83E50E94D1190C9498
:102150005B1A843859F40E94980E82FF28C087E4E5
:102160000E9491190E945B1A87E4EFCF9CEF980FB1
:10217000913A58F390E2980F983050F4877091E0BC
:1021800001C0990F8A95EAF7892F0E94181ADFCFAC
:102190009BE5980F933020F480E090E00C94BA0E09
:1021A000885A833120F480E090E00C94D00E08959A
:1021B000882321F00E94121A0C945B1A0895882338
:1021C00021F00E94181A0C945B1A0895CF92DF92A6
:1021D000EF92FF920F931F93CF93DF93CDB7DEB7AC
:1021E00028970FB6F894DEBF0FBECDBF8C0185E0F7
:1021F000F801DE01119601900D928A95E1F7F80140
:10220000D080E180F280558152955F7023813481C6
:10221000232B39F0FFEFEF1206C081E0DF1203C07D
:1022200003C081E001C080E080FDE2C2C8015F839D
:102230000E94C00FD982EA8269817A818F2D0E9423
:102240008D199E8388870E9441190E9414184E811F
:102250005F816885FF2029F00E942F1A68855F81C1
:102260004E81E42FE295EF70F0E0E05AFF4F0C94BE
:102270005323842F807F142F1F70882311F0129511
:10228000107FFF20B1F0112309F467C280E2860FAE
:10229000883028F4812F68870E94121A04C0812F89
:1022A00068870E94221A688568870E945B1A688581
:1022B00054C2862F68870E9489106885112309F40B
:1022C00097C2605E812F683018F40E94181A02C00D
:1022D0000E94281A28960FB6F894DEBF0FBECDBF15
:1022E000DF91CF911F910F91FF90EF90DF90CF90F2
:1022F0000C945B1A242F207F842F8F70203211F0D2
:102300008295807F662319F0613019F12BC0FF2080
:10231000B1F0552309F493C1513009F090C12896CA
:102320000FB6F894DEBF0FBECDBFDF91CF911F91E6
:102330000F91FF90EF90DF90CF900C94421A5523AD
:1023400019F0513009F454C28E830E94451A8E81CF
:1023500089C1FF2021F0523008F04AC270C15111EA
:1023600047C280C1FF2021F0552309F468C1F5C19F
:10237000552309F477C105C2242F2695269523708D
:1023800030E02115310521F021303105C9F030C28E
:10239000FF2021F0862F942F937002C080E090E000
:1023A00028960FB6F894DEBF0FBECDBFDF91CF9158
:1023B0001F910F91FF90EF90DF90CF900C94BA0E89
:1023C000FF2021F0862F942F937002C080E090E0D0
:1023D00028960FB6F894DEBF0FBECDBFDF91CF9128
:1023E0001F910F91FF90EF90DF90CF900C94D00E43
:1023F000862FFF2019F00E94D91D02C00E94411EA5
:1024000028960FB6F894DEBF0FBECDBFDF91CF91F7
:102410001F910F91FF90EF90DF90CF900C94C61E0C
:10242000842F837009F076C0F110E2C1262F229527
:1024300026952770220F220F862F8F70C82ED12C41
:10244000E12CF12C022E04C0CC0CDD1CEE1CFF1C78
:102450000A94D2F764FF10C06FE070E080E090E073
:1024600004C0660F771F881F991F2A95D2F76095C1
:1024700070958095909503C060E070E0CB01242FAB
:10248000269526952370422F50E042305105D1F019
:102490004330510559F16C297D298E299F294130FE
:1024A000510541F128960FB6F894DEBF0FBECDBF9F
:1024B000DF91CF911F910F91FF90EF90DF90CF9020
:1024C0000C9439186C297D298E299F2928960FB6DE
:1024D000F894DEBF0FBECDBFDF91CF911F910F915A
:1024E000FF90EF90DF90CF900C9453180E94391812
:1024F000C701B60128960FB6F894DEBF0FBECDBF58
:10250000DF91CF911F910F91FF90EF90DF90CF90CF
:102510000C941F18FF2019F0842F817001C086953C
:10252000882309F465C1262F229526952770220F4E
:10253000220F862F8F70C82ED12CE12CF12C022E69
:1025400004C0CC0CDD1CEE1CFF1C0A94D2F764FF07
:1025500010C06FE070E080E090E004C0660F771F6D
:10256000881F991F2A95D2F7609570958095909550
:1025700003C060E070E0CB01242F269526952370E0
:10258000422F50E042305105D1F04330510559F10E
:102590006C297D298E299F294130510541F12896CA
:1025A0000FB6F894DEBF0FBECDBFDF91CF911F9164
:1025B0000F91FF90EF90DF90CF900C940D196C2944
:1025C0007D298E299F2928960FB6F894DEBF0FBE6D
:1025D000CDBFDF91CF911F910F91FF90EF90DF90D2
:1025E000CF900C9427190E940D19C701B6012896A7
:1025F0000FB6F894DEBF0FBECDBFDF91CF911F9114
:102600000F91FF90EF90DF90CF900C94F318603F04
:10261000C9F118F4603E50F49BC0623F09F460C0F9
:1026200008F44AC0633F09F46FC092C0162F1F70B0
:10263000842F8F71FF2099F00E948C18812F28968B
:102640000FB6F894DEBF0FBECDBFDF91CF911F91C3
:102650000F91FF90EF90DF90CF900C94D8100E94D4
:10266000AD18812F28960FB6F894DEBF0FBECDBFF0
:10267000DF91CF911F910F91FF90EF90DF90CF905E
:102680000C94DF10FF20A1F05111B2C0842F8F7184
:1026900028960FB6F894DEBF0FBECDBFDF91CF9165
:1026A0001F910F91FF90EF90DF90CF900C94D21874
:1026B000523008F09DC0EACFFF20A1F0842F8F7127
:1026C00028960FB6F894DEBF0FBECDBFDF91CF9135
:1026D0001F910F91FF90EF90DF90CF900C948C188A
:1026E000FF2061F3842F8F7128960FB6F894DEBF18
:1026F0000FBECDBFDF91CF911F910F91FF90EF9053
:10270000DF90CF900C94AD18FF2091F0842F8F7143
:1027100028960FB6F894DEBF0FBECDBFDF91CF91E4
:102720001F910F91FF90EF90DF90CF900C9477184E
:1027300028960FB6F894DEBF0FBECDBFDF91CF91C4
:102740001F910F91FF90EF90DF90CF900C946D1838
:10275000FF20A1F0552309F4B1CF862F28960FB69C
:10276000F894DEBF0FBECDBFDF91CF911F910F91C7
:10277000FF90EF90DF90CF900C94C10F552309F498
:10278000B1CF862F28960FB6F894DEBF0FBECDBF0F
:10279000DF91CF911F910F91FF90EF90DF90CF903D
:1027A0000C9489104F70C8010E94550228960FB6EC
:1027B000F894DEBF0FBECDBFDF91CF911F910F9177
:1027C000FF90EF90DF90CF900C9494174F70C8015A
:1027D00028960FB6F894DEBF0FBECDBFDF91CF9124
:1027E0001F910F91FF90EF90DF90CF900C94C20457
:1027F00028960FB6F894DEBF0FBECDBFDF91CF9104
:102800001F910F91FF90EF90DF90CF9008950E945D
:102810002F1A0E943F1A0E94041A0E945B1A0E94FB
:10282000721F0E94C61E80E090E00E94BA0E80E0F7
:1028300090E00C94D00E0E941F1A0C9407140E9472
:102840008219292F22952F7030E02C3031054CF45D
:102850002A3031056CF4225031092230310590F4D0
:1028600007C02C30310551F02F30310539F00AC046
:10287000803E10F0803F31F481E0089593FB88277B
:1028800080F9089580E00895CF93DF9300D000D0C1
:102890001F92CDB7DEB70F900F900F900F900F9053
:1028A000DF91CF910895CF93DF9300D000D000D077
:1028B000CDB7DEB726960FB6F894DEBF0FBECDBFFC
:1028C000DF91CF9108951F93CF93DF93C09179014A
:1028D00016E080917A01C81799F0D0E01C9FF001B2
:1028E0001D9FF00D1124E558FE4F408151816281FA
:1028F0007381848195810E9453142196C770E9CF1A
:10290000DF91CF911F9108954091AB015091AC019F
:102910006091AD017091AE018091AF019091B001D5
:102920000C945314CF938091B00182958F7009F06D
:102930005FC08091AD01882309F45AC020917901CC
:10294000A0917A016091AB017091AC018091AE01D0
:102950009091AF0131E06F3F09F030E0B32FC6E056
:102960002A1709F445C0009721F07F3F21F44B2F2F
:1029700003C041E001C040E030E040FD35C0C29FEF
:10298000F001C39FF00D1124E558FE4F41817413EF
:102990002BC04081641328C04281411125C043816E
:1029A00054814817590710F441505109481B590BDD
:1029B000483C5105C8F48091B0018F7080618093CC
:1029C000B00186E0829FF001839FF00D1124E05852
:1029D000FE4F80818F70806180838BEA91E00E943E
:1029E000E610CF910C9463142F5F3F4F2770B8CF40
:1029F000CF910895CF92DF92EF92FF920F931F93A2
:102A0000CF93DF93CDB7DEB762970FB6F894DEBFF2
:102A10000FBECDBF8C0185E0F801DE011D9601904F
:102A20000D928A95E1F7D8014C9111965C9111971E
:102A300012966C9112971396ED90FC9014977091EA
:102A4000AB01E091AC012091AE013091AF012115B5
:102A5000310531F0EF3F31F481E07F3F19F403C0DD
:102A600081E001C080E0B82FB170CB2E80FD6CC139
:102A7000D090AD01DD2009F4F5C0F091B001E2166F
:102A8000F30638F0C701821B930B883C910548F090
:102A90009BC0209530952E0D3F1D283C310508F038
:102AA00093C08F2F807F09F052C0E51314C07413B8
:102AB00012C0D62E61110FC0FF70F061F093B0010B
:102AC0000E9484148BEA91E00E94E6108091B0018C
:102AD000F80185836CC1EF2831F05F3F31F481E06C
:102AE0004F3F19F403C081E001C080E080FD03C0C6
:102AF00081E0862701C080E0F82FF170FF2E80FF73
:102B00001CC08091790120917A0136E0821709F486
:102B100028C190E0389FF001399FF00D1124E5584D
:102B2000FE4F7181571306C07081471303C0728135
:102B3000671303C001968770E9CFD62E662309F488
:102B400036C18091B00181608093B00153C0E5131C
:102B500008C0741306C0611104C0D8011596FC9317
:102B6000AEC04D875E878D859E856A8B0E941F143F
:102B70006A89882329F1D62E662311F12091B001AC
:102B8000822F82958F7090E002970CF460C0809144
:102B9000AB019091AC0198878F831986FB86EA86FA
:102BA0002C87CE01079651C0E51731F14D875E871E
:102BB0008D859E856A8B0E941F146A8981112EC0A3
:102BC000C8010E94E610A4C08F2F807F69F77E2D78
:102BD000F98AE88A89890E9444148BEA91E00E946C
:102BE000E610EBEAF1E086E0DF011D928A95E9F755
:102BF0000E948414D12CDBC07413D8CF6111D6CFBE
:102C0000D8011596FC93C8010E94E610EBEAF1E0AA
:102C100086E0DF011D928A95E9F7C9C0D62E6623AA
:102C200079F22091B001822F82958F7090E0029707
:102C300074F08091AB019091AC019A8389831B82DF
:102C4000FD82EC822E83CE0101960E94E61086E082
:102C5000F801ABEAB1E001900D928A95E1F70E948C
:102C600092146FC0E216F30628F0C701821B930B83
:102C70009C0104C0209530952E0D3F1D283C310548
:102C800008F052C0D62E662309F49ACFE5132CC063
:102C900074132AC08091B00180FD1DC0982F9295B9
:102CA0009F70C9F0D80115968C9315979F3039F015
:102CB0009F5F9295907F8F70892B15968C93C8019A
:102CC0000E94E61086E0F801ABEAB1E001900D92B7
:102CD0008A95E1F736C086E0F801ABEAB1E00190F1
:102CE0000D928A95E1F763C04D875E878D859E853D
:102CF0000E941F14882379F086E0F801ABEAB1E066
:102D000001900D928A95E1F70E9492140E9484141A
:102D1000DD24D3944CC08091B00181608093B001D8
:102D2000C8010E94E61043C07E2DF98AE88A89898D
:102D30000E944414EBEAF1E086E0DF011D928A95DF
:102D4000E9F70E94841433C0662309F439CF4D8714
:102D50005E878D859E850E941F14882309F430CFDD
:102D6000CBCF4D875E878D859E850E948219292F46
:102D700022952F7030E0223031052CF49F7041F005
:102D8000811106C00CC0243031052CF49F7049F429
:102D9000805E883020F0C8010E94E610CF2CDC2C29
:102DA00006C0D80115969C91907F91F7F8CF8D2D94
:102DB00062960FB6F894DEBF0FBECDBFDF91CF9104
:102DC0001F910F91FF90EF90DF90CF9008951F9388
:102DD000CF93DF93CDB7DEB72C970FB6F894DEBF55
:102DE0000FBECDBF4F83588769877A878B879C87B3
:102DF000CE0107960E94FA148823C1F02F813885EE
:102E00008A859B85892B31F03F3F11F080E003C01C
:102E10002F3FE1F781E0811147C04F8158856985D7
:102E20007A858B859C850E9453143EC086E0FE0106
:102E30003796DE01119601900D928A95E1F7FF8198
:102E4000E8854A855B854115510531F0EF3F31F446
:102E500081E0FF3F19F403C081E001C080E080FD04
:102E600023C020917A0130E0C9010196877099272B
:102E70006091790170E086179707F1F1F983EA8391
:102E80005D834C8396E0929FD001939FB00D1124F7
:102E9000A558BE4FFE01319601900D929A95E1F72B
:102EA00080937A010E94631416E0809179019091D9
:102EB0007A01891779F1189FC001112485589E4F16
:102EC0000E94FA14882331F1E09179011E9FF001EC
:102ED0001124E558FE4F40815181628173818481C4
:102EE00095810E9453148091790190E0019687703A
:102EF000992780937901D9CF0E941B1410927A01EF
:102F000010927901EBEAF1E086E0DF011D928A95EB
:102F1000E9F7CACF2C960FB6F894DEBF0FBECDBF2F
:102F2000DF91CF911F910895EF92FF920F931F931E
:102F3000CF93DF93FC01009709F46FC0F12CEE24CE
:102F4000E394EF0121968491843740F4843008F0B3
:102F500055C0813081F0823021F15FC0853709F49E
:102F600047C0C0F19CE7980F903708F056C08F77A4
:102F70000E94891045C08F010E5F1F4FFE01849192
:102F800090E2980F983050F48770FE2D01C0FF0F2B
:102F90008A95EAF78F2F0E94321A15C00E94C10F3E
:102FA00014C08F010E5F1F4FFE01849190E2980FB5
:102FB000983068F48770FE2D01C0FF0F8A95EAF7FC
:102FC0008F2F0E94381A0E945B1AE80119C00E94D4
:102FD0008910FBCFCF010296FE01C491CC2361F092
:102FE000EFE9FFE03197F1F700C00000C150F6CFE4
:102FF000CF010296FE01F490EC0102C00E94C10FC5
:103000008F2D882341F0EFE9FFE03197F1F700C001
:1030100000008150F6CFFE0194CFDF91CF911F9138
:103020000F91FF90EF90089508956093B50170930C
:10303000B6018093B7019093B8010C9407140F93D5
:103040001F930091B5011091B6012091B701309105
:10305000B801062B172B282B392B0093B5011093A1
:10306000B6012093B7013093B8011F910F910C94D2
:1030700007140F931F930091B5011091B601209191
:10308000B7013091B8010623172328233923009371
:10309000B5011093B6012093B7013093B8011F9189
:1030A0000F910C9407140F931F930091B501109189
:1030B000B6012091B7013091B801062717272827BC
:1030C00039270093B5011093B6012093B7013093CF
:1030D000B8011F910F910C9407141092B101109236
:1030E000B2011092B3011092B4010C94071441E0A4
:1030F00050E060E070E004C0440F551F661F771F6A
:103100008A95D2F74093B1015093B2016093B30115
:103110007093B4010C94071441E050E060E070E05B
:1031200004C0440F551F661F771F8A95D2F7809100
:10313000B1019091B201A091B301B091B401842B7F
:10314000952BA62BB72B8093B1019093B201A0933E
:10315000B301B093B4010C94071441E050E060E077
:1031600070E004C0440F551F661F771F8A95D2F781
:1031700040955095609570958091B1019091B20104
:10318000A091B301B091B40184239523A623B72362
:103190008093B1019093B201A093B301B093B401B5
:1031A0000C94071441E050E060E070E004C0440F6C
:1031B000551F661F771F8A95D2F78091B1019091B4
:1031C000B201A091B301B091B40184279527A6273D
:1031D000B7278093B1019093B201A093B301B0934C
:1031E000B4010C9407140F931F930091B101109137
:1031F000B2012091B3013091B401062B172B282B7B
:10320000392B0093B1011093B2012093B301309395
:10321000B4011F910F910C9407140F931F93009109
:10322000B1011091B2012091B3013091B401062394
:103230001723282339230093B1011093B20120935F
:10324000B3013093B4011F910F910C9407140F93A5
:103250001F930091B1011091B2012091B3013091FF
:10326000B40106271727282739270093B1011093A7
:10327000B2012093B3013093B4011F910F910C94CC
:1032800007140895CF92DF92EF92FF920F931F934E
:10329000CF93DF93EC01C090B501D090B601E090E0
:1032A000B701F090B8018091B1019091B201A09165
:1032B000B301B091B401C82AD92AEA2AFB2A0FE146
:1032C00010E0B701A601002E04C0769567955795CA
:1032D00047950A94D2F740FD05C00150110988F7BF
:1032E00080E007C0BE01802F0E9402070197A9F36A
:1032F000802FDF91CF911F910F91FF90EF90DF9082
:10330000CF900895CF93DF93EC010E944219BE0144
:103310000E940207DF91CF910895CB010E9482198C
:10332000089590910C019923D9F090910D01992362
:10333000B9F0982F9695969596959F3088F5E091DF
:103340000E01F0910F01E90FF11D877021E030E0CF
:1033500001C0220F8A95EAF78181822B818308952B
:1033600040910E0150910F0120E030E09FEFFA01F3
:10337000E20FF31F6281681799F09F3F19F4611102
:1033800001C0922F2F5F3F4F2E30310581F79F3FB5
:1033900039F0FA01E90FF11D97FDFA95828308953E
:1033A000089590910C019923E1F090910D019923DA
:1033B000C1F0982F9695969596959F3020F5E091BF
:1033C0000E01F0910F01E90FF11D877021E030E04F
:1033D00001C0220F8A95EAF7209581812823218355
:1033E000089540910E0150910F0120E030E0FA0164
:1033F000E20FF31F9281981301C012822F5F3F4F9B
:103400002E303105A1F7089581E090E0E0910E01A2
:10341000F0910F01E80FF91F10820196803191059C
:10342000A9F708959091CC01982B9093CC01089521
:1034300080959091CC0198239093CC01089510929F
:10344000CC0108959091CB01982B9093CB010895D6
:1034500080959091CB0198239093CB010895109281
:10346000CB0108959091CA01982B9093CA010895B9
:1034700080959091CA0198239093CA010895109263
:10348000CA0108958093B90108951092B901089571
:1034900040910E0150910F0120E030E080E0FA01F0
:1034A000E20FF31F918191118F5F2F5F3F4F2F30FC
:1034B0003105A9F70895E0910E01F0910F01809177
:1034C000CC018083E0910E01F0910F0180819091F9
:1034D000CB01892B8083E0910E01F0910F01808157
:1034E0009091CA01892B80839091B901992361F051
:1034F000E0910E01F0910F018081892B80830E9461
:10350000481A81111092B90180910E0190910F011A
:103510000C94A40ECF92DF92EF92FF920F931F9321
:103520006C01EE24FF24C114D104E104F10421F460
:103530006B017C0180E001C080E133272F2D1E2D1F
:103540000D2D011511052105310519F0885F680160
:10355000790197018601A4E036952795179507957F
:10356000AA95D1F7011511052105310519F08C5FD8
:103570006801790197018601F2E036952795179544
:103580000795FA95D1F7011511052105310519F0B7
:103590008E5F68017901B701A60176956795579509
:1035A0004795452B462B472B09F08F5F1F910F91B5
:1035B000FF90EF90DF90CF9008958091E4018430E8
:1035C00039F11092CE0120E488E190E00FB6F89432
:1035D000A895809360000FBE2093600080E00E9459
:1035E0009D0783B7817F846083BF83B7816083BF7A
:1035F0007894889583B78E7F83BF0FB6F894A8958B
:1036000080916000886180936000109260000FBE1E
:10361000089508950895CF930E94091B0E94CD0339
:103620000E940A1BC0E08C2F0E94BB04811104C0C1
:10363000CF5FCE30C1F701C081E0CF9108950E94E5
:103640001B140E94980E0C949D0782E084BD93E0A9
:1036500095BD9AEF97BD80936E0008952FB7F894AB
:103660008091CF019091D001A091D101B091D20170
:103670002FBF0895CF92DF92EF92FF920F931F9387
:103680002FB7F8944091CF015091D0016091D101B2
:103690007091D2012FBF6A017B01EE24FF248C01BF
:1036A00020E030E0C016D106E206F30610F44150E7
:1036B0005109481B590BCA011F910F91FF90EF90C0
:1036C000DF90CF9008951F920F920FB60F921124A2
:1036D0008F939F93AF93BF938091CF019091D0012F
:1036E000A091D101B091D2010196A11DB11D80938D
:1036F000CF019093D001A093D101B093D201BF919B
:10370000AF919F918F910F900FBE0F901F901895C2
:103710000E949E0BF8942FEF87EA91E6215080409B
:103720009040E1F700C0000087E090EBDC0180935F
:10373000EE019093EF01A093F001B093F1012CE022
:1037400088E190E00FB6F894A895809360000FBED2
:1037500020936000FFCFEF92FF920F931F93CF93C0
:10376000DF93D82FC0E08C2F0E94BB0400E010E054
:10377000E82EF12CC701002E02C0959587950A947A
:10378000E2F780FD06C00F5F1F4F0630110591F76D
:1037900009C0602F7C2F80E00E94C304D813F3CFB0
:1037A00081E004C0CF5FCE30F1F680E0DF91CF91B1
:1037B0001F910F91FF90EF900895CF93C82F8CE247
:1037C0000E94AB1B882321F08C2FCF910C94AB1B54
:1037D00080E0CF910895CF930E94321D811102C0E5
:1037E0000E94181DC5E6C15049F00E94CD038FE329
:1037F0009CE90197F1F700C00000F5CF89E20E9433
:10380000DD1B811113C18AE20E94DD1B81110E9420
:10381000181D85E00E94DD1B81110E94881B0E94FB
:103820003D1D8093CD0187E00E94DD1B8823A9F117
:103830008BE10E94DD1B882351F08091CD0181FB3B
:10384000222720F991E0922790FB81F90EC08EE0AB
:103850000E94DD1B882361F08091CD0182FB22272D
:1038600020F991E0922790FB82F98093CD0115C059
:1038700080E10E94DD1B9091CD01882341F093FBF4
:10388000222720F981E0822780FB93F904C0892F49
:10389000809580FB90F99093CD018091CD010E949D
:1038A000411D0E944F1D8093ED0180EE0E94DD1BA3
:1038B000882341F08091ED01982F909590FB80F93D
:1038C0008093ED0189E30E94DD1B882359F08091EC
:1038D000ED0181FB222720F991E0922790FB81F9ED
:1038E0008093ED0182EE0E94DD1B882359F08091C8
:1038F000ED0182FB222720F991E0922790FB82F9CB
:103900008093ED0186EE0E94DD1B882359F08091A3
:10391000ED0183FB222720F991E0922790FB83F9A8
:103920008093ED0183EE0E94DD1B882359F0809186
:10393000ED0184FB222720F991E0922790FB84F986
:103940008093ED0185E30E94DD1B882359F080916F
:10395000ED0185FB222720F991E0922790FB85F964
:103960008093ED0181E30E94DD1B882359F0809153
:10397000ED0186FB222720F991E0922790FB86F942
:103980008093ED0181E10E94DD1B882359F0809135
:10399000ED0187FB222720F991E0922790FB87F920
:1039A0008093ED018091ED010E94531D8091ED0106
:1039B00087FB882780F980930D0187E20E94DD1B39
:1039C000C82F8EE10E94DD1B8111C2608FE10E9431
:1039D000DD1B8111C46080E20E94DD1B8111C86083
:1039E00081E20E94DD1B8111C06182E20E94DD1B29
:1039F0008111C06283E20E94DD1B8111C06484E2F8
:103A00000E94DD1B882311F0C06802C0CC2329F07E
:103A10008C2F0E944A1D6C2F03C00E94461D682FE8
:103A200070E080E090E0CF910C941518CF9108954C
:103A30006DEE7EEF80E090E00E948D2360E082E0FA
:103A400090E00E947B2360E083E090E00E947B2373
:103A500060E084E090E00E947B2360E085E090E0FD
:103A60000C947B2380E090E00E94752321E08D3E42
:103A70009E4F09F020E0822F089582E090E00C94A0
:103A80006D23682F82E090E00C947B2383E090E02C
:103A90000C946D23682F83E090E00C947B2384E0EA
:103AA00090E00C946D23682F84E090E00C947B23CD
:103AB0008091D50180FF0BC06091130185E0689F64
:103AC000B001112475956795759567952AC081FF9A
:103AD00009C06091130185E0689FB00111247595BC
:103AE00067951FC082FF07C06091130185E0689F42
:103AF000B001112416C04091D6014423C9F0609151
:103B00001201461788F72091130185E0289F900144
:103B10001124429FC001439F900D112470E00E9428
:103B20003F236038710540F46115710539F002C01A
:103B300065E070E0862F08958FE7089581E008958D
:103B40008091D50180FF08C06091110170E07595EA
:103B500067957595679521C081FF06C06091110139
:103B600070E07595679519C082FF04C060911101DE
:103B700070E010C08091D6018823C1F060911001DF
:103B80008617A0F790911101989FC001112470E051
:103B90000E943F236038710528F46115710521F0FA
:103BA000862F08958FE7089581E0089561E070E021
:103BB000F4CF803F21F40E94581D819504C0813FBD
:103BC00029F40E94581D8093D9010895823F21F461
:103BD0000E94581D819504C0833F29F40E94581DFE
:103BE0008093D8010895893F19F40E94A01D05C053
:103BF0008A3F31F40E94A01D81958093DA010895D7
:103C00008B3F21F40E94A01D819504C08C3F29F4B4
:103C10000E94A01D8093DB010895843F21F48091D0
:103C2000D701816017C0853F21F48091D701826060
:103C300011C0863F21F48091D70184600BC0873F7B
:103C400021F48091D701886005C0883F31F48091CC
:103C5000D70180618093D70108958D3F21F4809131
:103C6000D50181600BC08E3F21F48091D501826027
:103C700005C08F3F29F48091D50184608093D501E0
:103C80000895803F39F48091D90187FF6CC010926C
:103C9000D90169C0813F29F48091D9011816BCF37C
:103CA00062C09091D801823F29F497FF5CC01092C6
:103CB000D80159C0833F19F41916CCF354C0893F79
:103CC00041F48091DA0118160CF04DC01092DA011F
:103CD0004AC08A3F29F48091DA0187FF44C0F6CFB9
:103CE0008B3F39F48091DB0187FF3DC01092DB01EF
:103CF0003AC08C3F29F48091DB011816BCF333C025
:103D0000843F21F48091D7018E7F17C0853F21F435
:103D10008091D7018D7F11C0863F21F48091D7011A
:103D20008B7F0BC0873F21F48091D701877F05C02F
:103D3000883F31F48091D7018F7E8093D70113C0E3
:103D40008D3F21F48091D5018E7F0BC08E3F21F4F1
:103D50008091D5018D7F05C08F3F29F48091D501D9
:103D60008B7F8093D5018091D80181110EC0809105
:103D7000D90181110AC08091DA01811106C08091B8
:103D8000DB01811102C01092D601089587ED91E008
:103D90000E94AF0E0E942E1B9093D4018093D301FA
:103DA00008951F93CF93DF938091D3019091D40115
:103DB0000E943A1B4091D601442321F02091140126
:103DC00030E006C0209115015AE0259F9001112492
:103DD0008217930708F482C08091D8011091D9010D
:103DE000D091DA01C091DB01811107C0111105C02A
:103DF000D11103C0CC2309F471C04F3F19F04F5FBC
:103E00004093D601181624F40E94581D8093D801BF
:103E10008091D80187FF05C00E94581D819580932D
:103E2000D801111624F40E94581D8093D901809165
:103E3000D90187FF05C00E94581D81958093D90143
:103E40006091D801662339F11091D901112319F13C
:103E5000772767FD7095872F972F0E94462223E3CF
:103E600033E343E35FE30E94AA220E940E226093A1
:103E7000D801612F772767FD7095872F972F0E94B4
:103E8000462223E333E343E35FE30E94AA220E9436
:103E90000E226093D9011D1624F40E94A01D809368
:103EA000DA018091DA0187FF05C00E94A01D81958B
:103EB0008093DA011C1624F40E94A01D8093DB017C
:103EC0008091DB0187FF05C00E94A01D8195809332
:103ED000DB01DF91CF911F910C94C61EDF91CF9132
:103EE0001F910895E7EDF1E085E0DF011D928A95CD
:103EF000E9F71092D6011092D5010895833081F12F
:103F000028F4813059F08230D1F00895853009F4D9
:103F100049C0B8F1863009F456C008958091150162
:103F2000262F30E0280F311D2F3F310524F4680F74
:103F30006093150108958FEF809315010895809186
:103F40001401262F30E0280F311D2F3F310524F4B6
:103F5000680F6093140108958FEF80931401089502
:103F600080911301262F30E0280F311D2F3F31059E
:103F700024F4680F6093130108958FEF8093130169
:103F8000089580911201262F30E0280F311D2F3F18
:103F9000310524F4680F6093120108958FEF809328
:103FA0001201089580911101262F30E0280F311D54
:103FB0002F3F310524F4680F6093110108958FEFAE
:103FC00080931101089580911001262F30E0280F71
:103FD000311D2F3F310524F4680F609310010895BF
:103FE0008FEF809310010895833011F128F4813010
:103FF00049F0823091F00895853081F120F18630CA
:10400000C1F1089580911501681720F4861B8093F3
:1040100015010895109215010895809114016817F3
:1040200020F4861B809314010895109214010895C2
:1040300080911301681720F4861B80931301089563
:1040400010921301089580911201681720F4861BC5
:104050008093120108951092120108958091110128
:10406000681720F4861B80931101089510921101A6
:10407000089580911001681720F4861B8093100129
:1040800008951092100108950F931F938D3109F434
:104090006BC008F03FC08E3009F47FC0C0F4873099
:1040A00009F469C068F4863009F0B1C08091CD018F
:1040B000817F8E7F8093CD0181E08093DD01A8C058
:1040C000883009F4A2C08B3009F49FC0A0C08631AB
:1040D00009F49BC078F4803109F472C0813109F091
:1040E00096C00E941B1490910D0181E08927809356
:1040F0000D018BC0893109F488C08B3109F087C06C
:104100008091CD0181FB222720F991E0922790FB3D
:1041100081F94CC0853309F470C048F4873209F442
:104120006CC008F459C0893209F467C070C0833488
:1041300038F48A3308F04EC0883309F466C067C08B
:10414000833409F45AC0883409F061C00E941B14FA
:104150000FEF13ED20E3015010402040E1F700C0C5
:1041600000000E94881B51C00E94C8210E94980E26
:104170000E949D074AC09091CD01892F8095817042
:1041800080FB90F929F0966098609093CD0140C033
:10419000997F977F9093CD0138C08091CD0182FBAC
:1041A000222720F991E0922790FB82F98093CD019C
:1041B000992359F18091CD0181608093CD0125C073
:1041C0008091CD0183FB222720F991E0922790FB7B
:1041D00083F9ECCF895301C08D5141E050E060E09C
:1041E00070E08A019B0104C0000F111F221F331FC2
:1041F0008A95D2F7C901B80104C061E070E080E09F
:1042000090E00E9415180E941B1481E001C080E01C
:104210001F910F91089580E0089580E00895CF9355
:10422000C82F8091DD01813079F018F08230E9F1FA
:1042300087C0E0910E01F0910F018081813169F01A
:10424000823209F07FC009C0E0910E01F0910F01A8
:104250008081813111F0823261F48C2F0E940B2118
:10426000811104C08C2F0E9444201DC081E090E089
:104270001AC08C2F0E940D21811114C0C43179F015
:1042800048F4CB3079F0C03109F060C082E080930F
:10429000DD0108C0C93219F0C83321F057C01092AF
:1042A000DD0154C081E0817053C0C93289F118F535
:1042B000C43171F1A8F4C73009F046C08AE0809398
:1042C000150194E19093140193E09093130180936E
:1042D000120188E08093110188E28093100134C0BC
:1042E000CE51C63088F5EC2FF0E0E65DFE4F8081C0
:1042F0008093DC0129C0CE34E9F020F4CB3421F5E1
:104300006AE013C0C13579F0C235F1F461E00DC047
:104310008091DC01882319F01092DC0115C081E046
:104320008093DD0115C061E006C08091DC010E9430
:104330007E1F0AC06AE08091DC010E94F41F04C065
:104340001092DD0180E004C081E002C080E0ABCFCC
:10435000CF910895E1E8F0E08081886080838081DA
:10436000816080838FB7F89493E09093890090EDFB
:10437000909388008FBF0895EFE6F0E0808182601F
:1043800080830895EFE6F0E080818D7F808308953B
:10439000EFE6F0E0808192E08927808308951F9204
:1043A0000F920FB60F9211242F933F934F935F9369
:1043B0006F937F938F939F93AF93BF93EF93FF93ED
:1043C0008091DE019091DF0101969093DF0180934F
:1043D000DE01811103C082E00E949D07E091DF01B0
:1043E000E695E695F0E0E252FC4FE4918091DE0123
:1043F0008E1303C080E00E949D07FF91EF91BF9153
:10440000AF919F918F917F916F915F914F913F916C
:104410002F910F900FBE0F901F9018950E9415229C
:104420006894B1110C94A42208950E94892288F006
:104430009F5798F0B92F9927B751B0F0E1F0660F68
:10444000771F881F991F1AF0BA95C9F714C0B130A9
:1044500091F00E94A322B1E008950C94A322672F4B
:10446000782F8827B85F39F0B93FCCF386957795D8
:104470006795B395D9F73EF49095809570956195C1
:104480007F4F8F4F9F4F0895E89409C097FB3EF4EC
:1044900090958095709561957F4F8F4F9F4F992391
:1044A000A9F0F92F96E9BB279395F695879577950F
:1044B0006795B795F111F8CFFAF4BB0F11F460FFCF
:1044C0001BC06F5F7F4F8F4F9F4F16C0882311F027
:1044D00096E911C0772321F09EE8872F762F05C03B
:1044E000662371F096E8862F70E060E02AF09A95D6
:1044F000660F771F881FDAF7880F9695879597F9CB
:10450000089557FD9058440F551F59F05F3F71F0C3
:104510004795880F97FB991F61F09F3F79F087952A
:104520000895121613061406551FF2CF4695F1DFB3
:1045300008C0161617061806991FF1CF8695710543
:10454000610508940895E894BB2766277727CB0177
:1045500097F908950E94BD220C942E230E942023D7
:1045600038F00E94272320F0952311F00C94172394
:104570000C941D2311240C94A4220E94812270F318
:10458000959FC1F3950F50E0551F629FF001729FF8
:10459000BB27F00DB11D639FAA27F00DB11DAA1F07
:1045A000649F6627B00DA11D661F829F2227B00D54
:1045B000A11D621F739FB00DA11D621F839FA00DDF
:1045C000611D221F749F3327A00D611D231F849F2F
:1045D000600D211D822F762F6A2F11249F57504086
:1045E0009AF0F1F088234AF0EE0FFF1FBB1F661F01
:1045F000771F881F91505040A9F79E3F510580F0CA
:104600000C9417230C94A4225F3FE4F3983ED4F358
:10461000869577956795B795F795E7959F5FC1F76D
:10462000FE2B880F911D9695879597F9089597F918
:104630009F6780E870E060E008959FEF80EC089548
:1046400000240A9416161706180609060895002471
:104650000A9412161306140605060895092E0394EB
:10466000000C11F4882352F0BB0F40F4BF2B11F45F
:1046700060FF04C06F5F7F4F8F4F9F4F089597FB80
:10468000072E16F4009407D077FD09D00E94592315
:1046900007FC05D03EF4909581959F4F0895709545
:1046A00061957F4F0895EE0FFF1F0590F491E02D67
:1046B0000994AA1BBB1B51E107C0AA1FBB1FA61769
:1046C000B70710F0A61BB70B881F991F5A95A9F7BB
:1046D00080959095BC01CD010895F999FECF92BDCA
:1046E00081BDF89A992780B50895A8E1B0E042E02D
:1046F00050E00C949523262FF999FECF92BD81BDF1
:10470000F89A019700B4021639F01FBA20BD0FB60F
:10471000F894FA9AF99A0FBE08950196272F0E94ED
:104720007C230C947B23DC01CB01FC01F999FECFA7
:1047300006C0F2BDE1BDF89A319600B40D92415029
:0A4740005040B8F70895F894FFCF39
:10474A0020029F072C080908D507A2070101BA0110
:10475A0028080A03140A3F4D36399F0352031C03E3
:10476A00E30276028F02A802C102010203040506CF
:04477A000708090023
:00000001FF

@ -0,0 +1,385 @@
[
{
"name": "Beginner's Keymap for Ergodox-EZ",
"author": "Anand Babu Periasamy"
},
[
{
"x": 3.5
},
"#\n3\n\n\nF3",
{
"x": 10.5
},
")\n0\n\n\nF10"
],
[
{
"y": -0.875,
"x": 2.5
},
"@\n2\n\n\nF2",
{
"x": 1
},
"$\n4\n\n\nF4",
{
"x": 8.5
},
"(\n9\n\n\nF9",
{
"x": 1
},
"_\n-\n\n\nF11"
],
[
{
"y": -0.875,
"x": 5.5
},
"%\n5\n\n\nF5",
"^\n6\n\n\nF6",
{
"x": 4.5
},
"&\n7\n\n\nF7",
"*\n8\n\n\nF8"
],
[
{
"y": -0.875,
"w": 1.5
},
"~\n`\n\n\nEsc",
"!\n1\n\n\nF1",
{
"x": 14.5
},
"+\n=\n\n\nF12",
{
"a": 7,
"w": 1.5
},
"Backspace\n\n\n\nBackspace"
],
[
{
"y": -0.375,
"x": 3.5
},
"E\n\n\n\n<i class=\"fa fa-caret-up\" aria-hidden=\"true\"></i>",
{
"x": 10.5
},
"I"
],
[
{
"y": -0.8799999999999999,
"x": 2.5
},
"W"
],
[
{
"y": -0.9950000000000001,
"x": 4.5,
"a": 4
},
"R",
{
"x": 8.5,
"a": 7
},
"U",
{
"x": 1
},
"O"
],
[
{
"y": -0.875,
"x": 5.5
},
"T",
{
"h": 1.5
},
"<i class=\"fa fa-chevron-circle-left\" aria-hidden=\"true\"></i>",
{
"x": 4.5,
"h": 1.5
},
"<i class=\"fa fa-chevron-circle-right\" aria-hidden=\"true\"></i>",
"Y"
],
[
{
"y": -0.875,
"a": 6,
"w": 1.5
},
"Tab",
{
"a": 7
},
"Q",
{
"x": 14.5
},
"P",
{
"a": 4,
"w": 1.5
},
"|\n\\"
],
[
{
"y": -0.375,
"x": 3.5,
"a": 7
},
"D\n\n\n\n<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>",
{
"x": 10.5
},
"K"
],
[
{
"y": -0.875,
"x": 2.5
},
"S\n\n\n\n<i class=\"fa fa-caret-left\" aria-hidden=\"true\"></i>",
{
"x": 1
},
"F\n\n\n\n<i class=\"fa fa-caret-right\" aria-hidden=\"true\"></i>",
{
"x": 8.5
},
"J",
{
"x": 1
},
"L"
],
[
{
"y": -0.875,
"x": 5.5
},
"G",
{
"x": 6.5
},
"H"
],
[
{
"y": -0.875,
"a": 4,
"fa": [
0,
0,
0,
2
],
"w": 1.5
},
"\n\n\nCtrl\n\n\nCaps",
{
"a": 7
},
"A",
{
"x": 14.5,
"a": 4
},
":\n;",
{
"a": 7,
"w": 1.5
},
"Enter"
],
[
{
"y": -0.625,
"x": 6.5,
"h": 1.5
},
"PgUp",
{
"x": 4.5,
"h": 1.5
},
"PgDn"
],
[
{
"y": -0.75,
"x": 3.5
},
"C",
{
"x": 10.5,
"a": 4
},
"<\n,"
],
[
{
"y": -0.875,
"x": 2.5,
"a": 7
},
"X",
{
"x": 1
},
"V",
{
"x": 8.5
},
"M",
{
"x": 1,
"a": 4
},
">\n."
],
[
{
"y": -0.875,
"x": 5.5,
"a": 7
},
"B",
{
"x": 6.5
},
"N"
],
[
{
"y": -0.875,
"w": 1.5
},
"Shift",
"Z",
{
"x": 14.5,
"a": 4
},
"?\n/",
{
"w": 1.5
},
"\"\n'"
],
[
{
"y": -0.375,
"x": 3.5,
"a": 7
},
"Alt\n\n\n\n<i class=\"fa fa-hand-o-left\" aria-hidden=\"true\"></i>",
{
"x": 10.5
},
"<i class=\"fa fa-long-arrow-down\" aria-hidden=\"true\"></i>\n\n\n\n<i class='fa fa-volume-down'></i>"
],
[
{
"y": -0.875,
"x": 2.5
},
"<i class='fa fa-linux'></i>",
{
"x": 1
},
"Alt\n\n\n\n<i class=\"fa fa-hand-o-right\" aria-hidden=\"true\"></i>",
{
"x": 8.5
},
"<i class=\"fa fa-long-arrow-left\" aria-hidden=\"true\"></i>",
{
"x": 1
},
"<i class=\"fa fa-long-arrow-up\" aria-hidden=\"true\"></i>\n\n\n\n<i class='fa fa-volume-up'></i>"
],
[
{
"y": -0.75,
"x": 0.5
},
"Ctrl\n\n\n\n<i class='fa fa-download'></i>",
"Esc",
{
"x": 14.5
},
"<i class=\"fa fa-long-arrow-right\" aria-hidden=\"true\"></i>\n\n\n\n<i class='fa fa-volume-off'></i>",
"Fn"
],
[
{
"r": 30,
"rx": 6.5,
"ry": 4.25,
"y": -1,
"x": 1
},
"<i class=\"fa fa-clone\" aria-hidden=\"true\"></i>",
"("
],
[
{
"h": 2
},
"Space",
{
"h": 2
},
"Del",
"["
],
[
{
"x": 2
},
"{"
],
[
{
"r": -30,
"rx": 13,
"y": -1,
"x": -3
},
")",
"<i class=\"fa fa-paste\" aria-hidden=\"true\"></i>"
],
[
{
"x": -3
},
"]",
{
"h": 2
},
"Enter",
{
"h": 2
},
"<i class=\"fa fa-chevron-left\" aria-hidden=\"true\"></i>"
],
[
{
"x": -3
},
"}"
]
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

@ -0,0 +1,140 @@
#include "ergodox_ez.h"
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define FN1 1 // media layer
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | BSpace |
* |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | Fwd | | Back | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* |Caps/Ctl| A | S | D | F | G |------| |------| H | J | K | L | ; | Enter |
* |--------+------+------+------+------+------| PgUp | | PgDn |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | ' |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | Ctrl | Esc | LGui | Alt | Alt | | Left | Up | Dn | Right| Fn |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | Copy | ( | | ) | Paste|
* ,------|------+------| |------+------+------.
* | | | [ | | ] | | |
* |Space | Del |------| |------| Enter|BSpace|
* | | | { | | } | | |
* `--------------------' `--------------------'
*/
// 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_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_WBAK,
CTL_T(KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_PGUP,
KC_LCTL, KC_ESC, KC_LGUI, KC_LALT, KC_LALT,
LCTL(KC_C), KC_LCBR,
KC_LPRN,
KC_SPC, KC_DEL, KC_LBRC,
// right hand
KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_WFWD, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT,
KC_UP, KC_LEFT, KC_RIGHT,KC_DOWN, TG(FN1),
KC_RCBR, LCTL(KC_V),
KC_RPRN,
KC_RBRC, KC_ENT, KC_BSPC
),
/* Keymap 1: Fn Keys, media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Esc | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | BSpace |
* |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Teensy| | | Lclk | Rclk | | |VolUp |VolDn | Mute | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------+------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// FN1 Layer
[FN1] = KEYMAP(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
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,
RESET, KC_TRNS, KC_TRNS,
// right hand
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, 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_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// 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;
}
};

@ -0,0 +1,21 @@
# Beginner's keymap for Ergodox-EZ
Beginner's keymap emulates standard QWERTY keyboard for beginners. Once you get comfortable with the Ergodox-EZ, you may fork this keymap and customize it for your own needs or find a suitable one from the community contributed keymaps.
![Beginner's Keymap](keyboard-layout.png)
#### Pros
* Easier to switch between regular keyboards and Ergodox-EZ.
* Easy on beginners. It has everything you need for your day to day usage.
#### Cons
* Keys are not ergonomically placed to take full advantage of Ergodox-EZ. Take a look at this [Default Keymap](https://github.com/jackhumbert/qmk_firmware/blob/master/keyboard/ergodox_ez/keymaps/default/readme.md)
* While multiple layers are possible, beginner's keymap only uses one additional layer for mouse, function and volume keys.
#### Notes
* Ideally number key [6] should have started from the right-hand side of the keyboard. Doing so breaks the familiar QWERTY layout.
* Quote key ['] should have been placed between [:] and [Enter]. Due to lack of key space, it is placed below [Enter].
* Double [Alt] keys are placed adjacent to each other for convenience.
* [CapsLock] also acts as [Ctrl] key when you press and hold. It is convenient for GNU Emacs users.
* Additional bracket keys are placed in the center of the keyboard for programmer's convenience.

@ -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

@ -7,6 +7,9 @@
#define SYMB 1 // symbols
#define MDIA 2 // media keys
#define LSFTO M(0) // Left shift, open parens when tapped
#define RSFTC M(1) // Right shift, close parens when tapped
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
@ -17,9 +20,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | BkSp | A | S | D | F | G |------| |------| H | Alt/J| K | L |; / L2| LGui/' |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift |
* |LShift/(|Z/Ctrl| X | C | V | B | [ | | ] | N | M | , | . |//Ctrl|RShift/)|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 |
* |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | -/L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | App | LGui | | Alt |Ctrl/Esc|
@ -36,18 +39,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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(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),
LSFTO, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_LBRC),
LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT, KC_RGHT,
ALT_T(KC_APP), KC_LGUI,
KC_HOME,
KC_SPC,KC_FN1,KC_END,
KC_SPC,KC_FN1,KC_END,
// right hand
KC_RGHT, KC_6,KC_7, KC_8, KC_9, KC_0, KC_MINS,
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_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,
KC_LALT, CTL_T(KC_ESC),
KC_RGHT, KC_6,KC_7, KC_8, KC_9, KC_0, KC_MINS,
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, LT(SYMB,KC_MINS),
KC_LALT, CTL_T(KC_ESC),
KC_PGUP,
KC_PGDN,LT(SYMB, KC_TAB), KC_ENT
),
@ -56,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| | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
@ -76,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
@ -98,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 | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
@ -117,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,
@ -137,21 +140,56 @@ 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;
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);
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;
}
break;
}
return MACRO_NONE;
};
@ -183,3 +221,5 @@ void matrix_scan_user(void) {
}
};

@ -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

@ -4,6 +4,23 @@ 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
* Turns bottom-right key into a minus/underscore (easy to reach with the right pinky)
## Apr 25, 2016:
* Made it so that the right and left Shift keys send opening and closing parens ( ) when tapped
## Feb 11, 2016:
* Updated ASCII legend for thumb clusters

@ -4,380 +4,175 @@
#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();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 97 KiB

@ -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"],

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 121 KiB

@ -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"],

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@ -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},""]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

@ -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"]

File diff suppressed because it is too large Load Diff

@ -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

@ -0,0 +1,45 @@
#include "ergodox_ez.h"
#include "debug.h"
#include "action_layer.h"
#define BASE 0
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[BASE] = KEYMAP(
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F5,
KC_TAB, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_BSLS,
CTL_T(KC_ESC), KC_A, KC_S, KC_E, KC_T, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC,
KC_F1, KC_F2, KC_F3, KC_F4, KC_LGUI,
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLD, KC_MUTE,
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLU,
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_BSPC, CTL_T(KC_ESC), KC_LALT,
//
/*-*/ KC_F6, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL,
/*-*/ KC_NO, KC_J, KC_U, KC_R, KC_L, KC_SCLN, KC_MINS,
/*-*/ /*-*/ KC_Y, KC_N, KC_I, KC_O, KC_H, KC_ENT,
/*-*/ KC_RBRC, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
/*-*/ /*-*/ /*-*/ KC_RGUI, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT,
KC_MPLY, KC_MNXT,
KC_MPRV,
KC_RALT, KC_QUOT, KC_SPC
)
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
};

@ -0,0 +1,28 @@
# Roman's Layout
There is only one layer based on [Norman layout](https://normanlayout.info/).
Looking for multiple-layer layouts?
- [Symbols, arrows, plover, HJKL arrows](../romanzolotarev-norman-plover-osx-hjkl/)
- [Same with IJKL arrows](../romanzolotarev-norman-plover-osx/)
[![keyboard-layout](romanzolotarev-norman-osx.png)](http://www.keyboard-layout-editor.com/#/gists/9e89d54f1ea6eeeb7dab1b2d19d28195)
## Functional Keys
- Tap `F1` to mute microphone via [Shush](http://mizage.com/shush/).
- Tap `F2` to copy screenshot to the clipboard.
- Hold `SHIFT` and tap `F2` to save screenshot as a file.
- Tap `F3`, `F4`, `F5`, `F6` to resize a window via [Divvy](http://mizage.com/divvy/).
## CTRL/ESC
CTRL and ESC are frequently used in Vim.
- Tap `CTRL/ESC` to send `ESC`.
- Hold `CTRL/ESC` to use as `CTRL`.
## Activate N-rollover
- Hold left `SHIFT` and right `SHIRT` and then tap `N`.

@ -0,0 +1,1092 @@
:100000000C94BB010C94FF010C94FF010C94FF01B4
:100010000C94FF010C94FF010C94FF010C94FF0160
:100020000C94FF010C94FF010C94E20A0C94B40BA5
:100030000C94FF010C94FF010C94FF010C94FF0140
:100040000C94FF010C9432200C94FF010C94FF01DE
:100050000C94FF010C94BD190C94FF010C94FF014A
:100060000C94FF010C94FF010C94FF010C94FF0110
:100070000C94FF010C94FF010C94FF010C94FF0100
:100080000C94FF010C94FF010C94FF010C94FF01F0
:100090000C94FF010C94FF010C94FF010C94FF01E0
:1000A0000C94FF010C94FF010C94FF01210C430CF4
:1000B000310D430C310D880CAB0C310D000D130DBF
:1000C000FF0FFF0F3C103C107F10BD10D612D61250
:1000D000D610D612D711D711AA12D612D612C11223
:1000E00035002B002971E1003A0000001E001400C9
:1000F00004001D003B00E2001F001A0016001B0058
:100100003C00297120000700080006003D002A007D
:100110002100090017001900E300A90022000E00C9
:100120000A0005000000AA003E00310000002F0078
:100130000000A8003F000000000030000000AE00FA
:1001400023000D001C0013000000AB002400180069
:1001500011001000E700AC00250015000C0036006F
:1001600050002C0026000F00120037005100340010
:10017000270033000B0038005200E6002E002D004F
:100180002800E5004F0000001603450072006700DC
:100190006F0044006F007800200045005A00000006
:1001A00016034500720067006F0044006F0078007E
:1001B000200045005A0000000403090409026D00F4
:1001C000040100A0FA090400000103010100092153
:1001D00011010001223F000705810308000A0904FC
:1001E00001000103010200092111010001224D005B
:1001F0000705820308000A09040200010300000049
:100200000921110100012236000705830308000AB5
:10021000090403000103000000092111010001226B
:1002200039000705840310000112011001000000CD
:1002300008EDFE071301000102000105010906A1F6
:1002400001050719E029E7150025019508750181C9
:100250000205081901290595057501910295017599
:100260000391010507190029771500250195787577
:10027000018102C005010980A10185021601002645
:10028000B7001A01002AB700751095018100C0055A
:100290000C0901A1018503160100269C021A010028
:1002A0002A9C02751095018100C005010902A10177
:1002B0000901A10005091901290515002501950568
:1002C000750181029501750381010501093009312C
:1002D0001581257F95027508810609381581257FCE
:1002E000950175088106050C0A38021581257F9550
:1002F0000175088106C0C005010906A1010507199D
:10030000E029E71500250195087501810295017521
:1003100008810105081901290595057501910295C6
:1003200001750391010507190029FF150025FF95A7
:100330000675088100C000000000000000000000F9
:1003400000010204060A0F17202C3A4A5D71879DAE
:10035000B3C7DAE9F5FCFFFCF5E9DAC7B39D8771AD
:100360005D4A3A2C20170F0A060402010000000023
:1003700000000000000011241FBECFEFDAE0DEBF56
:10038000CDBF04B603FE24C08091EF019091F0012F
:10039000A091F101B091F2018730904BA740B04B92
:1003A000B9F41092EF011092F0011092F101109245
:1003B000F20114BE84B7877F84BF88E10FB6F8943A
:1003C00080936000109260000FBEE0E0FFE30995AB
:1003D00011E0A0E0B1E0E8EEF3E402C005900D9278
:1003E000A433B107D9F711E0A4E3B1E001C01D9235
:1003F000AF3EB107E1F70E9426080C94F2210C945D
:100400000000089556985E9825982D9826982E9865
:1004100027982F98089508950C940B0256985E988B
:1004200025982D9826982E9827982F988FEF90E052
:10043000909389008093880090938B0080938A002A
:1004400090938D0080938C00259A2D9A2FEF80E752
:1004500092E0215080409040E1F700C00000269AD1
:100460002E9A2FEF80E792E0215080409040E1F7F4
:1004700000C00000279A2F9A2FEF80E792E02150CA
:1004800080409040E1F700C0000025982D982FEFA4
:1004900080E792E0215080409040E1F700C00000EA
:1004A00026982E982FEF80E792E0215080409040D0
:1004B000E1F700C0000027982F9856985E9825987D
:1004C0002D9826982E9827982F98089589EA80933A
:1004D000800089E08093810024982C983F988AB10D
:1004E0008F748AB96E98479A8BB1806B8BB9769A64
:1004F0000E940E020C94020280E28093000180911F
:10050000340181110EC00E94CB0281E0809334013E
:100510002FEF83ED90E3215080409040E1F700C041
:10052000000080E40E94D1028093000181112EC05E
:100530000E94FB0280930001811128C00E94FB02EF
:1005400080930001811122C08FE30E94FB028093FF
:10055000000181111BC00E94F30280E40E94D102BD
:1005600080930001811112C08CE00E94FB028093F5
:10057000000181110BC00E94FB02809300018111D8
:1005800005C08FE30E94FB02809300010E94F302EA
:100590008091000108951092B9008AE08093B8001C
:1005A000089594EA9093BC009091BC0097FFFCCF13
:1005B0009091B900987F983021F0903111F081E04E
:1005C00008958093BB0084E88093BC008091BC00B8
:1005D00087FFFCCF8091B900887F883111F080348B
:1005E00071F780E0089584E98093BC008091BC009D
:1005F00084FDFCCF08958093BB0084E88093BC0009
:100600008091BC0087FFFCCF9091B900987F81E07A
:10061000983209F480E0089584E88093BC008091CA
:10062000BC0087FFFCCF8091BB0008958091000142
:10063000811115C080E40E94D102809300018111D4
:100640000CC082E10E94FB0280930001811105C071
:100650008FEF0E94FB02809300010E94F30284B19D
:10066000807F84B985B1807F85B98AB1837F8AB95B
:100670008BB1837F8BB93E98469808950E947C0287
:10068000809300010E94160380B38C7080BB81B3FD
:10069000836F81BBA6E3B1E0E4E4F1E08EE08E0F6E
:1006A00011921D928E13FCCF0C946602BF92CF92D2
:1006B000DF92EF92FF920F931F93CF93DF9380917E
:1006C0000001882379F0809135018F5F8093350197
:1006D000811108C00E947C0280930001811102C038
:1006E0000E940E0206E311E0C0E0D0E0DD24D394C6
:1006F00082E0C82EEE24E394F12CC730D10500F53A
:1007000080910001811164C080E40E94D102809335
:100710000001811112C082E10E94FB02809300015E
:1007200081110BC0C7010C2E01C0880F0A94EAF793
:1007300080950E94FB02809300010E94F30248C052
:10074000CA30A1F028F4C83059F0C93061F005C0B2
:10075000CC3089F070F0CD3089F0209A289810C004
:10076000219A29980DC0229A2A980AC0239A2B9878
:1007700007C0529A01C0539A5B9802C03E9A4698AD
:1007800090EA9A95F1F79FB1799902C082E001C091
:1007900080E091709D25982B7C9902C084E001C077
:1007A00080E0892B7D9902C038E001C030E0832BC6
:1007B0007E9902C020E101C020E0822B9FB190957C
:1007C000991F9927991F9295990F907E892B0FC099
:1007D00080910001811149C080E40E94D102809380
:1007E0000001882379F1B12C0E94F3028B2DF801CE
:1007F0009081981719F08083C09201010E9416031E
:1008000021960F5F1F4FCE30D10509F076CF809132
:100810000101882361F1815080930101882339F01F
:100820008FE99FE00197F1F700C0000020C0A4E429
:10083000B1E0E6E3F1E0CF01825F91919D938E13E9
:10084000FCCF15C083E10E94FB028093000181115F
:10085000CACF81E40E94D102809300018111C3CFED
:100860000E940C03B82EB094BFCF80E0C0CF0E948E
:100870000C0281E0DF91CF911F910F91FF90EF90DB
:10088000DF90CF90BF900895E82FF0E0EC5BFE4F33
:100890008081089508958B3B910578F4883A9105FD
:1008A00040F5853A9105D0F48430910508F0B1C047
:1008B0008130910509F4ADC06BC0803E910508F40C
:1008C00067C0883E910508F4A4C09C01205F3109EF
:1008D0002031310508F05CC090650895853A910596
:1008E00009F459C0863A910509F058C082E890E4AD
:1008F0000895883A910509F454C0893A910509F49C
:1009000053C08A3A910509F452C08B3A910509F413
:1009100051C08C3A910509F450C08D3A910509F403
:100920004FC0803B910509F44EC08E3A910509F401
:100930004DC08F3A910509F44CC0813B910509F4F3
:100940004BC0823B910509F44AC0833B910509F4F1
:1009500049C0843B910509F448C0853B910509F4E1
:1009600047C0863B910509F446C0873B910509F4D1
:1009700045C0883B910509F444C0893B910509F4C1
:1009800043C08A3B910509F442C080E094E4089595
:1009900080E090E0089581E890E4089583E890E491
:1009A000089582EE94E4089589EE94E408958AEE21
:1009B00094E4089585EB94E4089586EB94E4089517
:1009C00087EB94E408958CEC94E408958DEC94E422
:1009D000089583E895E408958AE895E4089582E906
:1009E00095E4089584E995E4089581E296E40895F4
:1009F00083E296E4089584E296E4089585E296E41D
:100A0000089586E296E4089587E296E408958AE2DE
:100A100096E40895089596E0799FF001112494E5F5
:100A2000899FE00DF11D1124E60FF11DEE0FFF1F50
:100A3000E052FF4F859194910895880F991FFC0112
:100A4000E05AF040859194910895880F991FFC0118
:100A5000E052FF4F85919491089526E0729FF00136
:100A6000112444E5849FE00DF11D1124E60FF11DD2
:100A7000EE0FFF1FE052FF4F859194919C013A9534
:100A800021154FE1340708F41CC13F5121153041B5
:100A900020F49F700E94250508959C013053211574
:100AA000304118F49927906C0895811520E592073C
:100AB00071F40E94FA124FEF84E39CE041508040B1
:100AC0009040E1F700C000000E94E219FAC08130B6
:100AD00020E5920731F48091CD0181608093CD01B2
:100AE000F0C09C0130552115304108F051C0292F2C
:100AF00033272F70332721303105D9F4AC014370EF
:100B0000552702C0220F331F4A95E2F73C68AC011B
:100B100064E0440F551F6A95E1F744275370242B76
:100B2000352B73E0880F991F7A95E1F78076992726
:100B30001DC02230310529F4982F8827816F906AD3
:100B4000089523303105A9F4AC014370552721E005
:100B500030E002C0220F331F4A95E2F73C6843E0C1
:100B6000880F991F4A95E1F7807E9770822B932B0F
:100B7000089524303105E1F4AC014370552721E09C
:100B800030E002C0220F331F4A95E2F73A68E7CF00
:100B90009C0130572115304118F49F7090620895E0
:100BA0009C0130582115304118F49F70906A0895C7
:100BB000803E9105E0F4803C910558F58133910524
:100BC00009F46FC048F48932910509F463C08A3290
:100BD000910509F46DC072C089339105E9F082383E
:100BE0009105D1F08533910509F44DC067C0833E6E
:100BF000910581F138F4803E9105B9F0823E91056E
:100C0000D9F05CC0863E910561F1873E9105A1F166
:100C100055C00E941D0508952091E00120FD02C0ED
:100C200021FF4CC080EE90E049C08091E00180FF40
:100C3000F9CF89E390E042C08091E00182FF0EC0CD
:100C40008091E00184FF03C080E090E037C083EE34
:100C500090E034C08091E00182FFF2CF82EE90E01C
:100C60002DC08091E00183FF0BC08091E00184FDE5
:100C7000EBCF87EE90E022C08091E00183FFF5CFBB
:100C800086EE90E01BC08091E00185FF07C089E2FD
:100C900090E014C08091E00185FFF9CF85E390E0FA
:100CA0000DC08091E00186FF07C08AE290E006C097
:100CB0008091E00186FFF9CF81E390E00E944B0430
:100CC0000895089508950C94620680916201089534
:100CD000CF93DF9300D01F92CDB7DEB79C018091F8
:100CE000E601843019F593E099833B832A8390933E
:100CF000E9008FEF9091E800815095FD06C095EDD9
:100D00009A95F1F700008111F5CF8091E80085FFF9
:100D10000DC040E050E063E070E0CE0101960E941B
:100D2000D2088091E8008E778093E8000F900F90B2
:100D30000F90DF91CF910895CF93DF9300D01F9252
:100D4000CDB7DEB72091E601243021F522E02983DA
:100D50009B838A8383E08093E9008FEF9091E80082
:100D6000815095FD06C095ED9A95F1F7000081112F
:100D7000F5CF8091E80085FF0DC040E050E063E0D2
:100D800070E0CE0101960E94D2088091E8008E7733
:100D90008093E8000F900F900F90DF91CF9108950E
:100DA0002091E6012430F1F422E02093E9002FEFB6
:100DB0003091E800215035FD06C035ED3A95F1F748
:100DC00000002111F5CF2091E80025FF0BC040E085
:100DD00050E065E070E00E94D2088091E8008E77D4
:100DE0008093E8000895CF93DF93EC019091E601A2
:100DF000943009F046C080910C018823D9F080918D
:100E00000D018823B9F09093E9008FEF9091E800ED
:100E1000815095FD06C095E19A95F1F7000081118A
:100E2000F5CF8091E80085FF2CC040E050E060E104
:100E300070E017C081E08093E9008FEF9091E800A7
:100E4000815095FD06C095ED9A95F1F7000081114E
:100E5000F5CF8091E80085FF14C040E050E068E0E5
:100E600070E0CE010E94D2088091E8008E778093D6
:100E7000E80080E1FE01A2E5B1E001900D928A95C3
:100E8000E1F7DF91CF9108958091E501811109C0CB
:100E90000E94670A0E94C40A8091E20084608093E5
:100EA000E20008951092E501089508950C941F2022
:100EB0000E9478190E9425200E946A0D0C946306F6
:100EC00042E061EC81E00E94E10942E061EC82E0F5
:100ED0000E94E10942E061EC83E00E94E10942E105
:100EE00061EC84E00C94E1098091E801833009F41D
:100EF00055C030F4813071F0823009F48EC008950D
:100F00008A3009F47AC08B3009F460C0893009F066
:100F10009CC020C08091E701813A09F096C0809181
:100F2000E800877F8093E8008091EB019091EC01CD
:100F3000892B21F460E182E591E003C060E080E06C
:100F400090E070E00E941D098091E8008B7780930B
:100F5000E80008958091E701813209F076C0809120
:100F6000EB019091EC01009719F0039709F06DC027
:100F70008091E800877F8093E8008091E80082FDFF
:100F800005C08091E6018111F8CF5FC08091F1002A
:100F9000809362018091E8008B7753C08091E701D4
:100FA000813A09F052C08091EB019091EC01892BBC
:100FB00009F04BC08091E800877F8093E800809122
:100FC000E80080FFFCCF80910C0136C08091E701E2
:100FD0008132D9F58091EB019091EC01892BA9F533
:100FE0008091E800877F8093E8000E94160A809134
:100FF000E90180930C010C94FA128091E70181328F
:1010000021F58091E800877F8093E8000E94160A0E
:101010008091EA018093630108958091E701813A0C
:10102000A1F48091E800877F8093E8008091E80038
:1010300080FFFCCF809163018093F1008091E800F4
:101040008E778093E8000C94160A089584B7877F02
:1010500084BF88E10FB6F89480936000109260001E
:101060000FBE90E080E80FB6F894809361009093F3
:1010700061000FBE0E94B90D0E94670A0E94C40A57
:101080008091E20084608093E20078940E944A0D8F
:101090000E94BB0D82E091E00E94650D0E940D2030
:1010A0008091E601853069F40E9439198091E4014C
:1010B0008823B1F30E946419882391F30E94BC082D
:1010C000EFCF0E94C10DECCF292F332723303105FC
:1010D000C9F064F42130310581F02230310509F086
:1010E00043C08DE690E02CEB31E042C02132310567
:1010F000F1F02232310541F137C082E190E029E27E
:1011000032E036C099278130910541F08230910557
:1011100041F0892B49F5E8EBF1E005C0E0EAF1E0A8
:1011200002C0E8E8F1E0849190E09F0121C06430C2
:10113000D8F4E62FF0E0EE0FFF1FEE5DFE4F2081AA
:10114000318189E090E014C0643070F470E0FB01FC
:10115000EE0FFF1FE65EFE4F20813181FB01EA5E4C
:10116000FE4F808190E004C080E090E020E030E01D
:10117000FA0131832083089580E189BD82E189BD30
:1011800009B400FEFDCF8091D8008F7D8093D800F8
:101190008091E00082608093E0008091E00081FD1A
:1011A000FCCF0895CF92DF92EF92FF920F931F939F
:1011B000CF93DF93EC018B016A010E94350A811104
:1011C00033C0C114D10439F0F60180819181081B2C
:1011D000190BC80FD91FE12CF12C0115110519F1BC
:1011E0008091E80085FD16C08091E8008E7780939D
:1011F000E800C114D10449F0F60180819181E80E24
:10120000F91EF182E08285E00FC00E94350A882332
:1012100021F30AC089918093F10001501109FFEF79
:10122000EF1AFF0ADACF80E0DF91CF911F910F9183
:10123000FF90EF90DF90CF9008952091ED013091D5
:10124000EE012617370748F06115710539F4209132
:10125000E8002E772093E80001C0B90140E0611555
:101260007105A9F12091E601222309F443C025303C
:1012700009F442C02091E80023FD40C02091E8001D
:1012800022FD32C02091E80020FFE9CF4091F30019
:101290002091F20030E0342BFC01CF016115710583
:1012A00059F02830310540F481918093F10061506C
:1012B00071092F5F3F4FF1CF41E02830310509F030
:1012C00040E02091E8002E772093E800C8CF41113C
:1012D000C9CF0AC08091E601882361F0853061F0B2
:1012E0008091E80083FD0AC08091E80082FFF2CF80
:1012F00080E0089582E0089583E0089581E00895F4
:101300002091ED013091EE012617370748F0611565
:10131000710539F42091E8002E772093E80001C090
:10132000B901FC0120E06115710591F18091E601A0
:10133000882309F440C0853009F43FC08091E8005B
:1013400083FD3DC08091E80082FD2FC08091E800C0
:1013500080FFE9CF2091F3008091F20090E0922B82
:101360006115710559F08830910540F4249120935E
:10137000F1003196615071090196F2CF21E0089792
:1013800009F020E08091E8008E778093E800CBCFD1
:101390002111CCCF0AC08091E601882361F085300D
:1013A00061F08091E80083FD0AC08091E80082FF2F
:1013B000F2CF80E0089582E0089583E0089581E00F
:1013C0000895982F973058F59093E900981739F0C1
:1013D0007091EC002091ED005091F00003C0242F9B
:1013E000762F50E021FF19C03091EB003E7F309303
:1013F000EB003091ED003D7F3093ED003091EB003C
:1014000031603093EB007093EC002093ED0050932B
:10141000F0002091EE0027FF07C09F5FD3CF8F70B1
:101420008093E90081E0089580E008958091E701CC
:1014300087FF11C08091E80082FD05C08091E60120
:101440008111F8CF11C08091E8008B770BC080919B
:10145000E601882349F08091E80080FFF8CF809171
:10146000E8008E778093E80008952091E4003091A1
:10147000E50095E64091EC00842F817040FF22C08A
:101480008091E80080FD1CC08091E601882391F0E6
:10149000853091F08091EB0085FD10C04091E40013
:1014A0005091E5004217530729F39A01915011F723
:1014B00084E0089582E0089583E0089581E008952E
:1014C00080E008954091E80042FFDECF08950E9439
:1014D000D50A0E94DD0AE0EEF0E080818160808321
:1014E000E8EDF0E080818F77808319BCA7EDB0E054
:1014F0008C918E7F8C9380818F7E80831092E5010A
:1015000008950F931F93CF93DF930E94D50A0E94F3
:10151000DD0AC8EDD0E088818F7788838881806874
:10152000888388818F7D888319BC1092E601109290
:10153000E2011092E4011092E30100EE10E0F801E4
:1015400080818B7F808388818160888342E060E036
:1015500080E00E94E109E1EEF0E080818E7F8083EF
:10156000E2EEF0E08081816080838081886080830A
:10157000F80180818E7F8083888180618883DF91FC
:10158000CF911F910F910895E8EDF0E080818F7E5B
:101590008083E7EDF0E080818160808384E082BF1A
:1015A00081E08093E5010C94810AE8EDF0E0808110
:1015B0008E7F80831092E20008951092DA001092DC
:1015C000E10008951F920F920FB60F9211242F93EE
:1015D0003F934F935F936F937F938F939F93AF93BB
:1015E000BF93EF93FF938091E10082FF0BC0809146
:1015F000E20082FF07C08091E1008B7F8093E100D1
:101600000E94490D8091DA0080FF1FC08091D800B0
:1016100080FF1BC08091DA008E7F8093DA0080917A
:10162000D90080FF0DC080E189BD82E189BD09B488
:1016300000FEFDCF81E08093E6010E94440705C0D3
:1016400019BC1092E6010E9452078091E10080FFD0
:1016500019C08091E20080FF15C08091E2008E7F6A
:101660008093E2008091E20080618093E2008091AB
:10167000D80080628093D80019BC85E08093E60191
:101680000E9456078091E10084FF30C08091E20003
:1016900084FF2CC080E189BD82E189BD09B400FED0
:1016A000FDCF8091D8008F7D8093D8008091E1009C
:1016B0008F7E8093E1008091E2008F7E8093E20034
:1016C0008091E20081608093E2008091E2018823B2
:1016D00011F084E007C08091E30087FD02C081E043
:1016E00001C083E08093E6010E9458078091E100E9
:1016F00083FF29C08091E20083FF25C08091E10033
:10170000877F8093E10082E08093E6011092E201FE
:101710008091E1008E7F8093E1008091E2008E7FD6
:101720008093E2008091E20080618093E20042E0D9
:1017300060E080E00E94E1098091F0008860809381
:10174000F0000E945507FF91EF91BF91AF919F91DB
:101750008F917F916F915F914F913F912F910F905A
:101760000FBE0F901F9018951F920F920FB60F92F9
:1017700011242F933F934F935F936F937F938F9396
:101780009F93AF93BF93CF93DF93EF93FF93C0915A
:10179000E900CF708091EC00D82FD17080FDD0E8A7
:1017A0001092E9008091F000877F8093F000789498
:1017B0000E94F80B1092E9008091F00088608093FD
:1017C000F000CD2BCF70C093E900FF91EF91DF9136
:1017D000CF91BF91AF919F918F917F916F915F91C9
:1017E0004F913F912F910F900FBE0F901F90189522
:1017F0001F93CF93DF93CDB7DEB7AA970FB6F894B8
:10180000DEBF0FBECDBFE7EEF1E088E08E0F909116
:10181000F10091938E13FBCF0E9474078091E80032
:1018200083FF1FC18091E7019091E801492F50E0AB
:101830004A30510508F015C1FA01EA5AFF4F0C94DD
:10184000A721803881F0823809F00BC18091EB012B
:101850008F708093E9008091EB0085FB882780F9E9
:101860001092E90006C08091E3019091E40191118A
:1018700082609091E800977F9093E8008093F10058
:101880001092F100C8C0282F2D7F09F0EAC08823EC
:1018900019F0823061F0E5C08091E901813009F0F2
:1018A000E0C0933009F080E08093E4012BC0809188
:1018B000E901811127C08091EB018F7009F4D1C03B
:1018C0008093E9002091EB0020FF1CC0933021F4AD
:1018D0008091EB00806214C09091EB009061909336
:1018E000EB0021E030E0A90102C0440F551F8A95AA
:1018F000E2F74093EA001092EA008091EB008860E2
:101900008093EB001092E9008091E800877F86C009
:101910008111A7C01091E9011F778091E3008078C1
:10192000812B8093E3008091E800877F8093E8001B
:101930000E94160A8091E80080FFFCCF8091E300AE
:1019400080688093E300111102C082E001C083E04F
:101950008093E60186C08058823008F082C0809172
:10196000E9019091EA018C3D53E0950779F583E018
:101970008A838AE289834FB7F894DE01139620E0C8
:101980003EE051E2E32FF0E050935700E49120FF56
:1019900003C0E295EF703F5FEF708E2F90E0EA306A
:1019A00010F0C79601C0C0968D939D932F5F243190
:1019B00049F74FBF8091E800877F8093E8006AE293
:1019C00070E0CE0101960E941D0914C0AE014F5F68
:1019D0005F4F6091EB010E946408BC01892B09F400
:1019E00040C09091E800977F9093E80089819A81A8
:1019F0000E9480098091E8008B778093E80031C0D5
:101A0000803879F58091E800877F8093E8008091A5
:101A1000E2018093F1008091E8008E778093E800E6
:101A20000E94160A1EC081111CC09091E9019230DB
:101A3000C0F48091E800877F8093E8009093E201F2
:101A40000E94160A8091E201811106C08091E30094
:101A500087FD02C081E001C084E08093E6010E941E
:101A600060078091E80083FF0AC08091E800877FCB
:101A70008093E8008091EB0080628093EB00AA964F
:101A80000FB6F894DEBF0FBECDBFDF91CF911F918F
:101A900008950895CF938091E6018823A1F0C09125
:101AA000E900CF709091EC00892F817090FD80E863
:101AB000C82B1092E9008091E80083FD0E94F80B8A
:101AC000CF70C093E900CF910895909369018093FE
:101AD00068010895E0916801F0916901309721F063
:101AE0000190F081E02D099480E00895E091680173
:101AF000F0916901309721F00280F381E02D099483
:101B00000895E0916801F0916901309721F0048017
:101B1000F581E02D099408952091660130916701C7
:101B20008217930771F09093670180936601E091AB
:101B30006801F0916901309721F00680F781E02D6E
:101B400009940895209164013091650182179307EB
:101B500071F09093650180936401E0916801F091C8
:101B60006901309721F00084F185E02D09940895F2
:101B700008950C94B80D0E947E190E943E030C94A7
:101B8000441ACF92DF92EF92FF920F931F93CF935D
:101B9000DF93CDB7DEB72B970FB6F894DEBF0FBE3D
:101BA000CDBF0E9456038BE6C82E81E0D82E00E000
:101BB00010E0E02E802F0E944404F60141916F0155
:101BC000F42EF826B1F40F5F1F4F0E30110589F780
:101BD0008FEF89838A831B820E9487198160782F07
:101BE0009D838C8349815A816B818D810E94640E13
:101BF00040C09091CD0191FF04C08B870E944A04A0
:101C00008B8520E030E04F2D50E0922FBA01022E5C
:101C100002C0759567950A94E2F760FF24C02E8391
:101C2000EF8221E030E0690102C0CC0CDD1C9A9506
:101C3000E2F790E08C219D21892B09F420E0288790
:101C40000E9487198160782F9A8789874E815F81EA
:101C500068858A850E94640EF801E559FE4F8081EF
:101C6000C826C08206C02F5F3F4F2630310569F677
:101C7000AACF0E942B1D10916A010E946A0D1817AD
:101C8000A1F00E946A0D80936A012B960FB6F8941A
:101C9000DEBF0FBECDBFDF91CF911F910F91FF909F
:101CA000EF90DF90CF900C9463062B960FB6F894CC
:101CB000DEBF0FBECDBFDF91CF911F910F91FF907F
:101CC000EF90DF90CF900895CF93DF93CDB7DEB73D
:101CD0002B970FB6F894DEBF0FBECDBF4F8358874A
:101CE00069877A878B87DE01119686E0FD01119264
:101CF0008A95E9F785E0FE01379601900D928A9565
:101D0000E1F749815A816B817C818D819E810E949E
:101D100094152B960FB6F894DEBF0FBECDBFDF91A2
:101D2000CF9108950895CF93882309F4C2C0C82F96
:101D3000823859F40E946A0D81FDBBC089E30E947C
:101D40003D180E940A1989E30CC0833879F40E9477
:101D50006A0D80FDAEC083E50E943D180E940A19FD
:101D600083E50E947F18CF910C940A19843859F4A6
:101D70000E946A0D82FD9DC087E40E943D180E946A
:101D80000A1987E4EECF8CEF8C0F813A48F48C2F40
:101D90000E94721F81118DC08C2F0E943D18E3CFCD
:101DA00080E28C0F883048F4C77081E001C0880F52
:101DB000CA95EAF70E94C318D6CF8BE58C0F833003
:101DC00078F4C53A29F0C63A31F083E890E005C0CE
:101DD00081E890E002C082E890E0CF910C948C0DF5
:101DE00088E58C0F833108F064C0C83A39F1C93AEC
:101DF00041F1CA3A49F1CB3A51F1CC3A59F1CD3AD5
:101E000061F1C03B69F1CE3A71F1CF3A79F1C13B52
:101E100081F1C23B89F1C33B91F1C43B99F1C53BD0
:101E2000A1F1C63BA9F1C73BB1F1C83BB9F1C93B30
:101E3000C1F1CA3BC9F180E090E038C082EE90E089
:101E400035C089EE90E032C08AEE90E02FC085EB7D
:101E500090E02CC086EB90E029C087EB90E026C094
:101E60008CEC90E023C08DEC90E020C083E891E002
:101E70001DC08AE891E01AC082E991E017C084E9A8
:101E800091E014C081E292E011C083E292E00EC0C2
:101E900084E292E00BC085E292E008C086E292E024
:101EA00005C087E292E002C08AE292E0CF910C94F2
:101EB000A20DCF910895882309F44BC0823859F4BC
:101EC0000E946A0D81FF45C089E30E943D180E946F
:101ED0000A1989E30CC0833871F40E946A0D80FFEF
:101EE00038C083E50E943D180E940A1983E50E94CC
:101EF0007F180C940A19843859F40E946A0D82FFE5
:101F000028C087E40E943D180E940A1987E4EFCF99
:101F10009CEF980F913A58F390E2980F983050F454
:101F2000877091E001C0990F8A95EAF7892F0E9486
:101F3000C918DFCF9BE5980F933020F480E090E044
:101F40000C948C0D885A833120F480E090E00C943E
:101F5000A20D0895882321F00E94C3180C940A1939
:101F60000895882321F00E94C9180C940A19089535
:101F7000BF92CF92DF92EF92FF920F931F93CF9376
:101F8000DF9300D000D000D0CDB7DEB725E0FC0154
:101F9000DE01119601900D922A95E1F7FC01D080A7
:101FA00011810281258122952F7043815481452B17
:101FB00009F4FCC21F3F21F4FFEFDF1609F4F6C25B
:101FC0007C012E830E94920ED9821A8369817A81C4
:101FD000802F0E943918182FB92E0E94EE170E94E8
:101FE000B5162E81002319F00E94E0182E81EB2DEA
:101FF000E295EF70F0E0E05AFF4F0C94A7218B2D93
:10200000807F9B2D9F70F92E882319F0F29480EF2A
:10201000F822002389F0FF2009F475C280E2810FC5
:10202000883020F48F2D0E94C31803C08F2D0E948A
:10203000D3180E940A1967C2812F0E945B0FFF20EC
:1020400009F4B4C2105E8F2D183018F40E94C9181C
:1020500002C00E94D91826960FB6F894DEBF0FBEB4
:10206000CDBFDF91CF911F910F91FF90EF90DF9047
:10207000CF90BF900C940A193B2D307F8B2D8F7021
:10208000303211F08295807F112319F0113021F147
:102090002CC00023B9F0222309F4A0C1213009F09B
:1020A0009DC126960FB6F894DEBF0FBECDBFDF915F
:1020B000CF911F910F91FF90EF90DF90CF90BF9045
:1020C0000C94F318222319F0213009F46FC28E8387
:1020D0000E94F6188E8196C1002321F0223008F06C
:1020E00065C27CC1211162C28DC1002321F022236F
:1020F00009F474C108C2222309F484C119C22B2D2A
:1021000026952695237030E02115310521F02130E8
:102110003105D1F04BC2002321F0812F9B2D93700C
:1021200002C080E090E026960FB6F894DEBF0FBEA6
:10213000CDBFDF91CF911F910F91FF90EF90DF9076
:10214000CF90BF900C948C0D002321F0812F9B2DFC
:10215000937002C080E090E026960FB6F894DEBF40
:102160000FBECDBFDF91CF911F910F91FF90EF90E8
:10217000DF90CF90BF900C94A20D812F002319F017
:102180000E94331C02C00E949B1C26960FB6F89436
:10219000DEBF0FBECDBFDF91CF911F910F91FF909A
:1021A000EF90DF90CF90BF900C94201D8B2D83700B
:1021B00009F07BC00111FAC1812F82958695877045
:1021C000880F880F912F9F70C92ED12CE12CF12CF4
:1021D000082E04C0CC0CDD1CEE1CFF1C0A94D2F7A8
:1021E00014FF12C04FE050E060E070E004C0440F04
:1021F000551F661F771F8A95D2F7CB01BA016095EC
:1022000070958095909503C060E070E0CB012B2D18
:10221000269526952370422F50E042305105D9F083
:102220004330510569F16C297D298E299F29413060
:10223000510551F126960FB6F894DEBF0FBECDBF03
:10224000DF91CF911F910F91FF90EF90DF90CF9092
:10225000BF900C94DC166C297D298E299F29269627
:102260000FB6F894DEBF0FBECDBFDF91CF911F91A7
:102270000F91FF90EF90DF90CF90BF900C94F816E5
:102280000E94DC16C701B60126960FB6F894DEBF91
:102290000FBECDBFDF91CF911F910F91FF90EF90B7
:1022A000DF90CF90BF900C94C016002319F08B2DB7
:1022B000817001C08695882309F478C1812F8295A9
:1022C00086958770880F880F912F9F70C92ED12C0B
:1022D000E12CF12C082E04C0CC0CDD1CEE1CFF1CE4
:1022E0000A94D2F714FF12C04FE050E060E070E0B3
:1022F00004C0440F551F661F771F8A95D2F7CB0184
:10230000BA01609570958095909503C060E070E08B
:10231000CB012B2D269526952370422F50E042307D
:102320005105D9F04330510569F16C297D298E2979
:102330009F294130510551F126960FB6F894DEBF22
:102340000FBECDBFDF91CF911F910F91FF90EF9006
:10235000DF90CF90BF900C94B6176C297D298E2901
:102360009F2926960FB6F894DEBF0FBECDBFDF9132
:10237000CF911F910F91FF90EF90DF90CF90BF9082
:102380000C94D2170E94B617C701B60126960FB655
:10239000F894DEBF0FBECDBFDF91CF911F910F919B
:1023A000FF90EF90DF90CF90BF900C949A17103F62
:1023B000D1F118F4103E50F4A1C0123F09F463C0EB
:1023C00008F44CC0133F09F473C098C01F708B2DE4
:1023D0008F710023A1F00E943317812F26960FB62C
:1023E000F894DEBF0FBECDBFDF91CF911F910F914B
:1023F000FF90EF90DF90CF90BF900C94AA0F0E94B7
:102400005417812F26960FB6F894DEBF0FBECDBFAE
:10241000DF91CF911F910F91FF90EF90DF90CF90C0
:10242000BF900C94B10F0023A9F02111BFC08B2DD8
:102430008F7126960FB6F894DEBF0FBECDBFDF9129
:10244000CF911F910F91FF90EF90DF90CF90BF90B1
:102450000C947917223008F0A9C0E9CF0023A9F025
:102460008B2D8F7126960FB6F894DEBF0FBECDBFB1
:10247000DF91CF911F910F91FF90EF90DF90CF9060
:10248000BF900C943317002359F38B2D8F71269630
:102490000FB6F894DEBF0FBECDBFDF91CF911F9175
:1024A0000F91FF90EF90DF90CF90BF900C94541756
:1024B000002399F08B2D8F7126960FB6F894DEBF0E
:1024C0000FBECDBFDF91CF911F910F91FF90EF9085
:1024D000DF90CF90BF900C941E1726960FB6F894FD
:1024E000DEBF0FBECDBFDF91CF911F910F91FF9047
:1024F000EF90DF90CF90BF900C9414170023A9F0B9
:10250000222309F4ADCF812F26960FB6F894DEBFB3
:102510000FBECDBFDF91CF911F910F91FF90EF9034
:10252000DF90CF90BF900C94930E222309F4ADCF8F
:10253000812F26960FB6F894DEBF0FBECDBFDF9178
:10254000CF911F910F91FF90EF90DF90CF90BF90B0
:102550000C945B0F4B2D4F70612FC7010E9401023D
:1025600026960FB6F894DEBF0FBECDBFDF91CF9198
:102570001F910F91FF90EF90DF90CF90BF900C9440
:1025800038164B2D4F70612FC70126960FB6F89461
:10259000DEBF0FBECDBFDF91CF911F910F91FF9096
:1025A000EF90DF90CF90BF900C940A0526960FB65F
:1025B000F894DEBF0FBECDBFDF91CF911F910F9179
:1025C000FF90EF90DF90CF90BF9008950E94E018A9
:1025D0000E94F0180E94B5180E940A190E94D11D8D
:1025E0000E94201D80E090E00E948C0D80E090E031
:1025F0000C94A20D0E94D0180C94E6120E942E1882
:10260000292F22952F7030E02C3031054CF42A30E0
:1026100031056CF4225031092230310588F407C0AD
:102620002C30310549F02F30310531F009C0803EA2
:1026300048F0803F29F406C093FB882780F908956D
:1026400080E0089581E00895CF93DF9300D000D01B
:102650001F92CDB7DEB70F900F900F900F900F9095
:10266000DF91CF910895CF93DF9300D000D000D0B9
:10267000CDB7DEB726960FB6F894DEBF0FBECDBF3E
:10268000DF91CF9108951F93CF93DF93C09179018C
:1026900016E080917A01C81799F0D0E01C9FF001F4
:1026A0001D9FF00D1124E558FE4F4081518162813C
:1026B0007381848195810E9433132196C770E9CF7D
:1026C000DF91CF911F9108954091AB015091AC01E2
:1026D0006091AD017091AE018091AF019091B00118
:1026E0000C9433138091B00182958F7009F054C01F
:1026F0008091AD01882309F44FC080917901A091A8
:102700007A016091AB017091AC014091AE015091A2
:10271000AF01B6E08A1709F43FC090E041155105BA
:10272000C1F17F3F11F46F3FA1F1B89FF001B99F54
:10273000F00D1124E558FE4F218172132AC020812B
:10274000621327C02281211124C0238134812417E0
:10275000350710F421503109241B350B283C310575
:10276000C0F42091B0012F7020612093B00126E0C9
:10277000289FF001299FF00D1124E058FE4F808121
:102780008F70806180838BEA91E00E94B80F0C9477
:10279000431301968770BECF0895CF92DF92EF92D8
:1027A000FF920F931F93CF93DF93CDB7DEB762975E
:1027B0000FB6F894DEBF0FBECDBF8C0185E0F801E7
:1027C000DE011D9601900D928A95E1F7D8014C919A
:1027D00011965C91119712966C9112971396CD9069
:1027E000DC9014973091AB017091AC018091AE01F7
:1027F0009091AF01009709F46BC17F3F19F43F3FFF
:1028000009F466C1E090AD01EE2009F4C0C020914A
:10281000B001C816D90628F0F601E81BF90BCF0164
:1028200004C0809590958C0D9D1DFF24F394883CE9
:10283000910578F0F12C207F09F0C6C07C2DD98A53
:10284000C88A89890E9424138BEA91E00E94B80FFC
:10285000B1C0822F807F09F046C0751314C03413B5
:1028600012C0611110C02F7020612093B0010E942E
:1028700064138BEA91E00E94B80F8091B001D801F7
:1028800015968C932EC0CD2819F15F3F11F44F3F60
:10289000F9F0F62E61111CC08091790120917A0126
:1028A00036E0821709F45AC090E0389FF001399F52
:1028B000F00D1124E558FE4F7181571306C0708149
:1028C000471303C07281711103C001968770E9CF6D
:1028D000F62E662309F418C18091B00181608093BF
:1028E000B001F12C11C1751308C0341306C0611179
:1028F00004C08091B001D801C3C04D875E878D852B
:102900009E856A8B0E94FE126A898823E1F1662304
:10291000D1F12091B001822F82958F7090E00297C3
:1029200074F08091AB019091AC0198878F831986E8
:10293000DB86CA862C87CE0107960E94B80F86E0F8
:10294000F801ABEAB1E001900D928A95E1F70E949F
:1029500072130E946413FF24F394D6C04D875E87E0
:102960008D859E850E942E18292F22952F7030E08C
:10297000223031050CF0BCC09F7009F0B6C0805EFB
:10298000883008F4C1C0C8010E94B80FE4CFC8164F
:10299000D90608F453C0F601E81BF90BCF01883CB7
:1029A000910508F450C0F12C7C2DD98AC88A8989F8
:1029B0000E942413EBEAF1E086E0DF011D928A9584
:1029C000E9F70E946413A0C0751314C0341312C039
:1029D000611110C08091B001F8018583C8010E9487
:1029E000B80F86E0EBEAF1E0DF011D928A95E9F786
:1029F000FE2C8AC04D875E878D859E856A8B0E94DE
:102A0000FE126A89882309F4BECF662309F4BBCF7E
:102A10002091B001822F82958F7090E002970CF484
:102A20008ECF8091AB019091AC019A8389831B82F8
:102A3000DD82CC822E83CE0101967FCF809590954A
:102A40008C0D9D1DACCFF62E662309F49CCF75131B
:102A50002EC034132CC02091B00120FD1FC0822F46
:102A600082958F70D9F0D80115962C9315978F30D9
:102A700049F08F5F982F9295907F822F8F70892BCE
:102A800015968C93C8010E94B80F86E0F801ABEA56
:102A9000B1E001900D928A95E1F793CF86E0F801BD
:102AA000ABEAB1E001900D928A95E1F72DC04D8718
:102AB0005E878D859E850E94FE12811140CF809198
:102AC000B00181608093B001C8010E94B80F1CC0A2
:102AD000662309F458CF4D875E878D859E850E94B9
:102AE000FE12882309F44FCF2ACF811148CF0CC0A2
:102AF000243031050CF047CF9F7009F440CFF80126
:102B00009581907F09F03BCF8F2D62960FB6F89498
:102B1000DEBF0FBECDBFDF91CF911F910F91FF9010
:102B2000EF90DF90CF9008951F93CF93DF93CDB7B1
:102B3000DEB72C970FB6F894DEBF0FBECDBF4F8324
:102B4000588769877A878B879C87CE0107960E9472
:102B5000CD13882369F08F8198852A853B85232BA7
:102B6000F1F19F3F09F063C08F3F09F060C037C0AB
:102B700086E0FE013796DE01119601900D928A954E
:102B8000E1F76F817885EA85FB85309741F17F3FDA
:102B900011F46F3F21F120917A0130E0C9010196D3
:102BA000877099274091790150E08417950709F4BF
:102BB00047C069837A83FD83EC8396E0929FD001BE
:102BC000939FB00D1124A558BE4FFE013196019080
:102BD0000D929A95E1F780937A010E94431316E0D3
:102BE0008091790190917A018917C1F1189FC001F4
:102BF000112485589E4F0E94CD13882379F1E091CE
:102C000079011E9FF0011124E558FE4F408151814A
:102C100062817381848195810E943313809179014F
:102C200090E001968770992780937901D9CF4F81E1
:102C3000588569857A858B859C850E943313CFCF13
:102C40000E94FA1210927A0110927901EBEAF1E0F7
:102C500086E0DF011D928A95E9F7C1CF2C960FB669
:102C6000F894DEBF0FBECDBFDF91CF911F910895C5
:102C7000EF92FF920F931F93CF93DF938C01892BD9
:102C800009F46CC0F12CEE24E394E8012196F801DC
:102C90008491843740F4843008F051C0813081F051
:102CA000823019F15BC0853709F444C0A8F19CE774
:102CB000980F903708F052C08F770E945B0F41C089
:102CC0000E5F1F4FFE01C49180E28C0F883048F4E4
:102CD000C7708E2D01C0880FCA95EAF70E94E318CD
:102CE00014C08C2F0E94930E2DC00E5F1F4FFE014B
:102CF000C49180E28C0F883058F4C7708E2D01C0CB
:102D0000880FCA95EAF70E94E9180E940A191AC0AA
:102D10008C2F0E945B0F16C00E5F1F4FFE01C491E7
:102D2000CC2381F08FE99FE00197F1F700C000000C
:102D3000C150F6CF0E5F1F4FFE01F49003C00E94FA
:102D4000930E8E018F2D882309F49FCFEFE9FFE0CA
:102D50003197F1F700C000008150F5CFDF91CF919E
:102D60001F910F91FF90EF90089508956093B50122
:102D70007093B6018093B7019093B8010C94E6125A
:102D80000F931F930091B5011091B6012091B701E7
:102D90003091B801DC01CB01802B912BA22BB32BFE
:102DA0008093B5019093B601A093B701B093B80199
:102DB0001F910F910C94E6120F931F930091B50190
:102DC0001091B6012091B7013091B801DC01CB011F
:102DD00080239123A223B3238093B5019093B6015E
:102DE000A093B701B093B8011F910F910C94E61214
:102DF0000F931F930091B5011091B6012091B70177
:102E00003091B801DC01CB0180279127A227B3279D
:102E10008093B5019093B601A093B701B093B80128
:102E20001F910F910C94E6121092B1011092B20111
:102E30001092B3011092B4010C94E61241E050E0FC
:102E400060E070E004C0440F551F661F771F8A952D
:102E5000D2F74093B1015093B2016093B3017093E4
:102E6000B4010C94E61241E050E060E070E004C070
:102E7000440F551F661F771F8A95D2F78091B101C5
:102E80009091B201A091B301B091B401482B592B9C
:102E90006A2B7B2B4093B1015093B2016093B30135
:102EA0007093B4010C94E61241E050E060E070E0F1
:102EB00004C0440F551F661F771F8A95D2F74095AF
:102EC0005095609570958091B1019091B201A0915B
:102ED000B301B091B401482359236A237B23409363
:102EE000B1015093B2016093B3017093B4010C949B
:102EF000E61241E050E060E070E004C0440F551F6E
:102F0000661F771F8A95D2F78091B1019091B20127
:102F1000A091B301B091B401482759276A277B27B4
:102F20004093B1015093B2016093B3017093B40127
:102F30000C94E6120F931F930091B1011091B2010E
:102F40002091B3013091B401DC01CB01802B912B96
:102F5000A22BB32B8093B1019093B201A093B30144
:102F6000B093B4011F910F910C94E6120F931F932D
:102F70000091B1011091B2012091B3013091B401DF
:102F8000DC01CB0180239123A223B3238093B101E1
:102F90009093B201A093B301B093B4011F910F912C
:102FA0000C94E6120F931F930091B1011091B2019E
:102FB0002091B3013091B401DC01CB01802791272E
:102FC000A227B3278093B1019093B201A093B301DC
:102FD000B093B4011F910F910C94E6120895CF9213
:102FE000DF92EF92FF920F931F93CF93DF938C01A9
:102FF000C090B501D090B601E090B701F090B80153
:103000008091B1019091B201A091B301B091B4014E
:10301000C82AD92AEA2AFB2ACFE1D0E0D701C60183
:103020000C2E04C0B695A795979587950A94D2F76C
:1030300080FF06C0B8018C2F0E942D05019721F456
:10304000219760F780E001C08C2FDF91CF911F9115
:103050000F91FF90EF90DF90CF900895CF93DF9383
:10306000EC010E94EF17BE010E942D05DF91CF9168
:103070000895CB010E942E18089590910C01992378
:1030800021F090910D01911109C020910E01309114
:103090000F01F90132969FEF40E01FC0982F9695DF
:1030A000969596959F3050F5E0910E01F0910F01A5
:1030B000E90FF11D877021E030E0A90102C0440F43
:1030C000551F8A95E2F7CA019181892B8183089562
:1030D0009F3F39F04F5F4E3041F051915813F8CF78
:1030E0000DC05111F7CF942FF5CF9F3F39F0F90163
:1030F000E90FF11D97FDFA95828308950895909147
:103100000C01992321F090910D01911109C020919A
:103110000E0130910F01F9013296205F3F4F1FC021
:10312000982F9695969596959F30F0F4E0910E0124
:10313000F0910F01E90FF11D877021E030E0A90146
:1031400002C0440F551F8A95E2F7CA01809591810C
:103150008923818308953196E217F30729F090813E
:103160009813F9CF1082F7CF089581E090E0E091B5
:103170000E01F0910F01E80FF91F108201968031C6
:103180009105A9F708959091CC01892B8093CC01EA
:10319000089580959091CC0189238093CC01089566
:1031A0001092CC0108959091CB01892B8093CB0193
:1031B000089580959091CB0189238093CB01089548
:1031C0001092CB0108959091CA01892B8093CA0176
:1031D000089580959091CA0189238093CA0108952A
:1031E0001092CA0108958093B90108951092B9010F
:1031F000089580910E0190910F01FC0131969C0180
:10320000205F3F4F80E0919191118F5FE217F307AC
:10321000D1F70895E0910E01F0910F018091CC015A
:103220008083E0910E01F0910F0190818091CB019C
:10323000892B8083E0910E01F0910F0190818091A4
:10324000CA01892B80838091B901882361F0E091C4
:103250000E01F0910F019081892B80830E94F91853
:1032600081111092B90180910E0190910F010C947F
:10327000760D8091E601843021F11092CE0120E498
:1032800088E190E00FB6F894A895809360000FBE97
:103290002093600080E00E94630683B7817F846092
:1032A00083BF83B7816083BF7894889583B78E7F0F
:1032B00083BF88E10FB6F89480936000109260009D
:1032C0000FBE089508950895CF930E9462190E9439
:1032D00056030E946319C0E08C2F0E9444048111A0
:1032E00004C0CF5FCE30C1F701C081E0CF91089517
:1032F0000E94FA120E946A0D0C94630682E084BD5B
:1033000093E095BD9AEF97BD80936E0008952FB717
:10331000F8948091CF019091D001A091D101B0910A
:10332000D2012FBF0895CF92DF92EF92FF920F93B9
:103330001F932FB7F8944091CF015091D001609125
:10334000D1017091D2012FBF6A017B01EE24FF24CD
:103350008C0120E030E0C016D106E206F30610F43E
:10336000415051099A01281B390BC9011F910F9136
:10337000FF90EF90DF90CF9008951F920F920FB6BD
:103380000F9211248F939F93AF93BF938091CF019E
:103390009091D001A091D101B091D2010196A11DCF
:1033A000B11D8093CF019093D001A093D101B09330
:1033B000D201BF91AF919F918F910F900FBE0F904F
:1033C0001F9018950E94670AF8942FEF87EA91E6FC
:1033D000215080409040E1F700C0000087E090EB72
:1033E000DC018093EF019093F001A093F101B09381
:1033F000F2019CE088E10FB6F894A89580936000F4
:103400000FBE90936000FFCFEF92FF920F931F9338
:10341000CF93DF93D82FC0E08C2F0E94440400E0AC
:1034200010E0E82EF12CC701002E02C0959587957B
:103430000A94E2F780FD06C00F5F1F4F06301105AA
:1034400091F709C0602F7C2F80E00E940B05D813F4
:10345000F3CF81E004C0CF5FCE30F1F680E0DF91A2
:10346000CF911F910F91FF90EF900895CF93C82FA8
:103470008CE20E94041A882321F08C2FCF910C94A7
:10348000041A80E0CF910895CF930E948B1B811185
:1034900002C00E94711BC5E6C15049F00E9456034C
:1034A0008FE39CE90197F1F700C00000F5CF89E2B6
:1034B0000E94361A811113C18AE20E94361A8111C4
:1034C0000E94711B85E00E94361A81110E94E21948
:1034D0000E94961B8093CD0187E00E94361A8823B4
:1034E000A9F18BE10E94361A882351F08091CD0119
:1034F00081FB222720F991E0922790FB81F90EC0F1
:103500008EE00E94361A882361F08091CD0182FB03
:10351000222720F991E0922790FB82F98093CD0138
:1035200015C080E10E94361A9091CD01882341F0A8
:1035300093FB222720F981E0822780FB93F904C0C6
:10354000892F809580FB90F99093CD018091CD01DA
:103550000E949A1B0E94A81B8093E00180EE0E94AB
:10356000361A882341F08091E001982F909590FBC6
:1035700080F98093E00189E30E94361A882359F08C
:103580008091E00181FB222720F991E0922790FBB6
:1035900081F98093E00182EE0E94361A882359F067
:1035A0008091E00182FB222720F991E0922790FB95
:1035B00082F98093E00186EE0E94361A882359F042
:1035C0008091E00183FB222720F991E0922790FB74
:1035D00083F98093E00183EE0E94361A882359F024
:1035E0008091E00184FB222720F991E0922790FB53
:1035F00084F98093E00185E30E94361A882359F00C
:103600008091E00185FB222720F991E0922790FB31
:1036100085F98093E00181E30E94361A882359F0EE
:103620008091E00186FB222720F991E0922790FB10
:1036300086F98093E00181E10E94361A882359F0CF
:103640008091E00187FB222720F991E0922790FBEF
:1036500087F98093E0018091E0010E94AC1B80918A
:10366000E00187FB882780F980930D0187E20E94A3
:10367000361AC82F8EE10E94361A8111C2608FE17E
:103680000E94361A8111C46080E20E94361A8111AC
:10369000C86081E20E94361A8111C06182E20E94F4
:1036A000361A8111C06283E20E94361A8111C06409
:1036B00084E20E94361A882311F0C06802C0CC232D
:1036C00029F08C2F0E94A31B6C2F03C00E949F1B0C
:1036D000682F70E080E090E0CF910C94B616CF9107
:1036E00008956DEE7EEF80E090E00E94DD2160E0C5
:1036F00082E090E00E94CF2160E083E090E00E94B1
:10370000CF2160E084E090E00E94CF2160E085E07E
:1037100090E00C94CF2180E090E00E94C92121E04C
:103720008D3E9E4F09F020E0822F089582E090E0C8
:103730000C94C121682F82E090E00C94CF2183E0AB
:1037400090E00C94C121682F83E090E00C94CF218D
:1037500084E090E00C94C121682F84E090E00C9408
:10376000CF218091D50180FF0BC06091130185E0CE
:10377000689FB001112475956795759567952BC065
:1037800081FF09C06091130185E0689FB001112499
:103790007595679520C082FF07C06091130185E091
:1037A000689FB001112417C09091D6019923D1F0E0
:1037B00060911201961788F72091130185E0289FE8
:1037C00090011124929FA001939F500D112470E04D
:1037D000CA010E9493216038710540F4611571059A
:1037E00039F002C065E070E0862F08958FE70895F4
:1037F00081E008958091D50180FF08C0609111019A
:1038000070E0759567957595679521C081FF06C035
:103810006091110170E07595679519C082FF04C031
:103820006091110170E010C09091D6019923C1F010
:10383000609110019617A0F780911101899FC00136
:10384000112470E00E9493216038710528F46115FD
:10385000710521F0862F08958FE7089581E008957E
:1038600061E070E0F4CF803F21F40E94B11B8195AC
:1038700004C0813F29F40E94B11B8093D9010895AF
:10388000823F21F40E94B11B819504C0833F29F43B
:103890000E94B11B8093D8010895893F19F40E94BA
:1038A000FA1B05C08A3F31F40E94FA1B8195809370
:1038B000DA0108958B3F21F40E94FA1B819504C020
:1038C0008C3F29F40E94FA1B8093DB010895843F0A
:1038D00021F48091D701816017C0853F21F4809148
:1038E000D701826011C0863F21F48091D7018460A6
:1038F0000BC0873F21F48091D701886005C0883FC5
:1039000031F48091D70180618093D70108958D3F74
:1039100021F48091D50181600BC08E3F21F480910C
:10392000D501826005C08F3F29F48091D501846064
:103930008093D5010895803F39F48091D90187FFA4
:103940006CC01092D90169C0813F29F48091D901DE
:103950001816BCF362C09091D801823F29F497FFFA
:103960005CC01092D80159C0833F19F41916CCF3EA
:1039700054C0893F41F48091DA0118160CF04DC013
:103980001092DA014AC08A3F29F48091DA0187FF58
:1039900044C0F6CF8B3F39F48091DB0187FF3DC0F7
:1039A0001092DB013AC08C3F29F48091DB0118169C
:1039B000BCF333C0843F21F48091D7018E7F17C0C0
:1039C000853F21F48091D7018D7F11C0863F21F47E
:1039D0008091D7018B7F0BC0873F21F48091D70165
:1039E000877F05C0883F31F48091D7018F7E809317
:1039F000D70113C08D3F21F48091D5018E7F0BC07C
:103A00008E3F21F48091D5018D7F05C08F3F29F431
:103A10008091D5018B7F8093D5018091D801811150
:103A20000EC08091D90181110AC08091DA01811103
:103A300006C08091DB01811102C01092D601089569
:103A400087ED91E00E94810D0E9487199093D40127
:103A50008093D30108951F93CF93DF938091D30177
:103A60009091D4010E949319AC019091D6019923B1
:103A700021F02091140130E006C0209115018AE068
:103A8000289F900111244217530708F486C08091A3
:103A9000D801C091D901D091DA011091DB018111D7
:103AA00007C0C11176C0D11174C0111172C075C0A8
:103AB0009F3F19F09F5F9093D601181624F40E943F
:103AC000B11B8093D8018091D80187FF05C00E9467
:103AD000B11B81958093D8011C1624F40E94B11B60
:103AE0008093D9018091D90187FF05C00E94B11B45
:103AF00081958093D9016091D801662339F1C091F5
:103B0000D901CC2319F1772767FD7095872F972F5F
:103B10000E94A42023E333E343E35FE30E940821F0
:103B20000E9471206093D8016C2F772767FD7095F4
:103B3000872F972F0E94A42023E333E343E35FE31F
:103B40000E9408210E9471206093D9011D1624F45F
:103B50000E94FA1B8093DA018091DA0187FF05C089
:103B60000E94FA1B81958093DA01111624F40E94B9
:103B7000FA1B8093DB018091DB0187FF05C00E9467
:103B8000FA1B81958093DB01DF91CF911F910C94FB
:103B9000201D9F3F09F08ECF96CFDF91CF911F91CF
:103BA0000895E7EDF1E085E0DF011D928A95E9F7E0
:103BB0001092D6011092D5010895833081F128F436
:103BC000813059F08230D1F00895853009F449C030
:103BD000B8F1863009F456C0089580911501262F5A
:103BE00030E0280F311D2F3F310524F4680F60931A
:103BF000150108958FEF80931501089580911401A8
:103C0000262F30E0280F311D2F3F310524F4680F97
:103C10006093140108958FEF8093140108958091AB
:103C20001301262F30E0280F311D2F3F310524F4DA
:103C3000680F6093130108958FEF80931301089527
:103C400080911201262F30E0280F311D2F3F3105C2
:103C500024F4680F6093120108958FEF809312018E
:103C6000089580911101262F30E0280F311D2F3F3C
:103C7000310524F4680F6093110108958FEF80934C
:103C80001101089580911001262F30E0280F311D79
:103C90002F3F310524F4680F6093100108958FEFD2
:103CA000809310010895833011F128F4813049F098
:103CB000823091F00895853081F120F18630C1F194
:103CC000089580911501681720F4861B80931501D3
:103CD000089510921501089580911401681720F439
:103CE000861B809314010895109214010895809109
:103CF0001301681720F4861B809313010895109216
:103D00001301089580911201681720F4861B809397
:103D100012010895109212010895809111016817FF
:103D200020F4861B809311010895109211010895CB
:103D300080911001681720F4861B8093100108956C
:103D40001092100108950F931F938D3109F46AC0EA
:103D500008F03FC08E3009F484C0C0F4873009F405
:103D60006DC068F4863009F0B5C08091CD01817FC7
:103D70008E7F8093CD0181E08093DD01ACC08830DF
:103D800009F457C08B3009F46AC0A4C0863109F425
:103D900066C078F4803109F477C0813109F09AC0A7
:103DA0000E94FA1290910D0181E0892780930D0104
:103DB00056C0893109F453C08B3109F08BC0809112
:103DC000CD0181FB222720F991E0922790FB81F918
:103DD00051C0853309F475C048F4873209F471C0C5
:103DE00008F45EC0893209F46CC074C0833430F4C6
:103DF0008A3308F053C0883391F16CC0833409F4DE
:103E000060C0883409F066C00E94FA120FEF13ED0B
:103E100020E3015010402040E1F700C000000E9464
:103E2000E2191DC00E942B200E946A0D0E946306A9
:103E300016C00E94961B0E94A81B11C09091CD0134
:103E4000892F8095817080FB90F929F096609860A9
:103E50009093CD0140C0997F977F9093CD0181E0F1
:103E60003AC08091CD0182FB222720F991E0922770
:103E700090FB82F98093CD01992389F38091CD0144
:103E800081608093CD01EBCF8091CD0183FB222710
:103E900020F991E0922790FB83F9ECCF895301C080
:103EA0008D5141E050E060E070E08A019B0104C068
:103EB000000F111F221F331F8A95D2F7C901B801C5
:103EC00004C061E070E080E090E00E94B6160E94BD
:103ED000FA12C5CF80E01F910F91089580E00895F8
:103EE00080E00895CF93C82F8091DD01813079F073
:103EF00018F08230E9F187C0E0910E01F0910F01D6
:103F00008081813169F0823209F07FC009C0E0917F
:103F10000E01F0910F018081813111F0823261F444
:103F20008C2F0E946E1F811104C08C2F0E94A31E33
:103F30001DC081E090E01AC08C2F0E94701F81117B
:103F400014C0C43179F048F4CB3079F0C03109F0B5
:103F500060C082E08093DD0108C0C93219F0C83327
:103F600021F057C01092DD0154C081E0817053C030
:103F7000C93289F118F5C43171F1A8F4C73009F0DC
:103F800046C08AE08093150194E19093140193E078
:103F9000909313018093120188E08093110188E2CD
:103FA0008093100134C0CE51C63088F5EC2FF0E07C
:103FB000E65DFE4F80818093DC0129C0CE34E9F0BC
:103FC00020F4CB3421F56AE013C0C13579F0C23555
:103FD000F1F461E00DC08091DC01882319F01092AA
:103FE000DC0115C081E08093DD0115C061E006C0F1
:103FF0008091DC010E94DD1D0AC06AE08091DC0135
:104000000E94531E04C01092DD0180E004C081E0D4
:1040100002C080E0ABCFCF910895E1E8F0E080816D
:10402000886080838081816080838FB7F89493E07B
:104030009093890090ED909388008FBF0895EFE6EC
:10404000F0E08081826080830895EFE6F0E0808177
:104050008D7F80830895EFE6F0E0908182E08927EC
:10406000808308951F920F920FB60F9211242F9301
:104070003F934F935F936F937F938F939F93AF93F0
:10408000BF93EF93FF938091DE019091DF01019642
:104090009093DF018093DE01811103C082E00E94D2
:1040A0006306E091DF01E695E695F0E0EA5CFC4FFF
:1040B000E4918091DE018E1303C080E00E946306CC
:1040C000FF91EF91BF91AF919F918F917F916F91F0
:1040D0005F914F913F912F910F900FBE0F901F90C6
:1040E000189504D06894B1118DC0089570D088F0EF
:1040F0009F5790F0B92F9927B751A0F0D1F0660FD4
:10410000771F881F991F1AF0BA95C9F712C0B130EE
:1041100081F077D0B1E0089574C0672F782F882799
:10412000B85F39F0B93FCCF3869577956795B3952D
:10413000D9F73EF490958095709561957F4F8F4F9C
:104140009F4F0895E89409C097FB3EF490958095A1
:10415000709561957F4F8F4F9F4F9923A9F0F92F4D
:1041600096E9BB279395F695879577956795B795CB
:10417000F111F8CFFAF4BB0F11F460FF1BC06F5FB1
:104180007F4F8F4F9F4F16C0882311F096E911C0C3
:10419000772321F09EE8872F762F05C0662371F0E4
:1041A00096E8862F70E060E02AF09A95660F771FF8
:1041B000881FDAF7880F9695879597F9089557FD28
:1041C0009058440F551F59F05F3F71F04795880F85
:1041D00097FB991F61F09F3F79F08795089512161C
:1041E00013061406551FF2CF4695F1DF08C01616C8
:1041F00017061806991FF1CF869571056105089479
:104200000895E894BB2766277727CB0197F908958F
:104210000BD078C069D028F06ED018F0952309F043
:104220005AC05FC01124EECFCADFA0F3959FD1F32F
:10423000950F50E0551F629FF001729FBB27F00D54
:10424000B11D639FAA27F00DB11DAA1F649F6627A9
:10425000B00DA11D661F829F2227B00DA11D621FF8
:10426000739FB00DA11D621F839FA00D611D221FB2
:10427000749F3327A00D611D231F849F600D211D96
:10428000822F762F6A2F11249F5750408AF0E1F039
:1042900088234AF0EE0FFF1FBB1F661F771F881F82
:1042A00091505040A9F79E3F510570F014C0AACF1D
:1042B0005F3FECF3983EDCF3869577956795B7956D
:1042C000F795E7959F5FC1F7FE2B880F911D969597
:1042D000879597F9089597F99F6780E870E060E007
:1042E00008959FEF80EC089500240A94161617068F
:1042F00018060906089500240A94121613061406D7
:1043000005060895092E0394000C11F4882352F039
:10431000BB0F40F4BF2B11F460FF04C06F5F7F4FF1
:104320008F4F9F4F089597FB072E16F4009407D0E8
:1043300077FD09D00E94AD2107FC05D03EF4909591
:1043400081959F4F0895709561957F4F0895EE0F69
:10435000FF1F0590F491E02D0994AA1BBB1B51E1AE
:1043600007C0AA1FBB1FA617B70710F0A61BB70BE5
:10437000881F991F5A95A9F780959095BC01CD018A
:104380000895F999FECF92BD81BDF89A992780B51D
:104390000895A8E1B0E042E050E00C94E421262F1B
:1043A000F999FECF1FBA92BD81BD20BD0FB6F8941A
:1043B000FA9AF99A0FBE019608950E94CF21272FED
:1043C0000C94D021DC01CB01FC01F999FECF06C091
:1043D000F2BDE1BDF89A319600B40D9241505040C3
:0843E000B8F70895F894FFCF2F
:1043E80020026506F306D0069C0668060101BA019C
:1043F80028080A03140A3F4D3639F702AA02740244
:104408003B02CE01E701000219020102030405067E
:044418000708090088
:00000001FF

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

@ -0,0 +1,73 @@
#include "ergodox_ez.h"
#include "debug.h"
#include "action_layer.h"
#define BASE 0
#define QWRT 1
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[BASE] = KEYMAP(
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F5,
KC_TAB, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_BSLS,
KC_LCTL, KC_A, KC_S, KC_E, KC_T, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC,
KC_F1, KC_F2, KC_F3, KC_F4, KC_LGUI,
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLD, KC_MUTE,
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLU,
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_BSPC, CTL_T(KC_ESC), KC_LALT,
//
/*-*/ KC_F6, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL,
/*-*/ TG(QWRT), KC_J, KC_U, KC_R, KC_L, KC_SCLN, KC_MINS,
/*-*/ /*-*/ KC_Y, KC_N, KC_I, KC_O, KC_H, KC_ENT,
/*-*/ KC_RBRC, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
/*-*/ /*-*/ /*-*/ KC_RGUI, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT,
KC_MPLY, KC_MNXT,
KC_MPRV,
KC_RALT, KC_QUOT, KC_SPC
),
[QWRT] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_E, KC_R, KC_T, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_D, KC_F, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
/*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
//
/*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
/*-*/ KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_TRNS,
/*-*/ /*-*/ KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_TRNS,
/*-*/ KC_TRNS, KC_N, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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) {
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
case QWRT:
ergodox_right_led_1_on();
break;
default:
break;
}
};

@ -0,0 +1,34 @@
# Roman's Layout
There are two layers:
- **BASE** is [Norman layout](https://normanlayout.info/).
- **QWRT** is QWERTY.
[![keyboard-layout](romanzolotarev-norman-qwerty-osx.png)](http://www.keyboard-layout-editor.com/#/gists/3b236f450da474dc506a5a80390c3cc7)
## Switching
- Tap `QWRT` to toggle **QWRT**.
## LEDs
- Red: QWRT is on.
## Functional Keys
- Tap `F1` to mute microphone via [Shush](http://mizage.com/shush/).
- Tap `F2` to copy screenshot to the clipboard.
- Hold `SHIFT` and tap `F2` to save screenshot as a file.
- Tap `F3`, `F4`, `F5`, `F6` to resize a window via [Divvy](http://mizage.com/divvy/).
## CTRL/ESC
Both CTRL and ESC are frequently used in Vim.
- Tap `CTRL/ESC` to send `ESC`.
- Hold `CTRL/ESC` to use as `CTRL`.
## Activate N-rollover
- Hold left `SHIFT` and right `SHIRT` and then tap `N`.

@ -0,0 +1,1139 @@
:100000000C940F020C9453020C9453020C94530260
:100010000C9453020C9453020C9453020C9453020C
:100020000C9453020C9453020C94070C0C94D90CAE
:100030000C9453020C9453020C9453020C945302EC
:100040000C9453020C94A3210C9453020C9453026D
:100050000C9453020C94321B0C9453020C945302D4
:100060000C9453020C9453020C9453020C945302BC
:100070000C9453020C9453020C9453020C945302AC
:100080000C9453020C9453020C9453020C9453029C
:100090000C9453020C9453020C9453020C9453028C
:1000A0000C9453020C9453020C945302460D680DA9
:1000B000560E680D560EAD0DD00D560E250E380E8F
:1000C0002411241161116111A411E211FB13FB131E
:1000D000FB11FB13FC12FC12CF13FB13FB13E613F3
:1000E00035002B00E000E1003A0000001E00140083
:1000F00004001D003B00E2001F001A0016001B0058
:100100003C00297120000700080006003D002A007D
:100110002100090017001900E300A90022000E00C9
:100120000A0005000000AA003E00310000002F0078
:100130000000A8003F000154000030000000AE00A5
:1001400023000D001C0013000000AB002400180069
:1001500011001000E700AC00250015000C0036006F
:1001600050002C0026000F00120037005100340010
:10017000270033000B0038005200E6002E002D004F
:100180002800E5004F00000001000100010001000F
:100190000100000001000100010001000100010058
:1001A0000100010001000100010001000100080040
:1001B0000700010001000100010015000900010015
:1001C0000100010001001700010001000000010012
:1001D0000100010000000100000001000100010019
:1001E000000001000000010001001C000B001100D4
:1001F00000000100010018000D00010001000100D5
:1002000001000C000E0001000100010001001200BD
:100210000F00010001000100010013003300010084
:1002200001000100010001000100010001000000C7
:1002300016034500720067006F0044006F007800ED
:10024000200045005A0000001603450072006700B8
:100250006F0044006F007800200045005A00000045
:100260000403090409026D00040100A0FA09040056
:10027000000103010100092111010001223F0007D3
:1002800005810308000A09040100010301020009B5
:100290002111010001224D000705820308000A090F
:1002A00004020001030000000921110100012236AF
:1002B000000705830308000A090403000103000086
:1002C00000092111010001223900070584031000F3
:1002D000011201100100000008EDFE0713010001EA
:1002E00002000105010906A101050719E029E7152A
:1002F0000025019508750181020508190129059558
:1003000005750191029501750391010507190029F1
:100310007715002501957875018102C005010980D6
:10032000A101850216010026B7001A01002AB700B4
:10033000751095018100C0050C0901A10185031606
:100340000100269C021A01002A9C02751095018169
:1003500000C005010902A1010901A1000509190157
:100360002905150025019505750181029501750383
:1003700081010501093009311581257F9502750834
:10038000810609381581257F950175088106050CC0
:100390000A38021581257F950175088106C0C005C0
:1003A000010906A101050719E029E71500250195B6
:1003B0000875018102950175088101050819012957
:1003C00005950575019102950175039101050719C0
:1003D0000029FF150025FF950675088100C0000063
:1003E000000000000000000000010204060A0F17D0
:1003F000202C3A4A5D71879DB3C7DAE9F5FCFFFC12
:10040000F5E9DAC7B39D87715D4A3A2C20170F0AC8
:10041000060402010000000000000000000011249A
:100420001FBECFEFDAE0DEBFCDBF04B603FE24C0AF
:100430008091EE019091EF01A091F001B091F10156
:100440008730904BA740B04BB9F41092EE01109258
:10045000EF011092F0011092F10114BE84B7877F72
:1004600084BF88E10FB6F89480936000109260001A
:100470000FBEE0E0FFE3099511E0A0E0B1E0E4ED9C
:10048000F6E402C005900D92A433B107D9F711E04C
:10049000A4E3B1E001C01D92AE3EB107E1F70E94B6
:1004A0004B090C9468230C94000008950895609102
:1004B000B1017091B2018091B3019091B4010E9499
:1004C0005E1A56985E9825982D9826982E9827980B
:1004D0002F98813011F4259A2D9A08950C94570283
:1004E00056985E9825982D9826982E9827982F989C
:1004F0008FEF90E0909389008093880090938B0019
:1005000080938A0090938D0080938C00259A2D9A79
:100510002FEF80E792E0215080409040E1F700C04B
:100520000000269A2E9A2FEF80E792E0215080401B
:100530009040E1F700C00000279A2F9A2FEF80E744
:1005400092E0215080409040E1F700C000002598E3
:100550002D982FEF80E792E0215080409040E1F706
:1005600000C0000026982E982FEF80E792E02150DF
:1005700080409040E1F700C0000027982F985698DF
:100580005E9825982D9826982E9827982F9808954C
:1005900089EA8093800089E08093810024982C98D8
:1005A0003F988AB18F748AB96E98479A8BB1806BE5
:1005B0008BB9769A0E9470020C94560280E2809366
:1005C00000018091340181110EC00E942D0381E051
:1005D000809334012FEF83ED90E3215080409040D1
:1005E000E1F700C0000080E40E9433038093000123
:1005F00081112EC00E945D0380930001811128C0EB
:100600000E945D0380930001811122C08FE30E944C
:100610005D038093000181111BC00E94550380E49B
:100620000E94330380930001811112C08CE00E946C
:100630005D038093000181110BC00E945D038093D4
:100640000001811105C08FE30E945D0380930001CA
:100650000E9455038091000108951092B9008AE02C
:100660008093B800089594EA9093BC009091BC00E8
:1006700097FFFCCF9091B900987F983021F090318E
:1006800011F081E008958093BB0084E88093BC0062
:100690008091BC0087FFFCCF8091B900887F8831B2
:1006A00011F0803471F780E0089584E98093BC00F4
:1006B0008091BC0084FDFCCF08958093BB0084E84A
:1006C0008093BC008091BC0087FFFCCF9091B90063
:1006D000987F81E0983209F480E0089584E880935F
:1006E000BC008091BC0087FFFCCF8091BB000895C7
:1006F00080910001811115C080E40E943303809332
:10070000000181110CC082E10E945D038093000111
:10071000811105C08FEF0E945D03809300010E944C
:10072000550384B1807F84B985B1807F85B98AB152
:10073000837F8AB98BB1837F8BB93E9846980895A1
:100740000E94DE02809300010E94780380B38C70C7
:1007500080BB81B3836F81BBA6E3B1E0E4E4F1E049
:100760008EE08E0F11921D928E13FCCF0C94C80256
:10077000BF92CF92DF92EF92FF920F931F93CF938E
:10078000DF9380910001882379F0809135018F5F9C
:1007900080933501811108C00E94DE028093000120
:1007A000811102C00E94700206E311E0C0E0D0E0B7
:1007B000DD24D39482E0C82EEE24E394F12CC730DC
:1007C000D10500F580910001811164C080E40E9490
:1007D000330380930001811112C082E10E945D0306
:1007E0008093000181110BC0C7010C2E01C0880F3E
:1007F0000A94EAF780950E945D03809300010E94AD
:10080000550348C0CA30A1F028F4C83059F0C930A7
:1008100061F005C0CC3089F070F0CD3089F0209ABD
:10082000289810C0219A29980DC0229A2A980AC0A7
:10083000239A2B9807C0529A01C0539A5B9802C022
:100840003E9A469890EA9A95F1F79FB1799902C03D
:1008500082E001C080E091709D25982B7C9902C0B8
:1008600084E001C080E0892B7D9902C038E001C09E
:1008700030E0832B7E9902C020E101C020E0822B72
:100880009FB19095991F9927991F9295990F907EE6
:10089000892B0FC080910001811149C080E40E9422
:1008A000330380930001882379F1B12C0E94550312
:1008B0008B2DF8019081981719F08083C092010167
:1008C0000E94780321960F5F1F4FCE30D10509F0AB
:1008D00076CF80910101882361F1815080930101DD
:1008E000882339F08FE99FE00197F1F700C00000FD
:1008F00020C0A4E4B1E0E6E3F1E0CF01825F919192
:100900009D938E13FCCF15C083E10E945D038093FD
:1009100000018111CACF81E40E943303809300015A
:100920008111C3CF0E946E03B82EB094BFCF80E078
:10093000C0CF0E946E0281E0DF91CF911F910F9195
:10094000FF90EF90DF90CF90BF900895E82FF0E0F8
:10095000EC5BFE4F808108950895089596E0799F9D
:10096000F001112494E5899FE00DF11D1124E60F9B
:10097000F11DEE0FFF1FE052FF4F859194910895F6
:10098000880F991FFC01E05AF040859194910895D9
:10099000880F991FFC01E052FF4F859194910895B3
:1009A0000F931F93CF93DF93EC018115904350F584
:1009B000C11580E2D80708F0B3C0CB3BD10590F455
:1009C000C83AD10508F05AC0C53AD10508F04BC065
:1009D000C430D10508F0BBC1219709F0B5C101E0D1
:1009E00010E0F5C1CF3FD10511F008F0B0C1C03F14
:1009F000D10508F092C0CE01805E9109089708F4F5
:100A0000A6C1A2C1C11591E5D907A8F4C23020E55D
:100A1000D20708F09EC0C11580E5D80709F485C04B
:100A200008F091C0C11520E4D20708F08DC1DD2780
:100A30008E01106CCCC1C11580E8D80758F4C115DF
:100A400090E7D90708F07CC1C11520E6D20708F469
:100A500022C17AC1C11580E9D80708F075C1DF70DD
:100A60008E01106AB4C1C53AD10509F472C1C63A03
:100A7000D10509F071C102E810E4A9C1C83AD10555
:100A800009F46DC1C93AD10509F46CC1CA3AD1055E
:100A900009F46BC1CB3AD10509F46AC1CC3AD1054E
:100AA00009F469C1CD3AD10509F468C1C03BD1054B
:100AB00009F467C1CE3AD10509F466C1CF3AD10530
:100AC00009F465C1C13BD10509F464C1C23BD1053C
:100AD00009F463C1C33BD10509F462C1C43BD1052C
:100AE00009F461C1C53BD10509F460C1C63BD1051C
:100AF00009F45FC1C73BD10509F45EC1C83BD1050C
:100B000009F45DC1C93BD10509F45CC1CA3BD105FB
:100B100009F45BC100E014E45AC18E01106557C1AD
:100B2000CE019F700E94C80453C10E941F149FEF02
:100B300024E38CE0915020408040E1F700C00000A9
:100B40000E94571B44C18091CD0181608093CD01EB
:100B50003EC10E94001D811102C00E94E61C0E943D
:100B60001D1D90E09093EE018093ED01C23090E561
:100B7000D90721F48091ED01816086C0C43020E561
:100B8000D20721F48091ED0182607EC0C63080E5FD
:100B9000D80721F48091ED01846076C0C83090E5DB
:100BA000D90719F48091ED0127C0CA3020E5D2079A
:100BB00021F48091ED01806167C0CC3080E5D807D9
:100BC00021F48091ED0180625FC0CE3090E5D907BD
:100BD00021F48091ED01806457C0C03120E5D20737
:100BE00021F48091ED0180684FC0C23180E5D807C3
:100BF00029F48091ED018460886046C0C33090E59F
:100C0000D90721F48091ED018E7F3EC0C53020E5EB
:100C1000D20721F48091ED018D7F36C0C73080E589
:100C2000D80721F48091ED018B7F2EC0C93090E56B
:100C3000D90719F48091ED0126C0CB3020E5D20709
:100C400021F48091ED018F7E1FC0CD3080E5D80763
:100C500021F48091ED018F7D17C0CF3090E5D90749
:100C600021F48091ED018F7B0FC0C13120E5D207C7
:100C700021F48091ED018F7707C0C331D04531F465
:100C80008091ED018B7F877F8093ED018091ED0155
:100C90000E94211D9CC08D2F99278F70992781302C
:100CA0009105D9F49E012370332702C0880F991F44
:100CB0002A95E2F79C688E0144E0000F111F4A95C7
:100CC000E1F700271370802B912B53E0CC0FDD1F31
:100CD0005A95E1F7C076DD272FC08230910531F4B7
:100CE000DC2FCC278E01016F106A71C08330910513
:100CF00069F4CE018370992701E010E002C0000F73
:100D0000111F8A95E2F7C8019C680FC0049709F08B
:100D10005EC0CE018370992701E010E002C0000F91
:100D2000111F8A95E2F7C8019A6823E0CC0FDD1FF6
:100D30002A95E1F7C07ED7708C010C2B1D2B47C084
:100D4000DF708E01106243C000E010E040C08E01F1
:100D50003EC001E810E43BC003E810E438C002EEF6
:100D600014E435C009EE14E432C00AEE14E42FC0D6
:100D700005EB14E42CC006EB14E429C007EB14E4E3
:100D800026C00CEC14E423C00DEC14E420C003E8EE
:100D900015E41DC00AE815E41AC002E915E417C0FD
:100DA00004E915E414C001E216E411C003E216E4FC
:100DB0000EC004E216E40BC005E216E408C006E229
:100DC00016E405C007E216E402C00AE216E4C80110
:100DD000DF91CF911F910F91089596E0799FF001D7
:100DE000112494E5899FE00DF11D1124E60FF11DFA
:100DF000EE0FFF1FE052FF4F85919491803E9105C9
:100E0000E0F4803C910558F58133910509F46FC0F9
:100E100048F48932910509F463C08A32910509F4D6
:100E20006DC072C089339105E9F082389105D1F027
:100E30008533910509F44DC067C0833E910581F16A
:100E400038F4803E9105B9F0823E9105D9F05CC03E
:100E5000863E910561F1873E9105A1F155C00E9442
:100E6000C00408952091ED0120FD02C021FF4CC077
:100E700080EE90E049C08091ED0180FFF9CF89E3D9
:100E800090E042C08091ED0182FF0EC08091ED01A3
:100E900084FF03C080E090E037C083EE90E034C070
:100EA0008091ED0182FFF2CF82EE90E02DC0809123
:100EB000ED0183FF0BC08091ED0184FDEBCF87EE48
:100EC00090E022C08091ED0183FFF5CF86EE90E0A7
:100ED0001BC08091ED0185FF07C089E290E014C03E
:100EE0008091ED0185FFF9CF85E390E00DC0809101
:100EF000ED0186FF07C08AE290E006C08091ED0117
:100F000086FFF9CF81E390E00E94D0040895089510
:100F10000C948707809162010895CF93DF9300D0EE
:100F20001F92CDB7DEB79C018091E401843019F5A2
:100F300093E099833B832A839093E9008FEF90910C
:100F4000E800815095FD06C095ED9A95F1F70000F7
:100F50008111F5CF8091E80085FF0DC040E050E0A1
:100F600063E070E0CE0101960E94F7098091E800ED
:100F70008E778093E8000F900F900F90DF91CF91C4
:100F80000895CF93DF9300D01F92CDB7DEB72091A5
:100F9000E401243021F522E029839B838A8383E0C6
:100FA0008093E9008FEF9091E800815095FD06C095
:100FB00095ED9A95F1F700008111F5CF8091E80049
:100FC00085FF0DC040E050E063E070E0CE01019687
:100FD0000E94F7098091E8008E778093E8000F90D7
:100FE0000F900F90DF91CF9108952091E40124306C
:100FF000F1F422E02093E9002FEF3091E800215036
:1010000035FD06C035ED3A95F1F700002111F5CF19
:101010002091E80025FF0BC040E050E065E070E063
:101020000E94F7098091E8008E778093E800089588
:10103000CF93DF93EC019091E401943009F046C026
:1010400080910C018823D9F080910D018823B9F09B
:101050009093E9008FEF9091E800815095FD06C0D4
:1010600095E19A95F1F700008111F5CF8091E800A4
:1010700085FF2CC040E050E060E170E017C081E0E7
:101080008093E9008FEF9091E800815095FD06C0B4
:1010900095ED9A95F1F700008111F5CF8091E80068
:1010A00085FF14C040E050E068E070E0CE010E948F
:1010B000F7098091E8008E778093E80080E1FE01D7
:1010C000A2E5B1E001900D928A95E1F7DF91CF9111
:1010D00008958091E301811109C00E948C0B0E9448
:1010E000E90B8091E20084608093E2000895109201
:1010F000E301089508950C9490210E94ED1A0E9436
:1011000096210E948F0E0C94880742E061EC81E0EA
:101110000E94060B42E061EC82E00E94060B42E076
:1011200061EC83E00E94060B42E161EC84E00C94E8
:10113000060B8091E601833009F455C030F481300C
:1011400071F0823009F48EC008958A3009F47AC0B3
:101150008B3009F460C0893009F09CC020C08091B8
:10116000E501813A09F096C08091E800877F80937D
:10117000E8008091E9019091EA01892B21F460E176
:1011800082E591E003C060E080E090E070E00E94C2
:10119000420A8091E8008B778093E800089580915F
:1011A000E501813209F076C08091E9019091EA0170
:1011B000009719F0039709F06DC08091E800877FD0
:1011C0008093E8008091E80082FD05C08091E401F1
:1011D0008111F8CF5FC08091F1008093620180910E
:1011E000E8008B7753C08091E501813A09F052C045
:1011F0008091E9019091EA01892B09F04BC080911F
:10120000E800877F8093E8008091E80080FFFCCFB2
:1012100080910C0136C08091E5018132D9F5809131
:10122000E9019091EA01892BA9F58091E800877F77
:101230008093E8000E943B0B8091E70180930C01B2
:101240000C941F148091E501813221F58091E80012
:10125000877F8093E8000E943B0B8091E801809398
:10126000630108958091E501813AA1F48091E8003D
:10127000877F8093E8008091E80080FFFCCF809119
:1012800063018093F1008091E8008E778093E800FD
:101290000C943B0B089584B7877F84BF88E10FB619
:1012A000F89480936000109260000FBE90E080E898
:1012B0000FB6F89480936100909361000FBE0E9476
:1012C000DE0E0E948C0B0E94E90B8091E20084608C
:1012D0008093E20078940E946F0E0E94E00E82E0FC
:1012E00091E00E948A0E0E947E218091E401853067
:1012F00069F40E94AE1A8091E2018823B1F30E9442
:10130000D91A882391F30E94E109EFCF0E94E60EDB
:10131000ECCF292F332723303105C9F064F4213075
:10132000310581F02230310509F043C08DE690E0AF
:1013300024E632E042C021323105F1F0223231059B
:1013400041F137C082E190E021ED32E036C09927CB
:101350008130910541F08230910541F0892B49F5AA
:10136000E0E6F2E005C0E8E4F2E002C0E0E3F2E02B
:10137000849190E09F0121C06430D8F4E62FF0E022
:10138000EE0FFF1FEE5DFE4F2081318189E090E07E
:1013900014C0643070F470E0FB01EE0FFF1FE65ED6
:1013A000FE4F20813181FB01EA5EFE4F808190E09B
:1013B00004C080E090E020E030E0FA013183208337
:1013C000089580E189BD82E189BD09B400FEFDCFA9
:1013D0008091D8008F7D8093D8008091E00082605A
:1013E0008093E0008091E00081FDFCCF0895CF92D2
:1013F000DF92EF92FF920F931F93CF93DF93EC0155
:101400008B016A010E945A0B811133C0C114D104AF
:1014100039F0F60180819181081B190BC80FD91F83
:10142000E12CF12C0115110519F18091E80085FDE1
:1014300016C08091E8008E778093E800C114D10433
:1014400049F0F60180819181E80EF91EF182E08277
:1014500085E00FC00E945A0B882321F30AC08991AE
:101460008093F10001501109FFEFEF1AFF0ADACF64
:1014700080E0DF91CF911F910F91FF90EF90DF906F
:10148000CF9008952091EB013091EC01261737079A
:1014900048F06115710539F42091E8002E7720930A
:1014A000E80001C0B90140E061157105A9F1209182
:1014B000E401222309F443C0253009F442C02091FD
:1014C000E80023FD40C02091E80022FD32C02091B9
:1014D000E80020FFE9CF4091F3002091F20030E0D6
:1014E000342BFC01CF016115710559F0283031050D
:1014F00040F481918093F100615071092F5F3F4F5B
:10150000F1CF41E02830310509F040E02091E800BA
:101510002E772093E800C8CF4111C9CF0AC080912F
:10152000E401882361F0853061F08091E80083FD5B
:101530000AC08091E80082FFF2CF80E0089582E047
:10154000089583E0089581E008952091EB013091A2
:10155000EC012617370748F06115710539F4209121
:10156000E8002E772093E80001C0B901FC0120E0DB
:101570006115710591F18091E401882309F440C05F
:10158000853009F43FC08091E80083FD3DC0809123
:10159000E80082FD2FC08091E80080FFE9CF209114
:1015A000F3008091F20090E0922B6115710559F0E3
:1015B0008830910540F424912093F10031966150D8
:1015C00071090196F2CF21E0089709F020E080919F
:1015D000E8008E778093E800CBCF2111CCCF0AC0F2
:1015E0008091E401882361F0853061F08091E8000A
:1015F00083FD0AC08091E80082FFF2CF80E0089569
:1016000082E0089583E0089581E00895982F97304F
:1016100058F59093E900981739F07091EC002091FB
:10162000ED005091F00003C0242F762F50E021FFF1
:1016300019C03091EB003E7F3093EB003091ED000C
:101640003D7F3093ED003091EB0031603093EB0043
:101650007093EC002093ED005093F0002091EE0089
:1016600027FF07C09F5FD3CF8F708093E90081E091
:10167000089580E008958091E50187FF11C0809171
:10168000E80082FD05C08091E4018111F8CF11C00E
:101690008091E8008B770BC08091E401882349F0AA
:1016A0008091E80080FFF8CF8091E8008E778093EA
:1016B000E80008952091E4003091E50095E640911E
:1016C000EC00842F817040FF22C08091E80080FDF3
:1016D0001CC08091E401882391F0853091F08091C5
:1016E000EB0085FD10C04091E4005091E5004217E9
:1016F000530729F39A01915011F784E0089582E08D
:10170000089583E0089581E0089580E00895409170
:10171000E80042FFDECF08950E94FA0B0E94020CFF
:10172000E0EEF0E0808181608083E8EDF0E0808190
:101730008F77808319BCA7EDB0E08C918E7F8C935E
:1017400080818F7E80831092E30108950F931F9311
:10175000CF93DF930E94FA0B0E94020CC8EDD0E0F9
:1017600088818F77888388818068888388818F7D4E
:10177000888319BC1092E4011092E0011092E201FA
:101780001092E10100EE10E0F80180818B7F8083F0
:1017900088818160888342E060E080E00E94060BDF
:1017A000E1EEF0E080818E7F8083E2EEF0E08081E8
:1017B00081608083808188608083F80180818E7F52
:1017C0008083888180618883DF91CF911F910F9101
:1017D0000895E8EDF0E080818F7E8083E7EDF0E012
:1017E00080818160808384E082BF81E08093E30117
:1017F0000C94A60BE8EDF0E080818E7F8083109240
:10180000E20008951092DA001092E10008951F920C
:101810000F920FB60F9211242F933F934F935F9324
:101820006F937F938F939F93AF93BF93EF93FF93A8
:101830008091E10082FF0BC08091E20082FF07C02F
:101840008091E1008B7F8093E1000E946E0E809179
:10185000DA0080FF1FC08091D80080FF1BC08091FC
:10186000DA008E7F8093DA008091D90080FF0DC06E
:1018700080E189BD82E189BD09B400FEFDCF81E030
:101880008093E4010E94690805C019BC1092E4012C
:101890000E9477088091E10080FF19C08091E200EA
:1018A00080FF15C08091E2008E7F8093E2008091DE
:1018B000E20080618093E2008091D8008062809392
:1018C000D80019BC85E08093E4010E947B088091D8
:1018D000E10084FF30C08091E20084FF2CC080E1F1
:1018E00089BD82E189BD09B400FEFDCF8091D80099
:1018F0008F7D8093D8008091E1008F7E8093E100FE
:101900008091E2008F7E8093E2008091E20081600E
:101910008093E2008091E001882311F084E007C009
:101920008091E30087FD02C081E001C083E08093E5
:10193000E4010E947D088091E10083FF29C080912D
:10194000E20083FF25C08091E100877F8093E10062
:1019500082E08093E4011092E0018091E1008E7FAB
:101960008093E1008091E2008E7F8093E20080917D
:10197000E20080618093E20042E060E080E00E944B
:10198000060B8091F00088608093F0000E947A0836
:10199000FF91EF91BF91AF919F918F917F916F9147
:1019A0005F914F913F912F910F900FBE0F901F901D
:1019B00018951F920F920FB60F9211242F933F93F9
:1019C0004F935F936F937F938F939F93AF93BF9347
:1019D000CF93DF93EF93FF93C091E900CF70809195
:1019E000EC00D82FD17080FDD0E81092E9008091F2
:1019F000F000877F8093F00078940E941D0D109274
:101A0000E9008091F00088608093F000CD2BCF70CA
:101A1000C093E900FF91EF91DF91CF91BF91AF911A
:101A20009F918F917F916F915F914F913F912F91F6
:101A30000F900FBE0F901F9018951F93CF93DF93B9
:101A4000CDB7DEB7AA970FB6F894DEBF0FBECDBFF5
:101A5000E5EEF1E088E08E0F9091F10091938E1306
:101A6000FBCF0E9499088091E80083FF1FC18091FD
:101A7000E5019091E601492F50E04A30510508F008
:101A800015C1FA01EA5AFF4F0C941823803881F0EF
:101A9000823809F00BC18091E9018F708093E900D1
:101AA0008091EB0085FB882780F91092E90006C041
:101AB0008091E1019091E201911182609091E800A2
:101AC000977F9093E8008093F1001092F100C8C0D6
:101AD000282F2D7F09F0EAC0882319F0823061F0A9
:101AE000E5C08091E701813009F0E0C0933009F052
:101AF00080E08093E2012BC08091E701811127C033
:101B00008091E9018F7009F4D1C08093E9002091A0
:101B1000EB0020FF1CC0933021F48091EB00806229
:101B200014C09091EB0090619093EB0021E030E0C5
:101B3000A90102C0440F551F8A95E2F74093EA00BD
:101B40001092EA008091EB0088608093EB00109285
:101B5000E9008091E800877F86C08111A7C01091BD
:101B6000E7011F778091E3008078812B8093E30069
:101B70008091E800877F8093E8000E943B0B809172
:101B8000E80080FFFCCF8091E30080688093E30051
:101B9000111102C082E001C083E08093E40186C09D
:101BA0008058823008F082C08091E7019091E8016E
:101BB0008C3D53E0950779F583E08A838AE2898337
:101BC0004FB7F894DE01139620E03EE051E2E32F98
:101BD000F0E050935700E49120FF03C0E295EF70CE
:101BE0003F5FEF708E2F90E0EA3010F0C79601C093
:101BF000C0968D939D932F5F243149F74FBF8091FD
:101C0000E800877F8093E8006AE270E0CE010196E9
:101C10000E94420A14C0AE014F5F5F4F6091E9011C
:101C20000E948909BC01892B09F440C09091E80009
:101C3000977F9093E80089819A810E94A50A8091FC
:101C4000E8008B778093E80031C0803879F5809187
:101C5000E800877F8093E8008091E0018093F100A5
:101C60008091E8008E778093E8000E943B0B1EC0B5
:101C700081111CC09091E7019230C0F48091E8007E
:101C8000877F8093E8009093E0010E943B0B809156
:101C9000E001811106C08091E30087FD02C081E070
:101CA00001C084E08093E4010E9485088091E800EF
:101CB00083FF0AC08091E800877F8093E8008091CD
:101CC000EB0080628093EB00AA960FB6F894DEBF1B
:101CD0000FBECDBFDF91CF911F9108950895CF938F
:101CE0008091E4018823A1F0C091E900CF70909128
:101CF000EC00892F817090FD80E8C82B1092E900DC
:101D00008091E80083FD0E941D0DCF70C093E90013
:101D1000CF91089590936901809368010895E091AF
:101D20006801F0916901309721F00190F081E02D78
:101D3000099480E00895E0916801F091690130977D
:101D400021F00280F381E02D09940895E09168016B
:101D5000F0916901309721F00480F581E02D09941C
:101D6000089520916601309167018217930771F001
:101D70009093670180936601E0916801F091690199
:101D8000309721F00680F781E02D09940895209185
:101D90006401309165018217930771F0909365019A
:101DA00080936401E0916801F0916901309721F01E
:101DB0000084F185E02D0994089508950C94DD0EBA
:101DC0000E94F31A0E94A0030C94B91BCF92DF92D9
:101DD000EF92FF920F931F93CF93DF93CDB7DEB7B0
:101DE0002B970FB6F894DEBF0FBECDBF0E94B8038D
:101DF0008BE6C82E81E0D82E00E010E0E02E802F88
:101E00000E94A604F60141916F01F42EF826B1F468
:101E10000F5F1F4F0E30110589F78FEF89838A837B
:101E20001B820E94FC1A8160782F9D838C834981DC
:101E30005A816B818D810E94890F40C09091CD01A4
:101E400091FF04C08B870E94AC048B8520E030E0BA
:101E50004F2D50E0922FBA01022E02C07595679562
:101E60000A94E2F760FF24C02E83EF8221E030E085
:101E7000690102C0CC0CDD1C9A95E2F790E08C2140
:101E80009D21892B09F420E028870E94FC1A81609B
:101E9000782F9A8789874E815F8168858A850E941D
:101EA000890FF801E559FE4F8081C826C08206C01F
:101EB0002F5F3F4F2630310569F6AACF0E94A01E42
:101EC00010916A010E948F0E1817A1F00E948F0EC8
:101ED00080936A012B960FB6F894DEBF0FBECDBF7C
:101EE000DF91CF911F910F91FF90EF90DF90CF90F6
:101EF0000C9488072B960FB6F894DEBF0FBECDBFAB
:101F0000DF91CF911F910F91FF90EF90DF90CF90D5
:101F10000895CF93DF93CDB7DEB72B970FB6F89424
:101F2000DEBF0FBECDBF4F83588769877A878B8707
:101F3000DE01119686E0FD0111928A95E9F785E0B0
:101F4000FE01379601900D928A95E1F749815A81F9
:101F50006B817C818D819E810E94B9162B960FB674
:101F6000F894DEBF0FBECDBFDF91CF9108950895E5
:101F7000CF93882309F4C2C0C82F823859F40E9435
:101F80008F0E81FDBBC089E30E9462190E942F1A47
:101F900089E30CC0833879F40E948F0E80FDAEC0B7
:101FA00083E50E9462190E942F1A83E50E94A419FA
:101FB000CF910C942F1A843859F40E948F0E82FD11
:101FC0009DC087E40E9462190E942F1A87E4EECF19
:101FD0008CEF8C0F813A48F48C2F0E94E320811102
:101FE0008DC08C2F0E946219E3CF80E28C0F883065
:101FF00048F4C77081E001C0880FCA95EAF70E94D3
:10200000E819D6CF8BE58C0F833078F4C53A29F0E8
:10201000C63A31F083E890E005C081E890E002C064
:1020200082E890E0CF910C94B10E88E58C0F83315B
:1020300008F064C0C83A39F1C93A41F1CA3A49F1E5
:10204000CB3A51F1CC3A59F1CD3A61F1C03B69F14B
:10205000CE3A71F1CF3A79F1C13B81F1C23B89F1BE
:10206000C33B91F1C43B99F1C53BA1F1C63BA9F13A
:10207000C73BB1F1C83BB9F1C93BC1F1CA3BC9F19A
:1020800080E090E038C082EE90E035C089EE90E0CC
:1020900032C08AEE90E02FC085EB90E02CC086EB3A
:1020A00090E029C087EB90E026C08CEC90E023C044
:1020B0008DEC90E020C083E891E01DC08AE891E0BB
:1020C0001AC082E991E017C084E991E014C081E26E
:1020D00092E011C083E292E00EC084E292E00BC075
:1020E00085E292E008C086E292E005C087E292E0D5
:1020F00002C08AE292E0CF910C94C70ECF9108956E
:10210000882309F44BC0823859F40E948F0E81FF56
:1021100045C089E30E9462190E942F1A89E30CC00E
:10212000833871F40E948F0E80FF38C083E50E94CF
:1021300062190E942F1A83E50E94A4190C942F1A89
:10214000843859F40E948F0E82FF28C087E40E94D1
:1021500062190E942F1A87E4EFCF9CEF980F913AF3
:1021600058F390E2980F983050F4877091E001C0D6
:10217000990F8A95EAF7892F0E94EE19DFCF9BE528
:10218000980F933020F480E090E00C94B10E885AC0
:10219000833120F480E090E00C94C70E08958823EA
:1021A00021F00E94E8190C942F1A0895882321F039
:1021B0000E94EE190C942F1A0895BF92CF92DF92CD
:1021C000EF92FF920F931F93CF93DF9300D000D035
:1021D00000D0CDB7DEB725E0FC01DE0111960190FD
:1021E0000D922A95E1F7FC01D080118102812581B1
:1021F00022952F7043815481452B09F4FCC21F3F67
:1022000021F4FFEFDF1609F4F6C27C012E830E9451
:10221000B70FD9821A8369817A81802F0E945E1953
:10222000182FB92E0E9413190E94DA172E8100234D
:1022300019F00E94051A2E81EB2DE295EF70F0E067
:10224000E05AFF4F0C9418238B2D807F9B2D9F709D
:10225000F92E882319F0F29480EFF822002389F0F8
:10226000FF2009F475C280E2810F883020F48F2DA1
:102270000E94E81903C08F2D0E94F8190E942F1A9E
:1022800067C2812F0E948010FF2009F4B4C2105E43
:102290008F2D183018F40E94EE1902C00E94FE190A
:1022A00026960FB6F894DEBF0FBECDBFDF91CF915B
:1022B0001F910F91FF90EF90DF90CF90BF900C9403
:1022C0002F1A3B2D307F8B2D8F70303211F082957D
:1022D000807F112319F0113021F12CC00023B9F0B7
:1022E000222309F4A0C1213009F09DC126960FB622
:1022F000F894DEBF0FBECDBFDF91CF911F910F913C
:10230000FF90EF90DF90CF90BF900C94181A22238B
:1023100019F0213009F46FC28E830E941B1A8E813E
:1023200096C1002321F0223008F065C27CC1211142
:1023300062C28DC1002321F0222309F474C108C2B6
:10234000222309F484C119C22B2D269526952370CA
:1023500030E02115310521F021303105D1F04BC29B
:10236000002321F0812F9B2D937002C080E090E02C
:1023700026960FB6F894DEBF0FBECDBFDF91CF918A
:102380001F910F91FF90EF90DF90CF90BF900C9432
:10239000B10E002321F0812F9B2D937002C080E0AD
:1023A00090E026960FB6F894DEBF0FBECDBFDF914A
:1023B000CF911F910F91FF90EF90DF90CF90BF9042
:1023C0000C94C70E812F002319F00E94A81D02C093
:1023D0000E94101E26960FB6F894DEBF0FBECDBF2A
:1023E000DF91CF911F910F91FF90EF90DF90CF90F1
:1023F000BF900C94951E8B2D837009F07BC001114A
:10240000FAC1812F829586958770880F880F912F4A
:102410009F70C92ED12CE12CF12C082E04C0CC0CBD
:10242000DD1CEE1CFF1C0A94D2F714FF12C04FE013
:1024300050E060E070E004C0440F551F661F771F36
:102440008A95D2F7CB01BA016095709580959095E9
:1024500003C060E070E0CB012B2D269526952370FC
:10246000422F50E042305105D9F04330510569F117
:102470006C297D298E299F294130510551F12696DD
:102480000FB6F894DEBF0FBECDBFDF91CF911F9185
:102490000F91FF90EF90DF90CF90BF900C940118B8
:1024A0006C297D298E299F2926960FB6F894DEBFC8
:1024B0000FBECDBFDF91CF911F910F91FF90EF9095
:1024C000DF90CF90BF900C941D180E940118C70197
:1024D000B60126960FB6F894DEBF0FBECDBFDF91D2
:1024E000CF911F910F91FF90EF90DF90CF90BF9011
:1024F0000C94E517002319F08B2D817001C086958F
:10250000882309F478C1812F829586958770880F7A
:10251000880F912F9F70C92ED12CE12CF12C082E01
:1025200004C0CC0CDD1CEE1CFF1C0A94D2F714FF77
:1025300012C04FE050E060E070E004C0440F551F4F
:10254000661F771F8A95D2F7CB01BA016095709507
:102550008095909503C060E070E0CB012B2D26950F
:1025600026952370422F50E042305105D9F0433078
:10257000510569F16C297D298E299F29413051052A
:1025800051F126960FB6F894DEBF0FBECDBFDF9196
:10259000CF911F910F91FF90EF90DF90CF90BF9060
:1025A0000C94DB186C297D298E299F2926960FB65D
:1025B000F894DEBF0FBECDBFDF91CF911F910F9179
:1025C000FF90EF90DF90CF90BF900C94F7180E948F
:1025D000DB18C701B60126960FB6F894DEBF0FBE12
:1025E000CDBFDF91CF911F910F91FF90EF90DF90C2
:1025F000CF90BF900C94BF18103FD1F118F4103E4B
:1026000050F4A1C0123F09F463C008F44CC0133F5A
:1026100009F473C098C01F708B2D8F710023A1F037
:102620000E945818812F26960FB6F894DEBF0FBE71
:10263000CDBFDF91CF911F910F91FF90EF90DF9071
:10264000CF90BF900C94CF100E947918812F2696BE
:102650000FB6F894DEBF0FBECDBFDF91CF911F91B3
:102660000F91FF90EF90DF90CF90BF900C94D61019
:102670000023A9F02111BFC08B2D8F7126960FB6B4
:10268000F894DEBF0FBECDBFDF91CF911F910F91A8
:10269000FF90EF90DF90CF90BF900C949E18223067
:1026A00008F0A9C0E9CF0023A9F08B2D8F712696E1
:1026B0000FB6F894DEBF0FBECDBFDF91CF911F9153
:1026C0000F91FF90EF90DF90CF90BF900C9458182F
:1026D000002359F38B2D8F7126960FB6F894DEBF29
:1026E0000FBECDBFDF91CF911F910F91FF90EF9063
:1026F000DF90CF90BF900C947918002399F08B2D28
:102700008F7126960FB6F894DEBF0FBECDBFDF9156
:10271000CF911F910F91FF90EF90DF90CF90BF90DE
:102720000C94431826960FB6F894DEBF0FBECDBFAB
:10273000DF91CF911F910F91FF90EF90DF90CF909D
:10274000BF900C9439180023A9F0222309F4ADCFCF
:10275000812F26960FB6F894DEBF0FBECDBFDF9156
:10276000CF911F910F91FF90EF90DF90CF90BF908E
:102770000C94B80F222309F4ADCF812F26960FB603
:10278000F894DEBF0FBECDBFDF91CF911F910F91A7
:10279000FF90EF90DF90CF90BF900C9480104B2D66
:1027A0004F70612FC7010E94550226960FB6F8940C
:1027B000DEBF0FBECDBFDF91CF911F910F91FF9074
:1027C000EF90DF90CF90BF900C945D174B2D4F7022
:1027D000612FC70126960FB6F894DEBF0FBECDBF9E
:1027E000DF91CF911F910F91FF90EF90DF90CF90ED
:1027F000BF900C94AD0426960FB6F894DEBF0FBEC2
:10280000CDBFDF91CF911F910F91FF90EF90DF909F
:10281000CF90BF9008950E94051A0E94151A0E9439
:10282000DA190E942F1A0E94461F0E94951E80E00E
:1028300090E00E94B10E80E090E00C94C70E0E94E0
:10284000F5190C940B140E945319292F22952F70FF
:1028500030E02C3031054CF42A3031056CF4225034
:1028600031092230310588F407C02C30310549F098
:102870002F30310531F009C0803E48F0803F29F407
:1028800006C093FB882780F9089580E0089581E0D1
:102890000895CF93DF9300D000D01F92CDB7DEB75D
:1028A0000F900F900F900F900F90DF91CF910895A0
:1028B000CF93DF9300D000D000D0CDB7DEB72696FF
:1028C0000FB6F894DEBF0FBECDBFDF91CF91089554
:1028D0001F93CF93DF93C091790116E080917A0125
:1028E000C81799F0D0E01C9FF0011D9FF00D112436
:1028F000E558FE4F408151816281738184819581C9
:102900000E9458142196C770E9CFDF91CF911F9193
:1029100008954091AB015091AC016091AD0170916F
:10292000AE018091AF019091B0010C945814809148
:10293000B00182958F7009F054C08091AD01882359
:1029400009F44FC080917901A0917A016091AB01A7
:102950007091AC014091AE015091AF01B6E08A1781
:1029600009F43FC090E041155105C1F17F3F11F4DA
:102970006F3FA1F1B89FF001B99FF00D1124E55808
:10298000FE4F218172132AC02081621327C0228149
:10299000211124C0238134812417350710F42150DC
:1029A0003109241B350B283C3105C0F42091B001BE
:1029B0002F7020612093B00126E0289FF001299F0D
:1029C000F00D1124E058FE4F80818F70806180836C
:1029D0008BEA91E00E94DD100C94681401968770D8
:1029E000BECF0895CF92DF92EF92FF920F931F9385
:1029F000CF93DF93CDB7DEB762970FB6F894DEBF03
:102A00000FBECDBF8C0185E0F801DE011D9601905F
:102A10000D928A95E1F7D8014C9111965C9111972E
:102A200012966C9112971396CD90DC90149730917A
:102A3000AB017091AC018091AE019091AF01009714
:102A400009F46BC17F3F19F43F3F09F466C1E09080
:102A5000AD01EE2009F4C0C02091B001C816D9061E
:102A600028F0F601E81BF90BCF0104C08095909582
:102A70008C0D9D1DFF24F394883C910578F0F12C7A
:102A8000207F09F0C6C07C2DD98AC88A89890E9416
:102A900049148BEA91E00E94DD10B1C0822F807F43
:102AA00009F046C0751314C0341312C0611110C070
:102AB0002F7020612093B0010E9489148BEA91E06D
:102AC0000E94DD108091B001D80115968C932EC024
:102AD000CD2819F15F3F11F44F3FF9F0F62E611147
:102AE0001CC08091790120917A0136E0821709F4A7
:102AF0005AC090E0389FF001399FF00D1124E5583D
:102B0000FE4F7181571306C07081471303C0728155
:102B1000711103C001968770E9CFF62E662309F480
:102B200018C18091B00181608093B001F12C11C176
:102B3000751308C0341306C0611104C08091B00140
:102B4000D801C3C04D875E878D859E856A8B0E94A4
:102B500023146A898823E1F16623D1F12091B00121
:102B6000822F82958F7090E0029774F08091AB0174
:102B70009091AC0198878F831986DB86CA862C8753
:102B8000CE0107960E94DD1086E0F801ABEAB1E0C5
:102B900001900D928A95E1F70E9497140E94891482
:102BA000FF24F394D6C04D875E878D859E850E9455
:102BB0005319292F22952F7030E0223031050CF067
:102BC000BCC09F7009F0B6C0805E883008F4C1C0F8
:102BD000C8010E94DD10E4CFC816D90608F453C01E
:102BE000F601E81BF90BCF01883C910508F450C0B1
:102BF000F12C7C2DD98AC88A89890E944914EBEA74
:102C0000F1E086E0DF011D928A95E9F70E948914C0
:102C1000A0C0751314C0341312C0611110C080918C
:102C2000B001F8018583C8010E94DD1086E0EBEA5F
:102C3000F1E0DF011D928A95E9F7FE2C8AC04D87ED
:102C40005E878D859E856A8B0E9423146A898823FE
:102C500009F4BECF662309F4BBCF2091B001822FC7
:102C600082958F7090E002970CF48ECF8091AB012B
:102C70009091AC019A8389831B82DD82CC822E8362
:102C8000CE0101967FCF809590958C0D9D1DACCF88
:102C9000F62E662309F49CCF75132EC034132CC076
:102CA0002091B00120FD1FC0822F82958F70D9F036
:102CB000D80115962C9315978F3049F08F5F982F78
:102CC0009295907F822F8F70892B15968C93C801D7
:102CD0000E94DD1086E0F801ABEAB1E001900D92B0
:102CE0008A95E1F793CF86E0F801ABEAB1E0019075
:102CF0000D928A95E1F72DC04D875E878D859E8563
:102D00000E942314811140CF8091B0018160809393
:102D1000B001C8010E94DD101CC0662309F458CF21
:102D20004D875E878D859E850E942314882309F434
:102D30004FCF2ACF811148CF0CC0243031050CF081
:102D400047CF9F7009F440CFF8019581907F09F03B
:102D50003BCF8F2D62960FB6F894DEBF0FBECDBF6E
:102D6000DF91CF911F910F91FF90EF90DF90CF9067
:102D700008951F93CF93DF93CDB7DEB72C970FB68F
:102D8000F894DEBF0FBECDBF4F83588769877A871F
:102D90008B879C87CE0107960E94F214882369F0E6
:102DA0008F8198852A853B85232BF1F19F3F09F080
:102DB00063C08F3F09F060C037C086E0FE013796E0
:102DC000DE01119601900D928A95E1F76F81788569
:102DD000EA85FB85309741F17F3F11F46F3F21F188
:102DE00020917A0130E0C9010196877099274091BE
:102DF000790150E08417950709F447C069837A8305
:102E0000FD83EC8396E0929FD001939FB00D112437
:102E1000A558BE4FFE01319601900D929A95E1F7AB
:102E200080937A010E94681416E080917901909154
:102E30007A018917C1F1189FC001112485589E4F4E
:102E40000E94F214882379F1E09179011E9FF0012C
:102E50001124E558FE4F4081518162817381848144
:102E600095810E9458148091790190E001968770B5
:102E7000992780937901D9CF4F81588569857A85C3
:102E80008B859C850E945814CFCF0E941F141092EE
:102E90007A0110927901EBEAF1E086E0DF011D9200
:102EA0008A95E9F7C1CF2C960FB6F894DEBF0FBE16
:102EB000CDBFDF91CF911F910895EF92FF920F93B5
:102EC0001F93CF93DF938C01892B09F46CC0F12CF5
:102ED000EE24E394E8012196F8018491843740F4CC
:102EE000843008F051C0813081F0823019F15BC02C
:102EF000853709F444C0A8F19CE7980F903708F093
:102F000052C08F770E94801041C00E5F1F4FFE019C
:102F1000C49180E28C0F883048F4C7708E2D01C0B8
:102F2000880FCA95EAF70E94081A14C08C2F0E94D5
:102F3000B80F2DC00E5F1F4FFE01C49180E28C0FB1
:102F4000883058F4C7708E2D01C0880FCA95EAF7F3
:102F50000E940E1A0E942F1A1AC08C2F0E948010F5
:102F600016C00E5F1F4FFE01C491CC2381F08FE984
:102F70009FE00197F1F700C00000C150F6CF0E5F4F
:102F80001F4FFE01F49003C00E94B80F8E018F2DD9
:102F9000882309F49FCFEFE9FFE03197F1F700C0F4
:102FA00000008150F5CFDF91CF911F910F91FF90DD
:102FB000EF90089508956093B5017093B6018093E2
:102FC000B7019093B8010C940B140F931F930091C9
:102FD000B5011091B6012091B7013091B801DC0123
:102FE000CB01802B912BA22BB32B8093B501909317
:102FF000B601A093B701B093B8011F910F910C9443
:103000000B140F931F930091B5011091B6012091FD
:10301000B7013091B801DC01CB0180239123A223B9
:10302000B3238093B5019093B601A093B701B093F9
:10303000B8011F910F910C940B140F931F930091E3
:10304000B5011091B6012091B7013091B801DC01B2
:10305000CB0180279127A227B3278093B5019093B6
:10306000B601A093B701B093B8011F910F910C94D2
:103070000B141092B1011092B2011092B301109290
:10308000B4010C940B1441E050E060E070E004C027
:10309000440F551F661F771F8A95D2F74093B101E1
:1030A0005093B2016093B3017093B4010C940B146C
:1030B00041E050E060E070E004C0440F551F661F1F
:1030C000771F8A95D2F78091B1019091B201A091BA
:1030D000B301B091B401482B592B6A2B7B2B409341
:1030E000B1015093B2016093B3017093B4010C9499
:1030F0000B1441E050E060E070E004C0440F551F45
:10310000661F771F8A95D2F7409550956095709508
:103110008091B1019091B201A091B301B091B4013D
:10312000482359236A237B234093B1015093B20172
:103130006093B3017093B4010C940B1441E050E020
:1031400060E070E004C0440F551F661F771F8A952A
:10315000D2F78091B1019091B201A091B301B091E9
:10316000B401482759276A277B274093B101509320
:10317000B2016093B3017093B4010C940B140F93DC
:103180001F930091B1011091B2012091B3013091D0
:10319000B401DC01CB01802B912BA22BB32B8093AC
:1031A000B1019093B201A093B301B093B4011F9108
:1031B0000F910C940B140F931F930091B101109178
:1031C000B2012091B3013091B401DC01CB01802325
:1031D0009123A223B3238093B1019093B201A093D2
:1031E000B301B093B4011F910F910C940B140F9382
:1031F0001F930091B1011091B2012091B301309160
:10320000B401DC01CB0180279127A227B32780934B
:10321000B1019093B201A093B301B093B4011F9197
:103220000F910C940B140895CF92DF92EF92FF92BE
:103230000F931F93CF93DF938C01C090B501D09073
:10324000B601E090B701F090B8018091B101909182
:10325000B201A091B301B091B401C82AD92AEA2AD7
:10326000FB2ACFE1D0E0D701C6010C2E04C0B695F1
:10327000A795979587950A94D2F780FF06C0B80165
:103280008C2F0E94ED06019721F4219760F780E0D2
:1032900001C08C2FDF91CF911F910F91FF90EF9084
:1032A000DF90CF900895CF93DF93EC010E94141923
:1032B000BE010E94ED06DF91CF910895CB010E94DF
:1032C0005319089590910C01992321F090910D01CB
:1032D000911109C020910E0130910F01F901329630
:1032E0009FEF40E01FC0982F9695969596959F303A
:1032F00050F5E0910E01F0910F01E90FF11D87707B
:1033000021E030E0A90102C0440F551F8A95E2F781
:10331000CA019181892B818308959F3F39F04F5FC6
:103320004E3041F051915813F8CF0DC05111F7CFE5
:10333000942FF5CF9F3F39F0F901E90FF11D97FD6B
:10334000FA9582830895089590910C01992321F0B4
:1033500090910D01911109C020910E0130910F0142
:10336000F9013296205F3F4F1FC0982F9695969592
:1033700096959F30F0F4E0910E01F0910F01E90F66
:10338000F11D877021E030E0A90102C0440F551FF4
:103390008A95E2F7CA0180959181892381830895F6
:1033A0003196E217F30729F090819813F9CF108234
:1033B000F7CF089581E090E0E0910E01F0910F01C8
:1033C000E80FF91F1082019680319105A9F7089541
:1033D0009091CC01892B8093CC0108958095909198
:1033E000CC0189238093CC0108951092CC010895DB
:1033F0009091CB01892B8093CB010895809590917A
:10340000CB0189238093CB0108951092CB010895BD
:103410009091CA01892B8093CA010895809590915B
:10342000CA0189238093CA0108951092CA010895A0
:103430008093B90108951092B901089580910E0109
:1034400090910F01FC0131969C01205F3F4F80E07D
:10345000919191118F5FE217F307D1F70895E091F1
:103460000E01F0910F018091CC018083E0910E015B
:10347000F0910F0190818091CB01892B8083E091A5
:103480000E01F0910F0190818091CA01892B8083F8
:103490008091B901882361F0E0910E01F0910F0154
:1034A0009081892B80830E941E1A81111092B9018C
:1034B00080910E0190910F010C949B0ECF92DF92A0
:1034C000EF92FF926C01EE24FF24C114D104E104B9
:1034D000F10421F0C701B60120E101C020E0C72EB0
:1034E000D82EE92EFF24C114D104E104F10419F00F
:1034F000285FC701B6016B017C0154E0F694E794A4
:10350000D794C7945A95D1F7C114D104E104F104BA
:1035100019F02C5FC701B6016B017C0142E0F69403
:10352000E794D794C7944A95D1F7C114D104E10424
:10353000F10419F02E5FC701B601DC01CB01B6958D
:10354000A79597958795892B8A2B8B2B09F02F5F51
:10355000822FFF90EF90DF90CF9008958091E4014B
:10356000843021F11092CE0120E488E190E00FB682
:10357000F894A895809360000FBE2093600080E0CF
:103580000E94880783B7817F846083BF83B781608F
:1035900083BF7894889583B78E7F83BF88E10FB609
:1035A000F89480936000109260000FBE0895089513
:1035B0000895CF930E94D71A0E94B8030E94D81A88
:1035C000C0E08C2F0E94A604811104C0CF5FCE30D2
:1035D000C1F701C081E0CF9108950E941F140E949D
:1035E0008F0E0C94880782E084BD93E095BD9AEF1E
:1035F00097BD80936E0008952FB7F8948091CF0106
:103600009091D001A091D101B091D2012FBF089526
:10361000CF92DF92EF92FF920F931F932FB7F89400
:103620004091CF015091D0016091D1017091D201B0
:103630002FBF6A017B01EE24FF248C0120E030E0E3
:10364000C016D106E206F30610F4415051099A0162
:10365000281B390BC9011F910F91FF90EF90DF904C
:10366000CF9008951F920F920FB60F9211248F934F
:103670009F93AF93BF938091CF019091D001A09180
:10368000D101B091D2010196A11DB11D8093CF014E
:103690009093D001A093D101B093D201BF91AF918B
:1036A0009F918F910F900FBE0F901F9018950E94C1
:1036B0008C0BF8942FEF87EA91E6215080409040E0
:1036C000E1F700C0000087E090EBDC018093EE01A1
:1036D0009093EF01A093F001B093F1019CE088E199
:1036E0000FB6F894A895809360000FBE9093600089
:1036F000FFCFEF92FF920F931F93CF93DF93D82FBB
:10370000C0E08C2F0E94A60400E010E0E82EF12C0F
:10371000C701002E02C0959587950A94E2F780FDB7
:1037200006C00F5F1F4F0630110591F709C0602FCB
:103730007C2F80E00E94AE04D813F3CF81E004C058
:10374000CF5FCE30F1F680E0DF91CF911F910F91E6
:10375000FF90EF900895CF93C82F8CE20E94791BC1
:10376000882321F08C2FCF910C94791B80E0CF918E
:103770000895CF930E94001D811102C00E94E61C93
:10378000C5E6C15049F00E94B8038FE39CE9019758
:10379000F1F700C00000F5CF89E20E94AB1B811158
:1037A00013C18AE20E94AB1B81110E94E61C85E0D6
:1037B0000E94AB1B81110E94571B0E940B1D80931E
:1037C000CD0187E00E94AB1B8823A9F18BE10E9409
:1037D000AB1B882351F08091CD0181FB222720F97A
:1037E00091E0922790FB81F90EC08EE00E94AB1B06
:1037F000882361F08091CD0182FB222720F991E09E
:10380000922790FB82F98093CD0115C080E10E9440
:10381000AB1B9091CD01882341F093FB222720F927
:1038200081E0822780FB93F904C0892F809580FB7B
:1038300090F99093CD018091CD010E940F1D0E94BF
:103840001D1D8093ED0180EE0E94AB1B882341F08B
:103850008091ED01982F909590FB80F98093ED0178
:1038600089E30E94AB1B882359F08091ED0181FB15
:10387000222720F991E0922790FB81F98093ED01B6
:1038800082EE0E94AB1B882359F08091ED0182FBF0
:10389000222720F991E0922790FB82F98093ED0195
:1038A00086EE0E94AB1B882359F08091ED0183FBCB
:1038B000222720F991E0922790FB83F98093ED0174
:1038C00083EE0E94AB1B882359F08091ED0184FBAD
:1038D000222720F991E0922790FB84F98093ED0153
:1038E00085E30E94AB1B882359F08091ED0185FB95
:1038F000222720F991E0922790FB85F98093ED0132
:1039000081E30E94AB1B882359F08091ED0186FB77
:10391000222720F991E0922790FB86F98093ED0110
:1039200081E10E94AB1B882359F08091ED0187FB58
:10393000222720F991E0922790FB87F98093ED01EF
:103940008091ED010E94211D8091ED0187FB882768
:1039500080F980930D0187E20E94AB1BC82F8EE196
:103960000E94AB1B8111C2608FE10E94AB1B8111D1
:10397000C46080E20E94AB1B8111C86081E20E949A
:10398000AB1B8111C06182E20E94AB1B8111C0623E
:1039900083E20E94AB1B8111C06484E20E94AB1BD6
:1039A000882311F0C06802C0CC2329F08C2F0E941C
:1039B000181D6C2F03C00E94141D682F70E080E05A
:1039C00090E0CF910C94DB17CF9108956DEE7EEFD0
:1039D00080E090E00E94522360E082E090E00E944C
:1039E000402360E083E090E00E94402360E084E0B8
:1039F00090E00E94402360E085E090E00C9440233A
:103A000080E090E00E943A2321E08D3E9E4F09F035
:103A100020E0822F089582E090E00C943223682FFA
:103A200082E090E00C94402383E090E00C943223F9
:103A3000682F83E090E00C94402384E090E00C94A5
:103A40003223682F84E090E00C9440238091D501CC
:103A500080FF0BC06091130185E0689FB0011124C5
:103A600075956795759567952BC081FF09C0609125
:103A7000130185E0689FB00111247595679520C0FA
:103A800082FF07C06091130185E0689FB001112497
:103A900017C09091D6019923D1F060911201961729
:103AA00088F72091130185E0289F90011124929FAF
:103AB000A001939F500D112470E0CA010E940423BD
:103AC0006038710540F46115710539F002C065E098
:103AD00070E0862F08958FE7089581E00895809122
:103AE000D50180FF08C06091110170E07595679560
:103AF0007595679521C081FF06C06091110170E046
:103B00007595679519C082FF04C06091110170E03E
:103B100010C09091D6019923C1F0609110019617C1
:103B2000A0F780911101899FC001112470E00E94CB
:103B300004236038710528F46115710521F0862F82
:103B400008958FE7089581E0089561E070E0F4CF73
:103B5000803F21F40E94261D819504C0813F29F4F5
:103B60000E94261D8093D9010895823F21F40E946E
:103B7000261D819504C0833F29F40E94261D809351
:103B8000D8010895893F19F40E946F1D05C08A3F2E
:103B900031F40E946F1D81958093DA0108958B3F67
:103BA00021F40E946F1D819504C08C3F29F40E946E
:103BB0006F1D8093DB010895843F21F48091D7012C
:103BC000816017C0853F21F48091D701826011C0C8
:103BD000863F21F48091D70184600BC0873F21F498
:103BE0008091D701886005C0883F31F48091D7016A
:103BF00080618093D70108958D3F21F48091D50194
:103C000081600BC08E3F21F48091D501826005C098
:103C10008F3F29F48091D50184608093D501089568
:103C2000803F39F48091D90187FF6CC01092D9018F
:103C300069C0813F29F48091D9011816BCF362C094
:103C40009091D801823F29F497FF5CC01092D8016F
:103C500059C0833F19F41916CCF354C0893F41F47D
:103C60008091DA0118160CF04DC01092DA014AC0AA
:103C70008A3F29F48091DA0187FF44C0F6CF8B3F59
:103C800039F48091DB0187FF3DC01092DB013AC01F
:103C90008C3F29F48091DB011816BCF333C0843FBC
:103CA00021F48091D7018E7F17C0853F21F4809148
:103CB000D7018D7F11C0863F21F48091D7018B7F82
:103CC0000BC0873F21F48091D701877F05C0883FD3
:103CD00031F48091D7018F7E8093D70113C08D3F3F
:103CE00021F48091D5018E7F0BC08E3F21F480910D
:103CF000D5018D7F05C08F3F29F48091D5018B7F41
:103D00008093D5018091D80181110EC08091D90195
:103D100081110AC08091DA01811106C08091DB0116
:103D2000811102C01092D601089587ED91E00E94A2
:103D3000A60E0E94FC1A9093D4018093D30108959B
:103D40001F93CF93DF938091D3019091D4010E9470
:103D5000081BAC019091D601992321F02091140108
:103D600030E006C0209115018AE0289F90011124BF
:103D70004217530708F486C08091D801C091D90139
:103D8000D091DA011091DB01811107C0C11176C019
:103D9000D11174C0111172C075C09F3F19F09F5F9F
:103DA0009093D601181624F40E94261D8093D80102
:103DB0008091D80187FF05C00E94261D81958093C0
:103DC000D8011C1624F40E94261D8093D9018091ED
:103DD000D90187FF05C00E94261D81958093D901D6
:103DE0006091D801662339F1C091D901CC2319F132
:103DF000772767FD7095872F972F0E94152223E361
:103E000033E343E35FE30E9479220E94E22160935F
:103E1000D8016C2F772767FD7095872F972F0E9409
:103E2000152223E333E343E35FE30E9479220E94F8
:103E3000E2216093D9011D1624F40E946F1D809326
:103E4000DA018091DA0187FF05C00E946F1D81951C
:103E50008093DA01111624F40E946F1D8093DB0118
:103E60008091DB0187FF05C00E946F1D81958093C3
:103E7000DB01DF91CF911F910C94951E9F3F09F0BC
:103E80008ECF96CFDF91CF911F910895E7EDF1E0AE
:103E900085E0DF011D928A95E9F71092D601109214
:103EA000D5010895833081F128F4813059F08230B2
:103EB000D1F00895853009F449C0B8F1863009F48D
:103EC00056C0089580911501262F30E0280F311D2E
:103ED0002F3F310524F4680F6093150108958FEF8B
:103EE00080931501089580911401262F30E0280F4A
:103EF000311D2F3F310524F4680F6093140108959C
:103F00008FEF80931401089580911301262F30E0E4
:103F1000280F311D2F3F310524F4680F60931301E2
:103F200008958FEF80931301089580911201262F39
:103F300030E0280F311D2F3F310524F4680F6093C6
:103F4000120108958FEF809312010895809111015D
:103F5000262F30E0280F311D2F3F310524F4680F44
:103F60006093110108958FEF80931101089580915E
:103F70001001262F30E0280F311D2F3F310524F48A
:103F8000680F6093100108958FEF809310010895DA
:103F9000833011F128F4813049F0823091F0089596
:103FA000853081F120F18630C1F1089580911501AD
:103FB000681720F4861B809315010895109215014F
:103FC000089580911401681720F4861B80931401D2
:103FD000089510921401089580911301681720F438
:103FE000861B809313010895109213010895809108
:103FF0001201681720F4861B809312010895109215
:104000001201089580911101681720F4861B809396
:1040100011010895109211010895809110016817FF
:1040200020F4861B809310010895109210010895CA
:104030000F931F938D3109F46BC008F03FC08E3091
:1040400009F47FC0C0F4873009F469C068F4863091
:1040500009F0B1C08091CD01817F8E7F8093CD0129
:1040600081E08093DD01A8C0883009F4A2C08B30C4
:1040700009F49FC0A0C0863109F49BC078F4803158
:1040800009F472C0813109F096C00E941F1490910A
:104090000D0181E0892780930D018BC0893109F4DE
:1040A00088C08B3109F087C08091CD0181FB222728
:1040B00020F991E0922790FB81F94CC0853309F4F7
:1040C00070C048F4873209F46CC008F459C08932D2
:1040D00009F467C070C0833438F48A3308F04EC0E6
:1040E000883309F466C067C0833409F45AC0883441
:1040F00009F061C00E941F140FEF13ED20E301507F
:1041000010402040E1F700C000000E94571B51C042
:104110000E949C210E948F0E0E9488074AC09091A5
:10412000CD01892F8095817080FB90F929F09660F0
:1041300098609093CD0140C0997F977F9093CD0177
:1041400038C08091CD0182FB222720F991E092278F
:1041500090FB82F98093CD01992359F18091CD0193
:1041600081608093CD0125C08091CD0183FB222702
:1041700020F991E0922790FB83F9ECCF895301C09D
:104180008D5141E050E060E070E08A019B0104C085
:10419000000F111F221F331F8A95D2F7C901B801E2
:1041A00004C061E070E080E090E00E94DB170E94B4
:1041B0001F1481E001C080E01F910F91089580E0FD
:1041C000089580E00895CF93C82F8091DD0181305C
:1041D00079F018F08230E9F187C0E0910E01F0919A
:1041E0000F018081813169F0823209F07FC009C0FE
:1041F000E0910E01F0910F018081813111F0823246
:1042000061F48C2F0E94DF20811104C08C2F0E944A
:1042100018201DC081E090E01AC08C2F0E94E12080
:10422000811114C0C43179F048F4CB3079F0C03139
:1042300009F060C082E08093DD0108C0C93219F046
:10424000C83321F057C01092DD0154C081E0817065
:1042500053C0C93289F118F5C43171F1A8F4C730DF
:1042600009F046C08AE08093150194E1909314010F
:1042700093E0909313018093120188E080931101E1
:1042800088E28093100134C0CE51C63088F5EC2FFF
:10429000F0E0E65DFE4F80818093DC0129C0CE34E2
:1042A000E9F020F4CB3421F56AE013C0C13579F090
:1042B000C235F1F461E00DC08091DC01882319F072
:1042C0001092DC0115C081E08093DD0115C061E032
:1042D00006C08091DC010E94521F0AC06AE08091F2
:1042E000DC010E94C81F04C01092DD0180E004C000
:1042F00081E002C080E0ABCFCF910895E1E8F0E02B
:104300008081886080838081816080838FB7F8940A
:1043100093E09093890090ED909388008FBF08956B
:10432000EFE6F0E08081826080830895EFE6F0E0C0
:1043300080818D7F80830895EFE6F0E0908182E0B8
:104340008927808308951F920F920FB60F92112430
:104350002F933F934F935F936F937F938F939F938D
:10436000AF93BF93EF93FF938091DE019091DF01B4
:1043700001969093DF018093DE01811103C082E0FA
:104380000E948807E091DF01E695E695F0E0E252B1
:10439000FC4FE4918091DE018E1303C080E00E9407
:1043A0008807FF91EF91BF91AF919F918F917F917E
:1043B0006F915F914F913F912F910F900FBE0F9092
:1043C0001F90189504D06894B1118DC0089570D0D5
:1043D00088F09F5790F0B92F9927B751A0F0D1F0EE
:1043E000660F771F881F991F1AF0BA95C9F712C078
:1043F000B13081F077D0B1E0089574C0672F782F85
:104400008827B85F39F0B93FCCF3869577956795E3
:10441000B395D9F73EF490958095709561957F4F4F
:104420008F4F9F4F0895E89409C097FB3EF49095F5
:104430008095709561957F4F8F4F9F4F9923A9F07D
:10444000F92F96E9BB279395F6958795779567950C
:10445000B795F111F8CFFAF4BB0F11F460FF1BC050
:104460006F5F7F4F8F4F9F4F16C0882311F096E9E3
:1044700011C0772321F09EE8872F762F05C0662391
:1044800071F096E8862F70E060E02AF09A95660F4A
:10449000771F881FDAF7880F9695879597F9089503
:1044A00057FD9058440F551F59F05F3F71F04795E5
:1044B000880F97FB991F61F09F3F79F087950895CA
:1044C000121613061406551FF2CF4695F1DF08C0E9
:1044D000161617061806991FF1CF86957105610506
:1044E00008940895E894BB2766277727CB0197F9AE
:1044F00008950BD078C069D028F06ED018F09523BD
:1045000009F05AC05FC01124EECFCADFA0F3959F17
:10451000D1F3950F50E0551F629FF001729FBB27AA
:10452000F00DB11D639FAA27F00DB11DAA1F649F56
:104530006627B00DA11D661F829F2227B00DA11D09
:10454000621F739FB00DA11D621F839FA00D611D8F
:10455000221F749F3327A00D611D231F849F600DB0
:10456000211D822F762F6A2F11249F5750408AF0E9
:10457000E1F088234AF0EE0FFF1FBB1F661F771F75
:10458000881F91505040A9F79E3F510570F014C00C
:10459000AACF5F3FECF3983EDCF38695779567955D
:1045A000B795F795E7959F5FC1F7FE2B880F911D93
:1045B0009695879597F9089597F99F6780E870E039
:1045C00060E008959FEF80EC089500240A94161689
:1045D000170618060906089500240A9412161306F1
:1045E000140605060895092E0394000C11F488237F
:1045F00052F0BB0F40F4BF2B11F460FF04C06F5F9B
:104600007F4F8F4F9F4F089597FB072E16F400940E
:1046100007D077FD09D00E941E2307FC05D03EF489
:10462000909581959F4F0895709561957F4F08955E
:10463000EE0FFF1F0590F491E02D0994AA1BBB1B00
:1046400051E107C0AA1FBB1FA617B70710F0A61B92
:10465000B70B881F991F5A95A9F780959095BC01B3
:10466000CD010895F999FECF92BD81BDF89A9927A1
:1046700080B50895A8E1B0E042E050E00C945A23E0
:10468000262FF999FECF92BD81BDF89A019700B40B
:10469000021639F01FBA20BD0FB6F894FA9AF99AAB
:1046A0000FBE08950196272F0E9441230C944023AA
:1046B000DC01CB01FC01F999FECF06C0F2BDE1BDE2
:1046C000F89A319600B40D9241505040B8F70895D1
:0446D000F894FFCF8C
:1046D40020028A071808F507C1078D070101BA01EE
:1046E40028080A03140A3F4D36399F0352031C035A
:1046F400E30276028F02A802C10201020304050646
:044704000708090099
:00000001FF

@ -0,0 +1,6 @@
# ergodox_keymap
Based on the default Ergodox EZ firmware
Replaced the left side Bksp with a Crtl/Esc, this really helps in vim.
Removed the Ctrls from the Z and / keys.

@ -0,0 +1,187 @@
// Based on `default_osx`
// Replace left Bksp with Ctrl/Esc
// Remove the Ctrl from Z and /
#include "ergodox_ez.h"
#include "debug.h"
#include "action_layer.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 | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* |Ctrl/Esc| A | S | D | F | G |------| |------| H | J | K | L |; / L2| LGui |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | App | LGui | | Alt |Ctrl/Esc|
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Space|Backsp|------| |------| Tab |Enter |
* | |ace | 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, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(1),
CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, 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,
ALT_T(KC_APP), KC_LGUI,
KC_HOME,
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,
KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT),
MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, 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_ENT
),
/* 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
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;
}
};

@ -0,0 +1,1152 @@
:100000000C9465020C94A9020C94A9020C94A90208
:100010000C94A9020C94A9020C94A9020C94A902B4
:100020000C94A9020C94A9020C94720C0C94440D2B
:100030000C94A9020C94A9020C94A9020C94A90294
:100040000C94A9020C940E220C94A9020C94A902FF
:100050000C94A9020C949D1B0C94A9020C94A90267
:100060000C94A9020C94A9020C94A9020C94A90264
:100070000C94A9020C94A9020C94A9020C94A90254
:100080000C94A9020C94A9020C94A9020C94A90244
:100090000C94A9020C94A9020C94A9020C94A90234
:1000A0000C94A9020C94A9020C94A902B10DD30DD1
:1000B000C10ED30DC10E180E3B0EC10E900EA30E35
:1000C0008F118F11CC11CC110F124D1266146614C2
:1000D00066126614671367133A1466146614511493
:1000E0000000F0A12E004C002971E10035810000D4
:1000F0001E00140004001D0034004D001F001A00F3
:1001000016001B00E1042A0020000800070006007A
:1001100050002C0021001500090019004F004A0072
:10012000220017000A000500000065745000015409
:100130000000007F0000E3004F0001540000007742
:100140000000E20023001C000B00110000002971D8
:10015000240018000D00100052004B0025000C0078
:100160000E00360051002800260012000F00370054
:100170002F002B00270013003382380030004E0080
:100180002D0031003478E500C100000001000100BD
:1001900001000100010000003A001E0220022202BC
:1001A000010001003B001F022102230201000100A7
:1001B0003C002F0226022F00010001003D0030020A
:1001C00027023000010001003E00310235003502F7
:1001D000000001000100010000000100000001001A
:1001E0000100010000000100000001003F0052007A
:1001F00051002402000001004000240021001E00E4
:10020000010001004100250022001F00370001000D
:1002100042002600230020002700010043002502A1
:100220002E0231002E0001004400450001000100B3
:1002300001000000010001000100010001000000B8
:1002400001000100010001000100010001000100A6
:10025000F2000100010001000100F000F1000100C6
:10026000F400010001000100F3000100F5000100AD
:100270000100010001000100000001000100010077
:100280000000010000000100010001000000010069
:100290000000010001000100010001000000010058
:1002A0000100010001000100A9000100010001009E
:1002B0000100AC00AA00B600010001000100AB0083
:1002C000A80001000100010001000100010001007F
:1002D00001000100AE00010001000000160345000E
:1002E000720067006F0044006F0078002000450036
:1002F0005A00000016034500720067006F004400BA
:100300006F007800200045005A0000000403090433
:1003100009026D00040100A0FA09040000010301B4
:100320000100092111010001223F00070581030896
:10033000000A090401000103010200092111010062
:1003400001224D000705820308000A09040200018A
:100350000300000009211101000122360007058376
:100360000308000A09040300010300000009211129
:100370000100012239000705840310000112011059
:100380000100000008EDFE07130100010200010555
:10039000010906A101050719E029E71500250195C6
:1003A0000875018102050819012905950575019156
:1003B000029501750391010507190029771500259C
:1003C00001957875018102C005010980A1018502AE
:1003D00016010026B7001A01002AB7007510950112
:1003E0008100C0050C0901A1018503160100269CAE
:1003F000021A01002A9C02751095018100C00501B6
:100400000902A1010901A100050919012905150029
:10041000250195057501810295017503810105018D
:10042000093009311581257F950275088106093843
:100430001581257F950175088106050C0A3802157E
:1004400081257F950175088106C0C005010906A1B7
:1004500001050719E029E7150025019508750181B7
:100460000295017508810105081901290595057591
:100470000191029501750391010507190029FF15E6
:100480000025FF950675088100C0000000000000EF
:100490000000000000010204060A0F17202C3A4A4F
:1004A0005D71879DB3C7DAE9F5FCFFFCF5E9DAC7B2
:1004B000B39D87715D4A3A2C20170F0A060402018A
:1004C0000000000000000000000011241FBECFEF5C
:1004D000DAE0DEBFCDBF04B603FE24C08091EE019A
:1004E0009091EF01A091F001B091F1018730904B14
:1004F000A740B04BB9F41092EE011092EF011092A8
:10050000F0011092F10114BE84B7877F84BF88E1A7
:100510000FB6F89480936000109260000FBEE0E088
:10052000FFE3099511E0A0E0B1E0EAEAF7E402C0D8
:1005300005900D92A433B107D9F711E0A4E3B1E01F
:1005400001C01D92AE3EB107E1F70E94B6090C94BE
:10055000D3230C94000061110BC0FC01828188231D
:1005600021F085EE0E94231003C085EE0E94EB105F
:1005700080E090E0089508956091B1017091B2011A
:100580008091B3019091B4010E94C91A56985E9867
:1005900025982D9826982E9827982F98813019F015
:1005A000823021F00895259A2D9A0895269A2E9A40
:1005B00008950C94BC0256985E9825982D9826981C
:1005C0002E9827982F988FEF90E090938900809332
:1005D000880090938B0080938A0090938D00809385
:1005E0008C00259A2D9A2FEF80E792E021508040D1
:1005F0009040E1F700C00000269A2E9A2FEF80E786
:1006000092E0215080409040E1F700C00000279A1E
:100610002F9A2FEF80E792E0215080409040E1F741
:1006200000C0000025982D982FEF80E792E0215020
:1006300080409040E1F700C0000026982E982FEFF0
:1006400080E792E0215080409040E1F700C0000038
:1006500027982F9856985E9825982D9826982E982A
:1006600027982F98089589EA8093800089E08093E5
:10067000810024982C983F988AB18F748AB96E981B
:10068000479A8BB1806B8BB9769A0E94DB020C94EF
:10069000BB0280E2809300018091340181110EC081
:1006A0000E94980381E0809334012FEF83ED90E363
:1006B000215080409040E1F700C0000080E40E949B
:1006C0009E038093000181112EC00E94C803809375
:1006D0000001811128C00E94C8038093000181118C
:1006E00022C08FE30E94C8038093000181111BC0C8
:1006F0000E94C00380E40E949E0380930001811148
:1007000012C08CE00E94C8038093000181110BC0CD
:100710000E94C80380930001811105C08FE30E94ED
:10072000C803809300010E94C003809100010895D6
:100730001092B9008AE08093B800089594EA9093EB
:10074000BC009091BC0097FFFCCF9091B900987FBE
:10075000983021F0903111F081E008958093BB0032
:1007600084E88093BC008091BC0087FFFCCF80911F
:10077000B900887F883111F0803471F780E00895E6
:1007800084E98093BC008091BC0084FDFCCF089577
:100790008093BB0084E88093BC008091BC0087FFFD
:1007A000FCCF9091B900987F81E0983209F480E005
:1007B000089584E88093BC008091BC0087FFFCCF43
:1007C0008091BB00089580910001811115C080E4E3
:1007D0000E949E038093000181110CC082E10E945F
:1007E000C80380930001811105C08FEF0E94C803E8
:1007F000809300010E94C00384B1807F84B985B1D9
:10080000807F85B98AB1837F8AB98BB1837F8BB9A9
:100810003E98469808950E944903809300010E94E3
:10082000E30380B38C7080BB81B3836F81BBA6E38D
:10083000B1E0E4E4F1E08EE08E0F11921D928E1390
:10084000FCCF0C943303BF92CF92DF92EF92FF92D2
:100850000F931F93CF93DF9380910001882379F04A
:10086000809135018F5F80933501811108C00E940E
:10087000490380930001811102C00E94DB0206E35C
:1008800011E0C0E0D0E0DD24D39482E0C82EEE2455
:10089000E394F12CC730D10500F58091000181115E
:1008A00064C080E40E949E0380930001811112C005
:1008B00082E10E94C8038093000181110BC0C7012F
:1008C0000C2E01C0880F0A94EAF780950E94C80395
:1008D000809300010E94C00348C0CA30A1F028F4F0
:1008E000C83059F0C93061F005C0CC3089F070F0E3
:1008F000CD3089F0209A289810C0219A29980DC0EF
:10090000229A2A980AC0239A2B9807C0529A01C0AB
:10091000539A5B9802C03E9A469890EA9A95F1F7EE
:100920009FB1799902C082E001C080E091709D255D
:10093000982B7C9902C084E001C080E0892B7D99CE
:1009400002C038E001C030E0832B7E9902C020E174
:1009500001C020E0822B9FB19095991F9927991F84
:100960009295990F907E892B0FC080910001811183
:1009700049C080E40E949E0380930001882379F19E
:10098000B12C0E94C0038B2DF8019081981719F0AB
:100990008083C09201010E94E30321960F5F1F4FE5
:1009A000CE30D10509F076CF80910101882361F125
:1009B000815080930101882339F08FE99FE00197EE
:1009C000F1F700C0000020C0A4E4B1E0E6E3F1E0EC
:1009D000CF01825F91919D938E13FCCF15C083E16F
:1009E0000E94C803809300018111CACF81E40E9454
:1009F0009E03809300018111C3CF0E94D903B82EBA
:100A0000B094BFCF80E0C0CF0E94D90281E0DF91D7
:100A1000CF911F910F91FF90EF90DF90CF90BF90FB
:100A20000895E82FF0E0EC5BFE4F80810895089573
:100A3000089596E0799FF001112494E5899FE00DD7
:100A4000F11D1124E60FF11DEE0FFF1FEC51FF4FBA
:100A5000859194910895880F991FFC01E05AF04008
:100A6000859194910895880F991FFC01E052FF4FE2
:100A70008591949108950F931F93CF93DF93EC0189
:100A80008115904350F5C11580E2D80708F0B3C036
:100A9000CB3BD10590F4C83AD10508F05AC0C53A0D
:100AA000D10508F04BC0C430D10508F0BBC1219777
:100AB00009F0B5C101E010E0F5C1CF3FD10511F05B
:100AC00008F0B0C1C03FD10508F092C0CE01805EF1
:100AD0009109089708F4A6C1A2C1C11591E5D907EB
:100AE000A8F4C23020E5D20708F09EC0C11580E509
:100AF000D80709F485C008F091C0C11520E4D207D9
:100B000008F08DC1DD278E01106CCCC1C11580E8C5
:100B1000D80758F4C11590E7D90708F07CC1C11572
:100B200020E6D20708F422C17AC1C11580E9D807AE
:100B300008F075C1DF708E01106AB4C1C53AD105E5
:100B400009F472C1C63AD10509F071C102E810E496
:100B5000A9C1C83AD10509F46DC1C93AD10509F452
:100B60006CC1CA3AD10509F46BC1CB3AD10509F47D
:100B70006AC1CC3AD10509F469C1CD3AD10509F46D
:100B800068C1C03BD10509F467C1CE3AD10509F46B
:100B900066C1CF3AD10509F465C1C13BD10509F45D
:100BA00064C1C23BD10509F463C1C33BD10509F45B
:100BB00062C1C43BD10509F461C1C53BD10509F44B
:100BC00060C1C63BD10509F45FC1C73BD10509F43B
:100BD0005EC1C83BD10509F45DC1C93BD10509F42B
:100BE0005CC1CA3BD10509F45BC100E014E45AC101
:100BF0008E01106557C1CE019F700E94330553C10D
:100C00000E948A149FEF24E38CE0915020408040A2
:100C1000E1F700C000000E94C21B44C18091CD01D9
:100C200081608093CD013EC10E946B1D811102C085
:100C30000E94511D0E94881D90E09093EE018093C8
:100C4000ED01C23090E5D90721F48091ED0181607A
:100C500086C0C43020E5D20721F48091ED01826086
:100C60007EC0C63080E5D80721F48091ED01846014
:100C700076C0C83090E5D90719F48091ED0127C0FE
:100C8000CA3020E5D20721F48091ED01806167C070
:100C9000CC3080E5D80721F48091ED0180625FC0FF
:100CA000CE3090E5D90721F48091ED01806457C0E2
:100CB000C03120E5D20721F48091ED0180684FC05A
:100CC000C23180E5D80729F48091ED018460886005
:100CD00046C0C33090E5D90721F48091ED018E7FA5
:100CE0003EC0C53020E5D20721F48091ED018D7F13
:100CF00036C0C73080E5D80721F48091ED018B7FA5
:100D00002EC0C93090E5D90719F48091ED0126C0B5
:100D1000CB3020E5D20721F48091ED018F7E1FC0FA
:100D2000CD3080E5D80721F48091ED018F7D17C08B
:100D3000CF3090E5D90721F48091ED018F7B0FC072
:100D4000C13120E5D20721F48091ED018F7707C0F2
:100D5000C331D04531F48091ED018B7F877F809343
:100D6000ED018091ED010E948C1D9CC08D2F992773
:100D70008F70992781309105D9F49E012370332714
:100D800002C0880F991F2A95E2F79C688E0144E003
:100D9000000F111F4A95E1F700271370802B912B4C
:100DA00053E0CC0FDD1F5A95E1F7C076DD272FC049
:100DB0008230910531F4DC2FCC278E01016F106A4F
:100DC00071C08330910569F4CE018370992701E0E9
:100DD00010E002C0000F111F8A95E2F7C8019C685D
:100DE0000FC0049709F05EC0CE018370992701E01F
:100DF00010E002C0000F111F8A95E2F7C8019A683F
:100E000023E0CC0FDD1F2A95E1F7C07ED7708C015F
:100E10000C2B1D2B47C0DF708E01106243C000E019
:100E200010E040C08E013EC001E810E43BC003E882
:100E300010E438C002EE14E435C009EE14E432C008
:100E40000AEE14E42FC005EB14E42CC006EB14E406
:100E500029C007EB14E426C00CEC14E423C00DEC0D
:100E600014E420C003E815E41DC00AE815E41AC024
:100E700002E915E417C004E915E414C001E216E420
:100E800011C003E216E40EC004E216E40BC005E252
:100E900016E408C006E216E405C007E216E402C044
:100EA0000AE216E4C801DF91CF911F910F910895D6
:100EB00096E0799FF001112494E5899FE00DF11DE2
:100EC0001124E60FF11DEE0FFF1FEC51FF4F85912E
:100ED0009491803E9105E0F4803C910558F5813372
:100EE000910509F46FC048F48932910509F463C093
:100EF0008A32910509F46DC072C089339105E9F019
:100F000082389105D1F08533910509F44DC067C051
:100F1000833E910581F138F4803E9105B9F0823E1F
:100F20009105D9F05CC0863E910561F1873E91053F
:100F3000A1F155C00E942B0508952091ED0120FDDF
:100F400002C021FF4CC080EE90E049C08091ED01CD
:100F500080FFF9CF89E390E042C08091ED0182FFEC
:100F60000EC08091ED0184FF03C080E090E037C0A7
:100F700083EE90E034C08091ED0182FFF2CF82EEEB
:100F800090E02DC08091ED0183FF0BC08091ED01B9
:100F900084FDEBCF87EE90E022C08091ED0183FFCE
:100FA000F5CF86EE90E01BC08091ED0185FF07C074
:100FB00089E290E014C08091ED0185FFF9CF85E3CF
:100FC00090E00DC08091ED0186FF07C08AE290E0BD
:100FD00006C08091ED0186FFF9CF81E390E00E9489
:100FE0003B05089508950C94F207809162010895DD
:100FF000CF93DF9300D01F92CDB7DEB79C018091D5
:10100000E401843019F593E099833B832A8390931C
:10101000E9008FEF9091E800815095FD06C095EDB5
:101020009A95F1F700008111F5CF8091E80085FFD6
:101030000DC040E050E063E070E0CE0101960E94F8
:10104000620A8091E8008E778093E8000F900F90FD
:101050000F90DF91CF910895CF93DF9300D01F922F
:10106000CDB7DEB72091E401243021F522E02983B9
:101070009B838A8383E08093E9008FEF9091E8005F
:10108000815095FD06C095ED9A95F1F7000081110C
:10109000F5CF8091E80085FF0DC040E050E063E0AF
:1010A00070E0CE0101960E94620A8091E8008E777E
:1010B0008093E8000F900F900F90DF91CF910895EB
:1010C0002091E4012430F1F422E02093E9002FEF95
:1010D0003091E800215035FD06C035ED3A95F1F725
:1010E00000002111F5CF2091E80025FF0BC040E062
:1010F00050E065E070E00E94620A8091E8008E771F
:101100008093E8000895CF93DF93EC019091E40180
:10111000943009F046C080910C018823D9F0809169
:101120000D018823B9F09093E9008FEF9091E800CA
:10113000815095FD06C095E19A95F1F70000811167
:10114000F5CF8091E80085FF2CC040E050E060E1E1
:1011500070E017C081E08093E9008FEF9091E80084
:10116000815095FD06C095ED9A95F1F7000081112B
:10117000F5CF8091E80085FF14C040E050E068E0C2
:1011800070E0CE010E94620A8091E8008E77809321
:10119000E80080E1FE01A2E5B1E001900D928A95A0
:1011A000E1F7DF91CF9108958091E301811109C0AA
:1011B0000E94F70B0E94540C8091E200846080939F
:1011C000E20008951092E301089508950C94FB2124
:1011D0000E94581B0E9401220E94FA0E0C94F307F1
:1011E00042E061EC81E00E94710B42E061EC82E040
:1011F0000E94710B42E061EC83E00E94710B42E1BE
:1012000061EC84E00C94710B8091E601833009F469
:1012100055C030F4813071F0823009F48EC00895E9
:101220008A3009F47AC08B3009F460C0893009F043
:101230009CC020C08091E501813A09F096C0809160
:10124000E800877F8093E8008091E9019091EA01AE
:10125000892B21F460E182E591E003C060E080E049
:1012600090E070E00E94AD0A8091E8008B77809357
:10127000E80008958091E501813209F076C08091FF
:10128000E9019091EA01009719F0039709F06DC008
:101290008091E800877F8093E8008091E80082FDDC
:1012A00005C08091E4018111F8CF5FC08091F10009
:1012B000809362018091E8008B7753C08091E501B3
:1012C000813A09F052C08091E9019091EA01892B9D
:1012D00009F04BC08091E800877F8093E8008091FF
:1012E000E80080FFFCCF80910C0136C08091E501C1
:1012F0008132D9F58091E9019091EA01892BA9F514
:101300008091E800877F8093E8000E94A60B80917F
:10131000E70180930C010C948A148091E5018132DD
:1013200021F58091E800877F8093E8000E94A60B5A
:101330008091E8018093630108958091E501813AED
:10134000A1F48091E800877F8093E8008091E80015
:1013500080FFFCCF809163018093F1008091E800D1
:101360008E778093E8000C94A60B089584B7877F4E
:1013700084BF88E10FB6F8948093600010926000FB
:101380000FBE90E080E80FB6F894809361009093D0
:1013900061000FBE0E94490F0E94F70B0E94540C7F
:1013A0008091E20084608093E20078940E94DA0EDB
:1013B0000E944B0F82E091E00E94F50E0E94E9210D
:1013C0008091E401853069F40E94191B8091E2014B
:1013D0008823B1F30E94441B882391F30E944C0A96
:1013E000EFCF0E94510FECCF292F33272330310547
:1013F000C9F064F42130310581F02230310509F063
:1014000043C08DE690E020E133E042C02132310557
:10141000F1F02232310541F137C082E190E02DE751
:1014200033E036C099278130910541F08230910533
:1014300041F0892B49F5ECE0F3E005C0E4EFF2E080
:1014400002C0ECEDF2E0849190E09F0121C0643095
:10145000D8F4E62FF0E0EE0FFF1FEE5DFE4F208187
:10146000318189E090E014C0643070F470E0FB01D9
:10147000EE0FFF1FE65EFE4F20813181FB01EA5E29
:10148000FE4F808190E004C080E090E020E030E0FA
:10149000FA0131832083089580E189BD82E189BD0D
:1014A00009B400FEFDCF8091D8008F7D8093D800D5
:1014B0008091E00082608093E0008091E00081FDF7
:1014C000FCCF0895CF92DF92EF92FF920F931F937C
:1014D000CF93DF93EC018B016A010E94C50B811150
:1014E00033C0C114D10439F0F60180819181081B09
:1014F000190BC80FD91FE12CF12C0115110519F199
:101500008091E80085FD16C08091E8008E77809379
:10151000E800C114D10449F0F60180819181E80E00
:10152000F91EF182E08285E00FC00E94C50B88237E
:1015300021F30AC089918093F10001501109FFEF56
:10154000EF1AFF0ADACF80E0DF91CF911F910F9160
:10155000FF90EF90DF90CF9008952091EB013091B4
:10156000EC012617370748F06115710539F4209111
:10157000E8002E772093E80001C0B90140E0611532
:101580007105A9F12091E401222309F443C025301B
:1015900009F442C02091E80023FD40C02091E800FA
:1015A00022FD32C02091E80020FFE9CF4091F300F6
:1015B0002091F20030E0342BFC01CF016115710560
:1015C00059F02830310540F481918093F100615049
:1015D00071092F5F3F4FF1CF41E02830310509F00D
:1015E00040E02091E8002E772093E800C8CF411119
:1015F000C9CF0AC08091E401882361F0853061F091
:101600008091E80083FD0AC08091E80082FFF2CF5C
:1016100080E0089582E0089583E0089581E00895D0
:101620002091EB013091EC012617370748F0611546
:10163000710539F42091E8002E772093E80001C06D
:10164000B901FC0120E06115710591F18091E4017F
:10165000882309F440C0853009F43FC08091E80038
:1016600083FD3DC08091E80082FD2FC08091E8009D
:1016700080FFE9CF2091F3008091F20090E0922B5F
:101680006115710559F08830910540F4249120933B
:10169000F1003196615071090196F2CF21E008976F
:1016A00009F020E08091E8008E778093E800CBCFAE
:1016B0002111CCCF0AC08091E401882361F08530EC
:1016C00061F08091E80083FD0AC08091E80082FF0C
:1016D000F2CF80E0089582E0089583E0089581E0EC
:1016E0000895982F973058F59093E900981739F09E
:1016F0007091EC002091ED005091F00003C0242F78
:10170000762F50E021FF19C03091EB003E7F3093DF
:10171000EB003091ED003D7F3093ED003091EB0018
:1017200031603093EB007093EC002093ED00509308
:10173000F0002091EE0027FF07C09F5FD3CF8F708E
:101740008093E90081E0089580E008958091E501AB
:1017500087FF11C08091E80082FD05C08091E401FF
:101760008111F8CF11C08091E8008B770BC0809178
:10177000E401882349F08091E80080FFF8CF809150
:10178000E8008E778093E80008952091E40030917E
:10179000E50095E64091EC00842F817040FF22C067
:1017A0008091E80080FD1CC08091E401882391F0C5
:1017B000853091F08091EB0085FD10C04091E400F0
:1017C0005091E5004217530729F39A01915011F700
:1017D00084E0089582E0089583E0089581E008950B
:1017E00080E008954091E80042FFDECF08950E9416
:1017F000650C0E946D0CE0EEF0E0808181608083DA
:10180000E8EDF0E080818F77808319BCA7EDB0E030
:101810008C918E7F8C9380818F7E80831092E301E8
:1018200008950F931F93CF93DF930E94650C0E943E
:101830006D0CC8EDD0E088818F77888388818068BF
:10184000888388818F7D888319BC1092E40110926F
:10185000E0011092E2011092E10100EE10E0F801C7
:1018600080818B7F808388818160888342E060E013
:1018700080E00E94710BE1EEF0E080818E7F80833A
:10188000E2EEF0E0808181608083808188608083E7
:10189000F80180818E7F8083888180618883DF91D9
:1018A000CF911F910F910895E8EDF0E080818F7E38
:1018B0008083E7EDF0E080818160808384E082BFF7
:1018C00081E08093E3010C94110CE8EDF0E080815D
:1018D0008E7F80831092E20008951092DA001092B9
:1018E000E10008951F920F920FB60F9211242F93CB
:1018F0003F934F935F936F937F938F939F93AF9398
:10190000BF93EF93FF938091E10082FF0BC0809122
:10191000E20082FF07C08091E1008B7F8093E100AD
:101920000E94D90E8091DA0080FF1FC08091D800FC
:1019300080FF1BC08091DA008E7F8093DA00809157
:10194000D90080FF0DC080E189BD82E189BD09B465
:1019500000FEFDCF81E08093E4010E94D40805C021
:1019600019BC1092E4010E94E2088091E10080FF1E
:1019700019C08091E20080FF15C08091E2008E7F47
:101980008093E2008091E20080618093E200809188
:10199000D80080628093D80019BC85E08093E40170
:1019A0000E94E6088091E10084FF30C08091E2004F
:1019B00084FF2CC080E189BD82E189BD09B400FEAD
:1019C000FDCF8091D8008F7D8093D8008091E10079
:1019D0008F7E8093E1008091E2008F7E8093E20011
:1019E0008091E20081608093E2008091E001882391
:1019F00011F084E007C08091E30087FD02C081E020
:101A000001C083E08093E4010E94E8088091E10036
:101A100083FF29C08091E20083FF25C08091E1000F
:101A2000877F8093E10082E08093E4011092E001DF
:101A30008091E1008E7F8093E1008091E2008E7FB3
:101A40008093E2008091E20080618093E20042E0B6
:101A500060E080E00E94710B8091F00088608093CC
:101A6000F0000E94E508FF91EF91BF91AF919F9127
:101A70008F917F916F915F914F913F912F910F9037
:101A80000FBE0F901F9018951F920F920FB60F92D6
:101A900011242F933F934F935F936F937F938F9373
:101AA0009F93AF93BF93CF93DF93EF93FF93C09137
:101AB000E900CF708091EC00D82FD17080FDD0E884
:101AC0001092E9008091F000877F8093F000789475
:101AD0000E94880D1092E9008091F0008860809348
:101AE000F000CD2BCF70C093E900FF91EF91DF9113
:101AF000CF91BF91AF919F918F917F916F915F91A6
:101B00004F913F912F910F900FBE0F901F901895FE
:101B10001F93CF93DF93CDB7DEB7AA970FB6F89494
:101B2000DEBF0FBECDBFE5EEF1E088E08E0F9091F5
:101B3000F10091938E13FBCF0E9404098091E8007D
:101B400083FF1FC18091E5019091E601492F50E08C
:101B50004A30510508F015C1FA01EA5AFF4F0C94BA
:101B60008323803881F0823809F00BC18091E9012C
:101B70008F708093E9008091EB0085FB882780F9C6
:101B80001092E90006C08091E1019091E20191116B
:101B900082609091E800977F9093E8008093F10035
:101BA0001092F100C8C0282F2D7F09F0EAC08823C9
:101BB00019F0823061F0E5C08091E701813009F0D1
:101BC000E0C0933009F080E08093E2012BC0809167
:101BD000E701811127C08091E9018F7009F4D1C01C
:101BE0008093E9002091EB0020FF1CC0933021F48A
:101BF0008091EB00806214C09091EB009061909313
:101C0000EB0021E030E0A90102C0440F551F8A9586
:101C1000E2F74093EA001092EA008091EB008860BE
:101C20008093EB001092E9008091E800877F86C0E6
:101C30008111A7C01091E7011F778091E3008078A0
:101C4000812B8093E3008091E800877F8093E800F8
:101C50000E94A60B8091E80080FFFCCF8091E300FA
:101C600080688093E300111102C082E001C083E02C
:101C70008093E40186C08058823008F082C0809151
:101C8000E7019091E8018C3D53E0950779F583E0F9
:101C90008A838AE289834FB7F894DE01139620E0A5
:101CA0003EE051E2E32FF0E050935700E49120FF33
:101CB00003C0E295EF703F5FEF708E2F90E0EA3047
:101CC00010F0C79601C0C0968D939D932F5F24316D
:101CD00049F74FBF8091E800877F8093E8006AE270
:101CE00070E0CE0101960E94AD0A14C0AE014F5FB4
:101CF0005F4F6091E9010E94F409BC01892B09F44E
:101D000040C09091E800977F9093E80089819A8184
:101D10000E94100B8091E8008B778093E80031C01F
:101D2000803879F58091E800877F8093E800809182
:101D3000E0018093F1008091E8008E778093E800C5
:101D40000E94A60B1EC081111CC09091E701923029
:101D5000C0F48091E800877F8093E8009093E001D1
:101D60000E94A60B8091E001811106C08091E300E2
:101D700087FD02C081E001C084E08093E4010E94FD
:101D8000F0088091E80083FF0AC08091E800877F17
:101D90008093E8008091EB0080628093EB00AA962C
:101DA0000FB6F894DEBF0FBECDBFDF91CF911F916C
:101DB00008950895CF938091E4018823A1F0C09104
:101DC000E900CF709091EC00892F817090FD80E840
:101DD000C82B1092E9008091E80083FD0E94880DD5
:101DE000CF70C093E900CF910895909369018093DB
:101DF00068010895E0916801F0916901309721F040
:101E00000190F081E02D099480E00895E09168014F
:101E1000F0916901309721F00280F381E02D09945F
:101E20000895E0916801F0916901309721F00480F4
:101E3000F581E02D099408952091660130916701A4
:101E40008217930771F09093670180936601E09188
:101E50006801F0916901309721F00680F781E02D4B
:101E600009940895209164013091650182179307C8
:101E700071F09093650180936401E0916801F091A5
:101E80006901309721F00084F185E02D09940895CF
:101E900008950C94480F0E945E1B0E940B040C9442
:101EA000241CCF92DF92EF92FF920F931F93CF9358
:101EB000DF93CDB7DEB72B970FB6F894DEBF0FBE1A
:101EC000CDBF0E9423048BE6C82E81E0D82E00E00F
:101ED00010E0E02E802F0E941105F60141916F0164
:101EE000F42EF826B1F40F5F1F4F0E30110589F75D
:101EF0008FEF89838A831B820E94671B8160782F02
:101F00009D838C8349815A816B818D810E94F40F5E
:101F100040C09091CD0191FF04C08B870E941705AE
:101F20008B8520E030E04F2D50E0922FBA01022E39
:101F300002C0759567950A94E2F760FF24C02E836E
:101F4000EF8221E030E0690102C0CC0CDD1C9A95E3
:101F5000E2F790E08C219D21892B09F420E028876D
:101F60000E94671B8160782F9A8789874E815F81E5
:101F700068858A850E94F40FF801E559FE4F80813B
:101F8000C826C08206C02F5F3F4F2630310569F654
:101F9000AACF0E940B1F10916A010E94FA0E181717
:101FA000A1F00E94FA0E80936A012B960FB6F89466
:101FB000DEBF0FBECDBFDF91CF911F910F91FF907C
:101FC000EF90DF90CF900C94F3072B960FB6F89418
:101FD000DEBF0FBECDBFDF91CF911F910F91FF905C
:101FE000EF90DF90CF900895CF93DF93CDB7DEB71A
:101FF0002B970FB6F894DEBF0FBECDBF4F83588727
:1020000069877A878B87DE01119686E0FD01119240
:102010008A95E9F785E0FE01379601900D928A9541
:10202000E1F749815A816B817C818D819E810E947B
:1020300024172B960FB6F894DEBF0FBECDBFDF91ED
:10204000CF9108950895CF93882309F4C2C0C82F73
:10205000823859F40E94FA0E81FDBBC089E30E94C8
:10206000CD190E949A1A89E30CC0833879F40E9432
:10207000FA0E80FDAEC083E50E94CD190E949A1A27
:1020800083E50E940F1ACF910C949A1A843859F460
:102090000E94FA0E82FD9DC087E40E94CD190E9425
:1020A0009A1A87E4EECF8CEF8C0F813A48F48C2F8C
:1020B0000E944E2181118DC08C2F0E94CD19E3CF3B
:1020C00080E28C0F883048F4C77081E001C0880F2F
:1020D000CA95EAF70E94531AD6CF8BE58C0F83304E
:1020E00078F4C53A29F0C63A31F083E890E005C0AB
:1020F00081E890E002C082E890E0CF910C941C0F40
:1021000088E58C0F833108F064C0C83A39F1C93AC8
:1021100041F1CA3A49F1CB3A51F1CC3A59F1CD3AB1
:1021200061F1C03B69F1CE3A71F1CF3A79F1C13B2F
:1021300081F1C23B89F1C33B91F1C43B99F1C53BAD
:10214000A1F1C63BA9F1C73BB1F1C83BB9F1C93B0D
:10215000C1F1CA3BC9F180E090E038C082EE90E066
:1021600035C089EE90E032C08AEE90E02FC085EB5A
:1021700090E02CC086EB90E029C087EB90E026C071
:102180008CEC90E023C08DEC90E020C083E891E0DF
:102190001DC08AE891E01AC082E991E017C084E985
:1021A00091E014C081E292E011C083E292E00EC09F
:1021B00084E292E00BC085E292E008C086E292E001
:1021C00005C087E292E002C08AE292E0CF910C94CF
:1021D000320FCF910895882309F44BC0823859F407
:1021E0000E94FA0E81FF45C089E30E94CD190E942A
:1021F0009A1A89E30CC0833871F40E94FA0E80FFAA
:1022000038C083E50E94CD190E949A1A83E50E9486
:102210000F1A0C949A1A843859F40E94FA0E82FF0D
:1022200028C087E40E94CD190E949A1A87E4EFCF54
:102230009CEF980F913A58F390E2980F983050F431
:10224000877091E001C0990F8A95EAF7892F0E9463
:10225000591ADFCF9BE5980F933020F480E090E08F
:102260000C941C0F885A833120F480E090E00C9489
:10227000320F0895882321F00E94531A0C949A1A61
:102280000895882321F00E94591A0C949A1A0895EF
:10229000BF92CF92DF92EF92FF920F931F93CF9353
:1022A000DF9300D000D000D0CDB7DEB725E0FC0131
:1022B000DE01119601900D922A95E1F7FC01D08084
:1022C00011810281258122952F7043815481452BF4
:1022D00009F4FCC21F3F21F4FFEFDF1609F4F6C238
:1022E0007C012E830E942210D9821A8369817A810F
:1022F000802F0E94C919182FB92E0E947E190E94A2
:1023000045182E81002319F00E94701A2E81EB2DA2
:10231000E295EF70F0E0E05AFF4F0C9483238B2D91
:10232000807F9B2D9F70F92E882319F0F29480EF07
:10233000F822002389F0FF2009F475C280E2810FA2
:10234000883020F48F2D0E94531A03C08F2D0E94D5
:10235000631A0E949A1A67C2812F0E94EB10FF2015
:1023600009F4B4C2105E8F2D183018F40E94591A67
:1023700002C00E94691A26960FB6F894DEBF0FBEFF
:10238000CDBFDF91CF911F910F91FF90EF90DF9024
:10239000CF90BF900C949A1A3B2D307F8B2D8F706D
:1023A000303211F08295807F112319F0113021F124
:1023B0002CC00023B9F0222309F4A0C1213009F078
:1023C0009DC126960FB6F894DEBF0FBECDBFDF913C
:1023D000CF911F910F91FF90EF90DF90CF90BF9022
:1023E0000C94831A222319F0213009F46FC28E83D2
:1023F0000E94861A8E8196C1002321F0223008F0B7
:1024000065C27CC1211162C28DC1002321F022234B
:1024100009F474C108C2222309F484C119C22B2D06
:1024200026952695237030E02115310521F02130C5
:102430003105D1F04BC2002321F0812F9B2D9370E9
:1024400002C080E090E026960FB6F894DEBF0FBE83
:10245000CDBFDF91CF911F910F91FF90EF90DF9053
:10246000CF90BF900C941C0F002321F0812F9B2D47
:10247000937002C080E090E026960FB6F894DEBF1D
:102480000FBECDBFDF91CF911F910F91FF90EF90C5
:10249000DF90CF90BF900C94320F812F002319F062
:1024A0000E94131E02C00E947B1E26960FB6F8944F
:1024B000DEBF0FBECDBFDF91CF911F910F91FF9077
:1024C000EF90DF90CF90BF900C94001F8B2D837006
:1024D00009F07BC00111FAC1812F82958695877022
:1024E000880F880F912F9F70C92ED12CE12CF12CD1
:1024F000082E04C0CC0CDD1CEE1CFF1C0A94D2F785
:1025000014FF12C04FE050E060E070E004C0440FE0
:10251000551F661F771F8A95D2F7CB01BA016095C8
:1025200070958095909503C060E070E0CB012B2DF5
:10253000269526952370422F50E042305105D9F060
:102540004330510569F16C297D298E299F2941303D
:10255000510551F126960FB6F894DEBF0FBECDBFE0
:10256000DF91CF911F910F91FF90EF90DF90CF906F
:10257000BF900C946C186C297D298E299F29269672
:102580000FB6F894DEBF0FBECDBFDF91CF911F9184
:102590000F91FF90EF90DF90CF90BF900C94881830
:1025A0000E946C18C701B60126960FB6F894DEBFDC
:1025B0000FBECDBFDF91CF911F910F91FF90EF9094
:1025C000DF90CF90BF900C945018002319F08B2D02
:1025D000817001C08695882309F478C1812F829586
:1025E00086958770880F880F912F9F70C92ED12CE8
:1025F000E12CF12C082E04C0CC0CDD1CEE1CFF1CC1
:102600000A94D2F714FF12C04FE050E060E070E08F
:1026100004C0440F551F661F771F8A95D2F7CB0160
:10262000BA01609570958095909503C060E070E068
:10263000CB012B2D269526952370422F50E042305A
:102640005105D9F04330510569F16C297D298E2956
:102650009F294130510551F126960FB6F894DEBFFF
:102660000FBECDBFDF91CF911F910F91FF90EF90E3
:10267000DF90CF90BF900C9446196C297D298E294C
:102680009F2926960FB6F894DEBF0FBECDBFDF910F
:10269000CF911F910F91FF90EF90DF90CF90BF905F
:1026A0000C9462190E944619C701B60126960FB60E
:1026B000F894DEBF0FBECDBFDF91CF911F910F9178
:1026C000FF90EF90DF90CF90BF900C942A19103FAD
:1026D000D1F118F4103E50F4A1C0123F09F463C0C8
:1026E00008F44CC0133F09F473C098C01F708B2DC1
:1026F0008F710023A1F00E94C318812F26960FB678
:10270000F894DEBF0FBECDBFDF91CF911F910F9127
:10271000FF90EF90DF90CF90BF900C943A110E9401
:10272000E418812F26960FB6F894DEBF0FBECDBFFA
:10273000DF91CF911F910F91FF90EF90DF90CF909D
:10274000BF900C9441110023A9F02111BFC08B2D23
:102750008F7126960FB6F894DEBF0FBECDBFDF9106
:10276000CF911F910F91FF90EF90DF90CF90BF908E
:102770000C940919223008F0A9C0E9CF0023A9F070
:102780008B2D8F7126960FB6F894DEBF0FBECDBF8E
:10279000DF91CF911F910F91FF90EF90DF90CF903D
:1027A000BF900C94C318002359F38B2D8F7126967C
:1027B0000FB6F894DEBF0FBECDBFDF91CF911F9152
:1027C0000F91FF90EF90DF90CF90BF900C94E418A2
:1027D000002399F08B2D8F7126960FB6F894DEBFEB
:1027E0000FBECDBFDF91CF911F910F91FF90EF9062
:1027F000DF90CF90BF900C94AE1826960FB6F89449
:10280000DEBF0FBECDBFDF91CF911F910F91FF9023
:10281000EF90DF90CF90BF900C94A4180023A9F004
:10282000222309F4ADCF812F26960FB6F894DEBF90
:102830000FBECDBFDF91CF911F910F91FF90EF9011
:10284000DF90CF90BF900C942310222309F4ADCFDA
:10285000812F26960FB6F894DEBF0FBECDBFDF9155
:10286000CF911F910F91FF90EF90DF90CF90BF908D
:102870000C94EB104B2D4F70612FC7010E94AB02DF
:1028800026960FB6F894DEBF0FBECDBFDF91CF9175
:102890001F910F91FF90EF90DF90CF90BF900C941D
:1028A000C8174B2D4F70612FC70126960FB6F894AD
:1028B000DEBF0FBECDBFDF91CF911F910F91FF9073
:1028C000EF90DF90CF90BF900C94180526960FB62E
:1028D000F894DEBF0FBECDBFDF91CF911F910F9156
:1028E000FF90EF90DF90CF90BF9008950E94701AF4
:1028F0000E94801A0E94451A0E949A1A0E94B11FD3
:102900000E94001F80E090E00E941C0F80E090E099
:102910000C94320F0E94601A0C9476140E94BE1917
:10292000292F22952F7030E02C3031054CF42A30BD
:1029300031056CF4225031092230310588F407C08A
:102940002C30310549F02F30310531F009C0803E7F
:1029500048F0803F29F406C093FB882780F908954A
:1029600080E0089581E00895CF93DF9300D000D0F8
:102970001F92CDB7DEB70F900F900F900F900F9072
:10298000DF91CF910895CF93DF9300D000D000D096
:10299000CDB7DEB726960FB6F894DEBF0FBECDBF1B
:1029A000DF91CF9108951F93CF93DF93C091790169
:1029B00016E080917A01C81799F0D0E01C9FF001D1
:1029C0001D9FF00D1124E558FE4F40815181628119
:1029D0007381848195810E94C3142196C770E9CFC9
:1029E000DF91CF911F9108954091AB015091AC01BF
:1029F0006091AD017091AE018091AF019091B001F5
:102A00000C94C3148091B00182958F7009F054C06A
:102A10008091AD01882309F44FC080917901A09184
:102A20007A016091AB017091AC014091AE0150917F
:102A3000AF01B6E08A1709F43FC090E04115510597
:102A4000C1F17F3F11F46F3FA1F1B89FF001B99F31
:102A5000F00D1124E558FE4F218172132AC0208108
:102A6000621327C02281211124C0238134812417BD
:102A7000350710F421503109241B350B283C310552
:102A8000C0F42091B0012F7020612093B00126E0A6
:102A9000289FF001299FF00D1124E058FE4F8081FE
:102AA0008F70806180838BEA91E00E9448110C94C2
:102AB000D31401968770BECF0895CF92DF92EF9224
:102AC000FF920F931F93CF93DF93CDB7DEB762973B
:102AD0000FB6F894DEBF0FBECDBF8C0185E0F801C4
:102AE000DE011D9601900D928A95E1F7D8014C9177
:102AF00011965C91119712966C9112971396CD9046
:102B0000DC9014973091AB017091AC018091AE01D3
:102B10009091AF01009709F46BC17F3F19F43F3FDB
:102B200009F466C1E090AD01EE2009F4C0C0209127
:102B3000B001C816D90628F0F601E81BF90BCF0141
:102B400004C0809590958C0D9D1DFF24F394883CC6
:102B5000910578F0F12C207F09F0C6C07C2DD98A30
:102B6000C88A89890E94B4148BEA91E00E944811B6
:102B7000B1C0822F807F09F046C0751314C0341392
:102B800012C0611110C02F7020612093B0010E940B
:102B9000F4148BEA91E00E9448118091B001D801B1
:102BA00015968C932EC0CD2819F15F3F11F44F3F3D
:102BB000F9F0F62E61111CC08091790120917A0103
:102BC00036E0821709F45AC090E0389FF001399F2F
:102BD000F00D1124E558FE4F7181571306C0708126
:102BE000471303C07281711103C001968770E9CF4A
:102BF000F62E662309F418C18091B001816080939C
:102C0000B001F12C11C1751308C0341306C0611155
:102C100004C08091B001D801C3C04D875E878D8507
:102C20009E856A8B0E948E146A898823E1F166234F
:102C3000D1F12091B001822F82958F7090E00297A0
:102C400074F08091AB019091AC0198878F831986C5
:102C5000DB86CA862C87CE0107960E94481186E043
:102C6000F801ABEAB1E001900D928A95E1F70E947C
:102C700002150E94F414FF24F394D6C04D875E879A
:102C80008D859E850E94BE19292F22952F7030E0D8
:102C9000223031050CF0BCC09F7009F0B6C0805ED8
:102CA000883008F4C1C0C8010E944811E4CFC8169A
:102CB000D90608F453C0F601E81BF90BCF01883C94
:102CC000910508F450C0F12C7C2DD98AC88A8989D5
:102CD0000E94B414EBEAF1E086E0DF011D928A95D0
:102CE000E9F70E94F414A0C0751314C0341312C085
:102CF000611110C08091B001F8018583C8010E9464
:102D0000481186E0EBEAF1E0DF011D928A95E9F7D0
:102D1000FE2C8AC04D875E878D859E856A8B0E94BA
:102D20008E146A89882309F4BECF662309F4BBCFC9
:102D30002091B001822F82958F7090E002970CF461
:102D40008ECF8091AB019091AC019A8389831B82D5
:102D5000DD82CC822E83CE0101967FCF8095909527
:102D60008C0D9D1DACCFF62E662309F49CCF7513F8
:102D70002EC034132CC02091B00120FD1FC0822F23
:102D800082958F70D9F0D80115962C9315978F30B6
:102D900049F08F5F982F9295907F822F8F70892BAB
:102DA00015968C93C8010E94481186E0F801ABEAA1
:102DB000B1E001900D928A95E1F793CF86E0F8019A
:102DC000ABEAB1E001900D928A95E1F72DC04D87F5
:102DD0005E878D859E850E948E14811140CF8091E3
:102DE000B00181608093B001C8010E9448111CC0ED
:102DF000662309F458CF4D875E878D859E850E9496
:102E00008E14882309F44FCF2ACF811148CF0CC0EC
:102E1000243031050CF047CF9F7009F440CFF80102
:102E20009581907F09F03BCF8F2D62960FB6F89475
:102E3000DEBF0FBECDBFDF91CF911F910F91FF90ED
:102E4000EF90DF90CF9008951F93CF93DF93CDB78E
:102E5000DEB72C970FB6F894DEBF0FBECDBF4F8301
:102E6000588769877A878B879C87CE0107960E944F
:102E70005D15882369F08F8198852A853B85232BF2
:102E8000F1F19F3F09F063C08F3F09F060C037C088
:102E900086E0FE013796DE01119601900D928A952B
:102EA000E1F76F817885EA85FB85309741F17F3FB7
:102EB00011F46F3F21F120917A0130E0C9010196B0
:102EC000877099274091790150E08417950709F49C
:102ED00047C069837A83FD83EC8396E0929FD0019B
:102EE000939FB00D1124A558BE4FFE01319601905D
:102EF0000D929A95E1F780937A010E94D31416E01F
:102F00008091790190917A018917C1F1189FC001D0
:102F1000112485589E4F0E945D15882379F1E09118
:102F200079011E9FF0011124E558FE4F4081518127
:102F300062817381848195810E94C314809179019B
:102F400090E001968770992780937901D9CF4F81BE
:102F5000588569857A858B859C850E94C314CFCF5F
:102F60000E948A1410927A0110927901EBEAF1E042
:102F700086E0DF011D928A95E9F7C1CF2C960FB646
:102F8000F894DEBF0FBECDBFDF91CF911F910895A2
:102F9000EF92FF920F931F93CF93DF938C01892BB6
:102FA00009F46CC0F12CEE24E394E8012196F801B9
:102FB0008491843740F4843008F051C0813081F02E
:102FC000823019F15BC0853709F444C0A8F19CE751
:102FD000980F903708F052C08F770E94EB1041C0D5
:102FE0000E5F1F4FFE01C49180E28C0F883048F4C1
:102FF000C7708E2D01C0880FCA95EAF70E94731A18
:1030000014C08C2F0E9423102DC00E5F1F4FFE0195
:10301000C49180E28C0F883058F4C7708E2D01C0A7
:10302000880FCA95EAF70E94791A0E949A1A1AC064
:103030008C2F0E94EB1016C00E5F1F4FFE01C49133
:10304000CC2381F08FE99FE00197F1F700C00000E9
:10305000C150F6CF0E5F1F4FFE01F49003C00E94D7
:1030600023108E018F2D882309F49FCFEFE9FFE015
:103070003197F1F700C000008150F5CFDF91CF917B
:103080001F910F91FF90EF90089508956093B501FF
:103090007093B6018093B7019093B8010C947614A5
:1030A0000F931F930091B5011091B6012091B701C4
:1030B0003091B801DC01CB01802B912BA22BB32BDB
:1030C0008093B5019093B601A093B701B093B80176
:1030D0001F910F910C9476140F931F930091B501DB
:1030E0001091B6012091B7013091B801DC01CB01FC
:1030F00080239123A223B3238093B5019093B6013B
:10310000A093B701B093B8011F910F910C9476145E
:103110000F931F930091B5011091B6012091B70153
:103120003091B801DC01CB0180279127A227B3277A
:103130008093B5019093B601A093B701B093B80105
:103140001F910F910C9476141092B1011092B2015C
:103150001092B3011092B4010C94761441E050E047
:1031600060E070E004C0440F551F661F771F8A950A
:10317000D2F74093B1015093B2016093B3017093C1
:10318000B4010C94761441E050E060E070E004C0BB
:10319000440F551F661F771F8A95D2F78091B101A2
:1031A0009091B201A091B301B091B401482B592B79
:1031B0006A2B7B2B4093B1015093B2016093B30112
:1031C0007093B4010C94761441E050E060E070E03C
:1031D00004C0440F551F661F771F8A95D2F740958C
:1031E0005095609570958091B1019091B201A09138
:1031F000B301B091B401482359236A237B23409340
:10320000B1015093B2016093B3017093B4010C9477
:10321000761441E050E060E070E004C0440F551FB8
:10322000661F771F8A95D2F78091B1019091B20104
:10323000A091B301B091B401482759276A277B2791
:103240004093B1015093B2016093B3017093B40104
:103250000C9476140F931F930091B1011091B20159
:103260002091B3013091B401DC01CB01802B912B73
:10327000A22BB32B8093B1019093B201A093B30121
:10328000B093B4011F910F910C9476140F931F9378
:103290000091B1011091B2012091B3013091B401BC
:1032A000DC01CB0180239123A223B3238093B101BE
:1032B0009093B201A093B301B093B4011F910F9109
:1032C0000C9476140F931F930091B1011091B201E9
:1032D0002091B3013091B401DC01CB01802791270B
:1032E000A227B3278093B1019093B201A093B301B9
:1032F000B093B4011F910F910C9476140895CF925E
:10330000DF92EF92FF920F931F93CF93DF938C0185
:10331000C090B501D090B601E090B701F090B8012F
:103320008091B1019091B201A091B301B091B4012B
:10333000C82AD92AEA2AFB2ACFE1D0E0D701C60160
:103340000C2E04C0B695A795979587950A94D2F749
:1033500080FF06C0B8018C2F0E945807019721F406
:10336000219760F780E001C08C2FDF91CF911F91F2
:103370000F91FF90EF90DF90CF900895CF93DF9360
:10338000EC010E947F19BE010E945807DF91CF9186
:103390000895CB010E94BE19089590910C019923C4
:1033A00021F090910D01911109C020910E013091F1
:1033B0000F01F90132969FEF40E01FC0982F9695BC
:1033C000969596959F3050F5E0910E01F0910F0182
:1033D000E90FF11D877021E030E0A90102C0440F20
:1033E000551F8A95E2F7CA019181892B818308953F
:1033F0009F3F39F04F5F4E3041F051915813F8CF55
:103400000DC05111F7CF942FF5CF9F3F39F0F9013F
:10341000E90FF11D97FDFA95828308950895909123
:103420000C01992321F090910D01911109C0209177
:103430000E0130910F01F9013296205F3F4F1FC0FE
:10344000982F9695969596959F30F0F4E0910E0101
:10345000F0910F01E90FF11D877021E030E0A90123
:1034600002C0440F551F8A95E2F7CA0180959181E9
:103470008923818308953196E217F30729F090811B
:103480009813F9CF1082F7CF089581E090E0E09192
:103490000E01F0910F01E80FF91F108201968031A3
:1034A0009105A9F708959091CC01892B8093CC01C7
:1034B000089580959091CC0189238093CC01089543
:1034C0001092CC0108959091CB01892B8093CB0170
:1034D000089580959091CB0189238093CB01089525
:1034E0001092CB0108959091CA01892B8093CA0153
:1034F000089580959091CA0189238093CA01089507
:103500001092CA0108958093B90108951092B901EB
:10351000089580910E0190910F01FC0131969C015C
:10352000205F3F4F80E0919191118F5FE217F30789
:10353000D1F70895E0910E01F0910F018091CC0137
:103540008083E0910E01F0910F0190818091CB0179
:10355000892B8083E0910E01F0910F019081809181
:10356000CA01892B80838091B901882361F0E091A1
:103570000E01F0910F019081892B80830E94891A9E
:1035800081111092B90180910E0190910F010C945C
:10359000060FCF92DF92EF92FF926C01EE24FF2490
:1035A000C114D104E104F10421F0C701B60120E106
:1035B00001C020E0C72ED82EE92EFF24C114D1046B
:1035C000E104F10419F0285FC701B6016B017C0129
:1035D00054E0F694E794D794C7945A95D1F7C11460
:1035E000D104E104F10419F02C5FC701B6016B01AD
:1035F0007C0142E0F694E794D794C7944A95D1F7BA
:10360000C114D104E104F10419F02E5FC701B60121
:10361000DC01CB01B695A79597958795892B8A2BC9
:103620008B2B09F02F5F822FFF90EF90DF90CF90D0
:1036300008958091E401843021F11092CE0120E4BC
:1036400088E190E00FB6F894A895809360000FBED3
:103650002093600080E00E94F30783B7817F84603D
:1036600083BF83B7816083BF7894889583B78E7F4B
:1036700083BF88E10FB6F8948093600010926000D9
:103680000FBE089508950895CF930E94421B0E9493
:1036900023040E94431BC0E08C2F0E94110581115E
:1036A00004C0CF5FCE30C1F701C081E0CF91089553
:1036B0000E948A140E94FA0E0C94F30782E084BDE3
:1036C00093E095BD9AEF97BD80936E0008952FB754
:1036D000F8948091CF019091D001A091D101B09147
:1036E000D2012FBF0895CF92DF92EF92FF920F93F6
:1036F0001F932FB7F8944091CF015091D001609162
:10370000D1017091D2012FBF6A017B01EE24FF2409
:103710008C0120E030E0C016D106E206F30610F47A
:10372000415051099A01281B390BC9011F910F9172
:10373000FF90EF90DF90CF9008951F920F920FB6F9
:103740000F9211248F939F93AF93BF938091CF01DA
:103750009091D001A091D101B091D2010196A11D0B
:10376000B11D8093CF019093D001A093D101B0936C
:10377000D201BF91AF919F918F910F900FBE0F908B
:103780001F9018950E94F70BF8942FEF87EA91E6A7
:10379000215080409040E1F700C0000087E090EBAE
:1037A000DC018093EE019093EF01A093F001B093C0
:1037B000F1019CE088E10FB6F894A8958093600031
:1037C0000FBE90936000FFCFEF92FF920F931F9375
:1037D000CF93DF93D82FC0E08C2F0E94110500E01B
:1037E00010E0E82EF12CC701002E02C095958795B8
:1037F0000A94E2F780FD06C00F5F1F4F06301105E7
:1038000091F709C0602F7C2F80E00E941905D81322
:10381000F3CF81E004C0CF5FCE30F1F680E0DF91DE
:10382000CF911F910F91FF90EF900895CF93C82FE4
:103830008CE20E94E41B882321F08C2FCF910C9402
:10384000E41B80E0CF910895CF930E946B1D8111FE
:1038500002C00E94511DC5E6C15049F00E942304D8
:103860008FE39CE90197F1F700C00000F5CF89E2F2
:103870000E94161C811113C18AE20E94161C81113C
:103880000E94511D85E00E94161C81110E94C21BDE
:103890000E94761D8093CD0187E00E94161C88232C
:1038A000A9F18BE10E94161C882351F08091CD0173
:1038B00081FB222720F991E0922790FB81F90EC02D
:1038C0008EE00E94161C882361F08091CD0182FB5E
:1038D000222720F991E0922790FB82F98093CD0175
:1038E00015C080E10E94161C9091CD01882341F003
:1038F00093FB222720F981E0822780FB93F904C003
:10390000892F809580FB90F99093CD018091CD0116
:103910000E947A1D0E94881D8093ED0180EE0E9416
:10392000161C882341F08091ED01982F909590FB13
:1039300080F98093ED0189E30E94161C882359F0D9
:103940008091ED0181FB222720F991E0922790FBE5
:1039500081F98093ED0182EE0E94161C882359F0B4
:103960008091ED0182FB222720F991E0922790FBC4
:1039700082F98093ED0186EE0E94161C882359F08F
:103980008091ED0183FB222720F991E0922790FBA3
:1039900083F98093ED0183EE0E94161C882359F071
:1039A0008091ED0184FB222720F991E0922790FB82
:1039B00084F98093ED0185E30E94161C882359F059
:1039C0008091ED0185FB222720F991E0922790FB61
:1039D00085F98093ED0181E30E94161C882359F03C
:1039E0008091ED0186FB222720F991E0922790FB40
:1039F00086F98093ED0181E10E94161C882359F01D
:103A00008091ED0187FB222720F991E0922790FB1E
:103A100087F98093ED018091ED010E948C1D8091CA
:103A2000ED0187FB882780F980930D0187E20E94D2
:103A3000161CC82F8EE10E94161C8111C2608FE1F6
:103A40000E94161C8111C46080E20E94161C811124
:103A5000C86081E20E94161C8111C06182E20E944E
:103A6000161C8111C06283E20E94161C8111C06481
:103A700084E20E94161C882311F0C06802C0CC2387
:103A800029F08C2F0E94831D6C2F03C00E947F1D84
:103A9000682F70E080E090E0CF910C944618CF91B1
:103AA00008956DEE7EEF80E090E00E94BD2360E01F
:103AB00082E090E00E94AB2360E083E090E00E940F
:103AC000AB2360E084E090E00E94AB2360E085E0FF
:103AD00090E00C94AB2380E090E00E94A52321E0CD
:103AE0008D3E9E4F09F020E0822F089582E090E005
:103AF0000C949D23682F82E090E00C94AB2383E02C
:103B000090E00C949D23682F83E090E00C94AB230D
:103B100084E090E00C949D23682F84E090E00C9466
:103B2000AB238091D50180FF0BC06091130185E02C
:103B3000689FB001112475956795759567952BC0A1
:103B400081FF09C06091130185E0689FB0011124D5
:103B50007595679520C082FF07C06091130185E0CD
:103B6000689FB001112417C09091D6019923D1F01C
:103B700060911201961788F72091130185E0289F24
:103B800090011124929FA001939F500D112470E089
:103B9000CA010E946F236038710540F461157105F8
:103BA00039F002C065E070E0862F08958FE7089530
:103BB00081E008958091D50180FF08C060911101D6
:103BC00070E0759567957595679521C081FF06C072
:103BD0006091110170E07595679519C082FF04C06E
:103BE0006091110170E010C09091D6019923C1F04D
:103BF000609110019617A0F780911101899FC00173
:103C0000112470E00E946F236038710528F461155B
:103C1000710521F0862F08958FE7089581E00895BA
:103C200061E070E0F4CF803F21F40E94911D819506
:103C300004C0813F29F40E94911D8093D901089509
:103C4000823F21F40E94911D819504C0833F29F495
:103C50000E94911D8093D8010895893F19F40E9414
:103C6000DA1D05C08A3F31F40E94DA1D81958093E8
:103C7000DA0108958B3F21F40E94DA1D819504C07A
:103C80008C3F29F40E94DA1D8093DB010895843F64
:103C900021F48091D701816017C0853F21F4809184
:103CA000D701826011C0863F21F48091D7018460E2
:103CB0000BC0873F21F48091D701886005C0883F01
:103CC00031F48091D70180618093D70108958D3FB1
:103CD00021F48091D50181600BC08E3F21F4809149
:103CE000D501826005C08F3F29F48091D5018460A1
:103CF0008093D5010895803F39F48091D90187FFE1
:103D00006CC01092D90169C0813F29F48091D9011A
:103D10001816BCF362C09091D801823F29F497FF36
:103D20005CC01092D80159C0833F19F41916CCF326
:103D300054C0893F41F48091DA0118160CF04DC04F
:103D40001092DA014AC08A3F29F48091DA0187FF94
:103D500044C0F6CF8B3F39F48091DB0187FF3DC033
:103D60001092DB013AC08C3F29F48091DB011816D8
:103D7000BCF333C0843F21F48091D7018E7F17C0FC
:103D8000853F21F48091D7018D7F11C0863F21F4BA
:103D90008091D7018B7F0BC0873F21F48091D701A1
:103DA000877F05C0883F31F48091D7018F7E809353
:103DB000D70113C08D3F21F48091D5018E7F0BC0B8
:103DC0008E3F21F48091D5018D7F05C08F3F29F46E
:103DD0008091D5018B7F8093D5018091D80181118D
:103DE0000EC08091D90181110AC08091DA01811140
:103DF00006C08091DB01811102C01092D6010895A6
:103E000087ED91E00E94110F0E94671B9093D401EF
:103E10008093D30108951F93CF93DF938091D301B3
:103E20009091D4010E94731BAC019091D60199230B
:103E300021F02091140130E006C0209115018AE0A4
:103E4000289F900111244217530708F486C08091DF
:103E5000D801C091D901D091DA011091DB01811113
:103E600007C0C11176C0D11174C0111172C075C0E4
:103E70009F3F19F09F5F9093D601181624F40E947B
:103E8000911D8093D8018091D80187FF05C00E94C1
:103E9000911D81958093D8011C1624F40E94911DD8
:103EA0008093D9018091D90187FF05C00E94911D9F
:103EB00081958093D9016091D801662339F1C09131
:103EC000D901CC2319F1772767FD7095872F972F9C
:103ED0000E94802223E333E343E35FE30E94E42272
:103EE0000E944D226093D8016C2F772767FD709553
:103EF000872F972F0E94802223E333E343E35FE37E
:103F00000E94E4220E944D226093D9011D1624F4E0
:103F10000E94DA1D8093DA018091DA0187FF05C0E3
:103F20000E94DA1D81958093DA01111624F40E9413
:103F3000DA1D8093DB018091DB0187FF05C00E94C1
:103F4000DA1D81958093DB01DF91CF911F910C9455
:103F5000001F9F3F09F08ECF96CFDF91CF911F9129
:103F60000895E7EDF1E085E0DF011D928A95E9F71C
:103F70001092D6011092D5010895833081F128F472
:103F8000813059F08230D1F00895853009F449C06C
:103F9000B8F1863009F456C0089580911501262F96
:103FA00030E0280F311D2F3F310524F4680F609356
:103FB000150108958FEF80931501089580911401E4
:103FC000262F30E0280F311D2F3F310524F4680FD4
:103FD0006093140108958FEF8093140108958091E8
:103FE0001301262F30E0280F311D2F3F310524F417
:103FF000680F6093130108958FEF80931301089564
:1040000080911201262F30E0280F311D2F3F3105FE
:1040100024F4680F6093120108958FEF80931201CA
:10402000089580911101262F30E0280F311D2F3F78
:10403000310524F4680F6093110108958FEF809388
:104040001101089580911001262F30E0280F311DB5
:104050002F3F310524F4680F6093100108958FEF0E
:10406000809310010895833011F128F4813049F0D4
:10407000823091F00895853081F120F18630C1F1D0
:10408000089580911501681720F4861B809315010F
:10409000089510921501089580911401681720F475
:1040A000861B809314010895109214010895809145
:1040B0001301681720F4861B809313010895109252
:1040C0001301089580911201681720F4861B8093D4
:1040D000120108951092120108958091110168173C
:1040E00020F4861B80931101089510921101089508
:1040F00080911001681720F4861B809310010895A9
:104100001092100108950F931F938D3109F46BC025
:1041100008F03FC08E3009F47FC0C0F4873009F446
:1041200069C068F4863009F0B1C08091CD01817F0B
:104130008E7F8093CD0181E08093DD01A8C088301F
:1041400009F4A2C08B3009F49FC0A0C0863109F4E5
:104150009BC078F4803109F472C0813109F096C0B7
:104160000E948A1490910D0181E0892780930D01AE
:104170008BC0893109F488C08B3109F087C08091E8
:10418000CD0181FB222720F991E0922790FB81F954
:104190004CC0853309F470C048F4873209F46CC010
:1041A00008F459C0893209F467C070C0833438F408
:1041B0008A3308F04EC0883309F466C067C0833480
:1041C00009F45AC0883409F061C00E948A140FEFC4
:1041D00013ED20E3015010402040E1F700C0000043
:1041E0000E94C21B51C00E9407220E94FA0E0E9428
:1041F000F3074AC09091CD01892F8095817080FB93
:1042000090F929F0966098609093CD0140C0997F15
:10421000977F9093CD0138C08091CD0182FB2227FA
:1042200020F991E0922790FB82F98093CD019923A8
:1042300059F18091CD0181608093CD0125C080919D
:10424000CD0183FB222720F991E0922790FB83F98F
:10425000ECCF895301C08D5141E050E060E070E047
:104260008A019B0104C0000F111F221F331F8A9572
:10427000D2F7C901B80104C061E070E080E090E0CD
:104280000E9446180E948A1481E001C080E01F91BC
:104290000F91089580E0089580E00895CF93C82F8E
:1042A0008091DD01813079F018F08230E9F187C02A
:1042B000E0910E01F0910F018081813169F082322D
:1042C00009F07FC009C0E0910E01F0910F018081DB
:1042D000813111F0823261F48C2F0E944A218111C8
:1042E00004C08C2F0E9483201DC081E090E01AC082
:1042F0008C2F0E944C21811114C0C43179F048F4F4
:10430000CB3079F0C03109F060C082E08093DD01EC
:1043100008C0C93219F0C83321F057C01092DD012E
:1043200054C081E0817053C0C93289F118F5C4319D
:1043300071F1A8F4C73009F046C08AE080931501F6
:1043400094E19093140193E09093130180931201F0
:1043500088E08093110188E28093100134C0CE512F
:10436000C63088F5EC2FF0E0E65DFE4F808180934B
:10437000DC0129C0CE34E9F020F4CB3421F56AE029
:1043800013C0C13579F0C235F1F461E00DC0809100
:10439000DC01882319F01092DC0115C081E08093C4
:1043A000DD0115C061E006C08091DC010E94BD1FE7
:1043B0000AC06AE08091DC010E94332004C01092A0
:1043C000DD0180E004C081E002C080E0ABCFCF918E
:1043D0000895E1E8F0E080818860808380818160D9
:1043E00080838FB7F89493E09093890090ED909339
:1043F00088008FBF0895EFE6F0E0808182608083BF
:104400000895EFE6F0E080818D7F80830895EFE6E8
:10441000F0E0908182E08927808308951F920F92B7
:104420000FB60F9211242F933F934F935F936F9387
:104430007F938F939F93AF93BF93EF93FF9380915D
:10444000DE019091DF0101969093DF018093DE0100
:10445000811103C082E00E94F307E091DF01E6953D
:10446000E695F0E0E657FB4FE4918091DE018E1374
:1044700003C080E00E94F307FF91EF91BF91AF91DD
:104480009F918F917F916F915F914F913F912F916C
:104490000F900FBE0F901F90189504D06894B11123
:1044A0008DC0089570D088F09F5790F0B92F99274C
:1044B000B751A0F0D1F0660F771F881F991F1AF02F
:1044C000BA95C9F712C0B13081F077D0B1E0089544
:1044D00074C0672F782F8827B85F39F0B93FCCF3C5
:1044E000869577956795B395D9F73EF49095809525
:1044F000709561957F4F8F4F9F4F0895E89409C045
:1045000097FB3EF490958095709561957F4F8F4F06
:104510009F4F9923A9F0F92F96E9BB279395F6951C
:10452000879577956795B795F111F8CFFAF4BB0F9A
:1045300011F460FF1BC06F5F7F4F8F4F9F4F16C0FE
:10454000882311F096E911C0772321F09EE8872F88
:10455000762F05C0662371F096E8862F70E060E044
:104560002AF09A95660F771F881FDAF7880F9695BD
:10457000879597F9089557FD9058440F551F59F0A6
:104580005F3F71F04795880F97FB991F61F09F3F40
:1045900079F087950895121613061406551FF2CF69
:1045A0004695F1DF08C0161617061806991FF1CFB9
:1045B00086957105610508940895E894BB276627E0
:1045C0007727CB0197F908950BD078C069D028F0F0
:1045D0006ED018F0952309F05AC05FC01124EECFB9
:1045E000CADFA0F3959FD1F3950F50E0551F629F4E
:1045F000F001729FBB27F00DB11D639FAA27F00D3C
:10460000B11DAA1F649F6627B00DA11D661F829F62
:104610002227B00DA11D621F739FB00DA11D621F47
:10462000839FA00D611D221F749F3327A00D611D64
:10463000231F849F600D211D822F762F6A2F112446
:104640009F5750408AF0E1F088234AF0EE0FFF1F99
:10465000BB1F661F771F881F91505040A9F79E3FD0
:10466000510570F014C0AACF5F3FECF3983EDCF325
:10467000869577956795B795F795E7959F5FC1F70D
:10468000FE2B880F911D9695879597F9089597F9B8
:104690009F6780E870E060E008959FEF80EC0895E8
:1046A00000240A9416161706180609060895002411
:1046B0000A9412161306140605060895092E03948B
:1046C000000C11F4882352F0BB0F40F4BF2B11F4FF
:1046D00060FF04C06F5F7F4F8F4F9F4F089597FB20
:1046E000072E16F4009407D077FD09D00E94892385
:1046F00007FC05D03EF4909581959F4F08957095E5
:1047000061957F4F0895EE0FFF1F0590F491E02D06
:104710000994AA1BBB1B51E107C0AA1FBB1FA61708
:10472000B70710F0A61BB70B881F991F5A95A9F75A
:1047300080959095BC01CD010895F999FECF92BD69
:1047400081BDF89A992780B50895A8E1B0E042E0CC
:1047500050E00C94C523262FF999FECF92BD81BD60
:10476000F89A019700B4021639F01FBA20BD0FB6AF
:10477000F894FA9AF99A0FBE08950196272F0E948D
:10478000AC230C94AB23DC01CB01FC01F999FECFE7
:1047900006C0F2BDE1BDF89A319600B40D924150C9
:0A47A0005040B8F70895F894FFCFD9
:1047AA002002F507830860082C08F8070101BA01FE
:1047BA0028080A03140A3F4D36394B04FE03C8037E
:1047CA008F0322033B0354036D030102030405060E
:0447DA0007080900C3
:00000001FF

@ -0,0 +1,231 @@
#include "ergodox_ez.h"
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media
#define CNTL 3 // control layer
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | L1/` | 1 | 2 | 3 | 4 | 5 |CmdSpc| | - | 6 | 7 | 8 | 9 | 0 | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* |Meh/Tab | Q | W | E | R | T | STab | | L3 | Y | U | I | O | P | Meh/\ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* |Hyp/Esc | L3/A | S | D | F | G |------| |------| H | J | K | L | L2/; | Hyp/' |
* |--------+------+------+------+------+------| Tab | |AltGui|------+------+------+------+------+--------|
* | LShift | L3/Z | X | C | V | B | | | | N | M | , | . | L2// | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |LCtrl | LAlt | LGui |Left |Right | | UP | Down | [ | ] | L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | LCtl | LGui | | LAlt |ShfGui|
* ,-------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Backsp|Delete|------| |------| Enter | Space |
* | | | 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
LT(SYMB,KC_GRV), KC_1, KC_2, KC_3, KC_4, KC_5, LGUI(KC_SPC),
MEH_T(KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, S(KC_TAB),
ALL_T(KC_ESC), LT(CNTL,KC_A), KC_S, KC_D, KC_F, KC_G,
KC_LSFT, LT(CNTL,KC_Z), KC_X, KC_C, KC_V, KC_B, KC_TAB,
KC_LCTL, KC_LALT, KC_LGUI, KC_LEFT, KC_RIGHT,
KC_LCTL, KC_LGUI,
KC_HOME,
KC_BSPC, KC_DELETE, KC_END,
// right hand
KC_MINS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL,
KC_FN3, KC_Y, KC_U, KC_I, KC_O, KC_P, MEH_T(KC_BSLS),
KC_H, KC_J, KC_K, KC_L, LT(MDIA,KC_SCLN), ALL_T(KC_QUOT),
LALT(KC_LGUI), KC_N, KC_M, KC_COMM, KC_DOT, LT(MDIA,KC_SLSH), KC_RSFT,
KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, KC_FN1,
KC_LALT, S(KC_LGUI),
KC_PGUP,
KC_PGDN,KC_ENT, KC_SPC
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | < | | > | : | 7 | 8 | 9 | / | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| ; | 4 | 5 | 6 | * | Prnt |
* |--------+------+------+------+------+------| F14 | | F15 |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | - | Entr |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | 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,S(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_F14,
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,
S(KC_DOT), KC_COLN, KC_7, KC_8, KC_9, KC_BSLS, KC_F12,
KC_SCLN, KC_4, KC_5, KC_6, KC_ASTR, KC_PSCR,
KC_F15, KC_AMPR, KC_1, KC_2, KC_3, KC_MINS, KC_ENT,
KC_0, KC_DOT, KC_EQL, KC_PLUS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | |------| |------| | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | Prev | Next | | Prev | Next |
* ,------|------|------| |------+------+------.
* | | | VolUp| | VolUp| | |
* | Play | Mute |------| |------| Mute | Play |
* | | | VolDn| | VolDn| | |
* `--------------------' `--------------------'
*/
// Control
[MDIA] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_MPRV, KC_MNXT,
KC_VOLU,
KC_MPLY, KC_MUTE, KC_VOLD,
// 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_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_MPRV, KC_MNXT,
KC_VOLU,
KC_VOLD, KC_MUTE, KC_MPLY
),
/* Keymap 3: Control Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Sleep | | | | | | Pwr | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp | | | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| Lclk |------| |------| Lft | Down | Up | Right| | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | Rclk | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// Control
[CNTL] = KEYMAP(
KC_SLEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PWR,
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_BTN1,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN2, 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_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB),
[2] = ACTION_LAYER_TAP_TOGGLE(MDIA),
[3] = ACTION_LAYER_TAP_TOGGLE(CNTL) // 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;
case 3:
ergodox_right_led_3_on();
break;
default:
// none
break;
}
};

@ -0,0 +1,36 @@
# Techtomas Configuration
## Base Layer
The base layer is a merge of what I liked with the default layout and the ordinary layout. The thumb cluster is more like the Kinesis advantage and the top row of the cluster is convient for use on the mac.
* The Caps Lock postion handles [Hyper/Esc](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)
* The Tab key toggles MEH.
* The two vertical mods on the left board are Shift+Tab and Tab.
* The two vertical mods on the right board are Control Layer tap/toggle and Alt+Cmd.
* The HYPER and MEH key are made in the same location on the right side of the board as well. Using Keyboard Maestro for OS X makes one-handed shortcuts very easy.
## Symbol Layer
The symbol layer can be tap/toggled through the bottom right key and also toggled holding the tilde/grave key in the upper left corner. I haven't used the symbol layer enough to tell if this was a good place or not but it made sense in my head
The bottom two vertical mods are set to F14 and F15 which is the default for changing screen brightness on the mac
## Media Layer
/ & ; will toggle the media layer which has play and volume controls assigned to the thumb cluster. I found this an easy way to quickly play/pause
## Control Layer
The a and z keys toggle the control layer.
On the left board you have mouse control with left & right click in the location of the G and B keys.
On the right board you have vim-style arrow keys using hjkl
The thumb cluster and mods all pass down to this layer.
## Changelog
* Apr 29, 2016 (V1.1):
* Added F14 and F15 to symbol layer
* Added control layer toggle to A key.
* Apr 28, 2016 (V1.0):
* Modified config based on the default layout plus inspiration from the ordinary layout

@ -0,0 +1,1166 @@
:100000000C94BB020C9402030C9402030C940203A4
:100010000C9402030C9402030C9402030C9402034C
:100020000C9402030C9402030C94D20C0C94A40DB7
:100030000C9402030C9402030C9402030C9402032C
:100040000C9402030C9470220C9402030C9402038F
:100050000C9402030C94001C0C9402030C940203F5
:100060000C9402030C9402030C9402030C940203FC
:100070000C9402030C9402030C9402030C940203EC
:100080000C9402030C9402030C9402030C940203DC
:100090000C9402030C9402030C9402030C940203CC
:1000A0000C9402030C9402030C940203110E330E01
:1000B000210F330E210F780E9B0E210FF00E030F30
:1000C000EF11EF112C122C126F12AD12C614C614C0
:1000D000C612C614C713C7139A14C614C614B11493
:1000E0000000F0A1F0A2F0A335812B77297FE10079
:1000F000E00000001E00140004831D83E2004D0098
:100100001F001A0016001B00E3004C00200008002E
:100110000700060050002A00210015000900190000
:100120004F004A00220017000A0005000000E0000E
:100130002C082B0200002B000000E3002D00C30060
:100140000000E3040000E20023001C000B0011008B
:100150000000E302240018000D00100052004B00C4
:1001600025000C000E00360051002C002600120065
:100170000F0037002F002800270013003382388239
:1001800030004E002E003177347FE500C1000000C2
:100190000100010001000100010000003A001E0200
:1001A00020022202010001003B001F022102230263
:1001B000010001003C002F0226022F000100010077
:1001C0003D00300227023000010001003E003102F4
:1001D0003500350200000100010036020000690010
:1001E000000001000100370200006A000000010069
:1001F0003F003302330024020000010040002400CD
:1002000021001E00270001004100250022001F00E0
:100210003700010042002600230020002E000100CC
:100220004300310025022D002E020100440045004C
:10023000460028000100000001000100010001004B
:100240000100000001000100010001000100AA00FE
:1002500001000100010001000100A80001000100EF
:10026000010001000100AE000100010001000100D9
:100270000100A90001000100010001000000AC0024
:1002800001000100000001000000AB0001000100BE
:10029000000001000000AC000100010001000100AD
:1002A0000000AB0001000100010001000100A900F5
:1002B00001000100010001000100AE000100010089
:1002C000010001000100A80001000100010001007F
:1002D0000100AA000100010001000100010000006E
:1002E000A600010001000100010000000100010062
:1002F000010001000100010001000100F200010005
:10030000010001000100F000F10001000100010006
:1003100001000100F30001000100010001000100E3
:10032000F400F50000000100A5000100000001003C
:1003300000000100010001000000010000000100B8
:100340000100010050000100000001000100010057
:1003500051000100010001000100010052000100F4
:1003600001000100010001004F0001000100010037
:100370000100010001000100010001000100010075
:100380000100010001000000160345007200670033
:100390006F0044006F007800200045005A00000004
:1003A00016034500720067006F0044006F0078007C
:1003B000200045005A0000000403090409026D00F2
:1003C000040100A0FA090400000103010100092151
:1003D00011010001223F000705810308000A0904FA
:1003E00001000103010200092111010001224D0059
:1003F0000705820308000A09040200010300000047
:100400000921110100012236000705830308000AB3
:100410000904030001030000000921110100012269
:1004200039000705840310000112011001000000CB
:1004300008EDFE071301000102000105010906A1F4
:1004400001050719E029E7150025019508750181C7
:100450000205081901290595057501910295017597
:100460000391010507190029771500250195787575
:10047000018102C005010980A10185021601002643
:10048000B7001A01002AB700751095018100C00558
:100490000C0901A1018503160100269C021A010026
:1004A0002A9C02751095018100C005010902A10175
:1004B0000901A10005091901290515002501950566
:1004C000750181029501750381010501093009312A
:1004D0001581257F95027508810609381581257FCC
:1004E000950175088106050C0A38021581257F954E
:1004F0000175088106C0C005010906A1010507199B
:10050000E029E7150025019508750181029501751F
:1005100008810105081901290595057501910295C4
:1005200001750391010507190029FF150025FF95A5
:100530000675088100C000000000000000000000F7
:1005400000010204060A0F17202C3A4A5D71879DAC
:10055000B3C7DAE9F5FCFFFCF5E9DAC7B39D8771AB
:100560005D4A3A2C20170F0A060402010000000021
:1005700000000000000011241FBECFEFDAE0DEBF54
:10058000CDBF04B603FE27C08091EE019091EF012C
:10059000A091F001B091F1018730904BA740B04B92
:1005A000D1F41092EE011092EF011092F00110922E
:1005B000F10114BE84B7877F84BF0FB6F894A89565
:1005C00080916000886180936000109260000FBE8F
:1005D000E0E0FFE3099511E0A0E0B1E0ECE8F8E429
:1005E00002C005900D92A433B107D9F721E0A4E32E
:1005F000B1E001C01D92AE3EB207E1F70E94130ABE
:100600000C9444240C94000061110BC0FC01828105
:10061000882321F085EE0E94831003C085EE0E949E
:100620004B1180E090E0089508956091B1017091C0
:10063000B2018091B3019091B4010E94291B569898
:100640005E9825982D9826982E9827982F98823076
:1006500039F0833041F0813041F4259A2D9A089584
:10066000269A2E9A0895279A2F9A08950C94150386
:1006700056985E9825982D9826982E9827982F980A
:100680008FEF90E0909389008093880090938B0087
:1006900080938A0090938D0080938C00259A2D9AE8
:1006A0002FEF80E792E0215080409040E1F700C0BA
:1006B0000000269A2E9A2FEF80E792E0215080408A
:1006C0009040E1F700C00000279A2F9A2FEF80E7B3
:1006D00092E0215080409040E1F700C00000259852
:1006E0002D982FEF80E792E0215080409040E1F775
:1006F00000C0000026982E982FEF80E792E021504E
:1007000080409040E1F700C0000027982F9856984D
:100710005E9825982D9826982E9827982F980895BA
:1007200089EA8093800089E08093810024982C9846
:100730003F988AB18F748AB96E98479A8BB1806B53
:100740008BB9769A0E9438030C94140380E280934C
:1007500000018091340181110EC00E94F50381E0F7
:10076000809334012FEF83ED90E32150804090403F
:10077000E1F700C0000080E40E94FB0380930001C9
:1007800081112EC00E94250480930001811128C090
:100790000E94250480930001811122C08FE30E94F2
:1007A00025048093000181111BC00E941D0480E478
:1007B0000E94FB0380930001811112C08CE00E9413
:1007C00025048093000181110BC00E9425048093B1
:1007D0000001811105C08FE30E9425048093000170
:1007E0000E941D048091000108951092B9008AE0D2
:1007F0008093B800089594EA9093BC009091BC0057
:1008000097FFFCCF9091B900987F983021F09031FC
:1008100011F081E008958093BB0084E88093BC00D0
:100820008091BC0087FFFCCF8091B900887F883120
:1008300011F0803471F780E0089584E98093BC0062
:100840008091BC0084FDFCCF08958093BB0084E8B8
:100850008093BC008091BC0087FFFCCF9091B900D1
:10086000987F81E0983209F480E0089584E88093CD
:10087000BC008091BC0087FFFCCF8091BB00089535
:1008800080910001811115C080E40E94FB038093D8
:10089000000181110CC082E10E94250480930001B7
:1008A000811105C08FEF0E942504809300010E94F2
:1008B0001D0484B1807F84B985B1807F85B98AB1F8
:1008C000837F8AB98BB1837F8BB93E984698089510
:1008D0000E94A603809300010E94400480B38C70A4
:1008E00080BB81B3836F81BBA6E3B1E0E4E4F1E0B8
:1008F0008EE08E0F11921D928E13FCCF0C949003FC
:10090000BF92CF92DF92EF92FF920F931F93CF93FC
:10091000DF9380910001882379F0809135018F5F0A
:1009200080933501811108C00E94A60380930001C5
:10093000811102C00E94380306E311E0C0E0D0E05C
:10094000DD24D39482E0C82EEE24E394F12CC7304A
:10095000D10500F580910001811164C080E40E94FE
:10096000FB0380930001811112C082E10E942504E3
:100970008093000181110BC0C7010C2E01C0880FAC
:100980000A94EAF780950E942504809300010E9452
:100990001D0448C0CA30A1F028F4C83059F0C9304D
:1009A00061F005C0CC3089F070F0CD3089F0209A2C
:1009B000289810C0219A29980DC0229A2A980AC016
:1009C000239A2B9807C0529A01C0539A5B9802C091
:1009D0003E9A469890EA9A95F1F79FB1799902C0AC
:1009E00082E001C080E091709D25982B7C9902C027
:1009F00084E001C080E0892B7D9902C038E001C00D
:100A000030E0832B7E9902C020E101C020E0822BE0
:100A10009FB19095991F9927991F9295990F907E54
:100A2000892B0FC080910001811149C080E40E9490
:100A3000FB0380930001882379F1B12C0E941D04EF
:100A40008B2DF8019081981719F08083C0920101D5
:100A50000E94400421960F5F1F4FCE30D10509F050
:100A600076CF80910101882361F18150809301014B
:100A7000882339F08FE99FE00197F1F700C000006B
:100A800020C0A4E4B1E0E6E3F1E0CF01825F919100
:100A90009D938E13FCCF15C083E10E9425048093A3
:100AA00000018111CACF81E40E94FB038093000101
:100AB0008111C3CF0E943604B82EB094BFCF80E01E
:100AC000C0CF0E94360381E0DF91CF911F910F913B
:100AD000FF90EF90DF90CF90BF900895E82FF0E067
:100AE000EC5BFE4F808108950895089596E0799F0C
:100AF000F001112494E5899FE00DF11D1124E60F0A
:100B0000F11DEE0FFF1FE851FF4F8591949108955D
:100B1000880F991FFC01E05AF04085919491089547
:100B2000880F991FFC01E052FF4F85919491089521
:100B30000F931F93CF93DF93EC018115904350F5F2
:100B4000C11580E2D80708F0B3C0CB3BD10590F4C3
:100B5000C83AD10508F05AC0C53AD10508F04BC0D3
:100B6000C430D10508F0BBC1219709F0B5C101E03F
:100B700010E0F5C1CF3FD10511F008F0B0C1C03F82
:100B8000D10508F092C0CE01805E9109089708F463
:100B9000A6C1A2C1C11591E5D907A8F4C23020E5CC
:100BA000D20708F09EC0C11580E5D80709F485C0BA
:100BB00008F091C0C11520E4D20708F08DC1DD27EF
:100BC0008E01106CCCC1C11580E8D80758F4C1154E
:100BD00090E7D90708F07CC1C11520E6D20708F4D8
:100BE00022C17AC1C11580E9D80708F075C1DF704C
:100BF0008E01106AB4C1C53AD10509F472C1C63A72
:100C0000D10509F071C102E810E4A9C1C83AD105C3
:100C100009F46DC1C93AD10509F46CC1CA3AD105CC
:100C200009F46BC1CB3AD10509F46AC1CC3AD105BC
:100C300009F469C1CD3AD10509F468C1C03BD105B9
:100C400009F467C1CE3AD10509F466C1CF3AD1059E
:100C500009F465C1C13BD10509F464C1C23BD105AA
:100C600009F463C1C33BD10509F462C1C43BD1059A
:100C700009F461C1C53BD10509F460C1C63BD1058A
:100C800009F45FC1C73BD10509F45EC1C83BD1057A
:100C900009F45DC1C93BD10509F45CC1CA3BD1056A
:100CA00009F45BC100E014E45AC18E01106557C11C
:100CB000CE019F700E94900553C10E94EA149FEFDD
:100CC00024E38CE0915020408040E1F700C0000018
:100CD0000E94251C44C18091CD0181608093CD018B
:100CE0003EC10E94CE1D811102C00E94B41D0E940F
:100CF000EB1D90E09093EE018093ED01C23090E502
:100D0000D90721F48091ED01816086C0C43020E5CF
:100D1000D20721F48091ED0182607EC0C63080E56B
:100D2000D80721F48091ED01846076C0C83090E549
:100D3000D90719F48091ED0127C0CA3020E5D20708
:100D400021F48091ED01806167C0CC3080E5D80747
:100D500021F48091ED0180625FC0CE3090E5D9072B
:100D600021F48091ED01806457C0C03120E5D207A5
:100D700021F48091ED0180684FC0C23180E5D80731
:100D800029F48091ED018460886046C0C33090E50D
:100D9000D90721F48091ED018E7F3EC0C53020E55A
:100DA000D20721F48091ED018D7F36C0C73080E5F8
:100DB000D80721F48091ED018B7F2EC0C93090E5DA
:100DC000D90719F48091ED0126C0CB3020E5D20778
:100DD00021F48091ED018F7E1FC0CD3080E5D807D2
:100DE00021F48091ED018F7D17C0CF3090E5D907B8
:100DF00021F48091ED018F7B0FC0C13120E5D20736
:100E000021F48091ED018F7707C0C331D04531F4D3
:100E10008091ED018B7F877F8093ED018091ED01C3
:100E20000E94EF1D9CC08D2F99278F7099278130CC
:100E30009105D9F49E012370332702C0880F991FB2
:100E40002A95E2F79C688E0144E0000F111F4A9535
:100E5000E1F700271370802B912B53E0CC0FDD1F9F
:100E60005A95E1F7C076DD272FC08230910531F425
:100E7000DC2FCC278E01016F106A71C08330910581
:100E800069F4CE018370992701E010E002C0000FE1
:100E9000111F8A95E2F7C8019C680FC0049709F0FA
:100EA0005EC0CE018370992701E010E002C0000F00
:100EB000111F8A95E2F7C8019A6823E0CC0FDD1F65
:100EC0002A95E1F7C07ED7708C010C2B1D2B47C0F3
:100ED000DF708E01106243C000E010E040C08E0160
:100EE0003EC001E810E43BC003E810E438C002EE65
:100EF00014E435C009EE14E432C00AEE14E42FC045
:100F000005EB14E42CC006EB14E429C007EB14E451
:100F100026C00CEC14E423C00DEC14E420C003E85C
:100F200015E41DC00AE815E41AC002E915E417C06B
:100F300004E915E414C001E216E411C003E216E46A
:100F40000EC004E216E40BC005E216E408C006E297
:100F500016E405C007E216E402C00AE216E4C8017E
:100F6000DF91CF911F910F91089596E0799FF00145
:100F7000112494E5899FE00DF11D1124E60FF11D68
:100F8000EE0FFF1FE851FF4F85919491803E910530
:100F9000E0F4803C910558F58133910509F46FC068
:100FA00048F48932910509F463C08A32910509F445
:100FB0006DC072C089339105E9F082389105D1F096
:100FC0008533910509F44DC067C0833E910581F1D9
:100FD00038F4803E9105B9F0823E9105D9F05CC0AD
:100FE000863E910561F1873E9105A1F155C00E94B1
:100FF000880508952091ED0120FD02C021FF4CC01D
:1010000080EE90E049C08091ED0180FFF9CF89E347
:1010100090E042C08091ED0182FF0EC08091ED0111
:1010200084FF03C080E090E037C083EE90E034C0DE
:101030008091ED0182FFF2CF82EE90E02DC0809191
:10104000ED0183FF0BC08091ED0184FDEBCF87EEB6
:1010500090E022C08091ED0183FFF5CF86EE90E015
:101060001BC08091ED0185FF07C089E290E014C0AC
:101070008091ED0185FFF9CF85E390E00DC080916F
:10108000ED0186FF07C08AE290E006C08091ED0185
:1010900086FFF9CF81E390E00E94980508950895B6
:1010A0000C944F08809162010895CF93DF9300D094
:1010B0001F92CDB7DEB79C018091E401843019F511
:1010C00093E099833B832A839093E9008FEF90917B
:1010D000E800815095FD06C095ED9A95F1F7000066
:1010E0008111F5CF8091E80085FF0DC040E050E010
:1010F00063E070E0CE0101960E94C20A8091E80090
:101100008E778093E8000F900F900F90DF91CF9132
:101110000895CF93DF9300D01F92CDB7DEB7209113
:10112000E401243021F522E029839B838A8383E034
:101130008093E9008FEF9091E800815095FD06C003
:1011400095ED9A95F1F700008111F5CF8091E800B7
:1011500085FF0DC040E050E063E070E0CE010196F5
:101160000E94C20A8091E8008E778093E8000F9079
:101170000F900F90DF91CF9108952091E4012430DA
:10118000F1F422E02093E9002FEF3091E8002150A4
:1011900035FD06C035ED3A95F1F700002111F5CF88
:1011A0002091E80025FF0BC040E050E065E070E0D2
:1011B0000E94C20A8091E8008E778093E80008952B
:1011C000CF93DF93EC019091E401943009F046C095
:1011D00080910C018823D9F080910D018823B9F00A
:1011E0009093E9008FEF9091E800815095FD06C043
:1011F00095E19A95F1F700008111F5CF8091E80013
:1012000085FF2CC040E050E060E170E017C081E055
:101210008093E9008FEF9091E800815095FD06C022
:1012200095ED9A95F1F700008111F5CF8091E800D6
:1012300085FF14C040E050E068E070E0CE010E94FD
:10124000C20A8091E8008E778093E80080E1FE0179
:10125000A2E5B1E001900D928A95E1F7DF91CF917F
:1012600008958091E301811109C00E94570C0E94EA
:10127000B40C8091E20084608093E20008951092A3
:10128000E301089508950C945D220E94BB1B0E9407
:1012900063220E945A0F0C94500842E061EC81E0F6
:1012A0000E94D10B42E061EC82E00E94D10B42E04F
:1012B00061EC83E00E94D10B42E161EC84E00C948C
:1012C000D10B8091E601833009F455C030F48130B0
:1012D00071F0823009F48EC008958A3009F47AC022
:1012E0008B3009F460C0893009F09CC020C0809127
:1012F000E501813A09F096C08091E800877F8093EC
:10130000E8008091E9019091EA01892B21F460E1E4
:1013100082E591E003C060E080E090E070E00E9430
:101320000D0B8091E8008B778093E8000895809101
:10133000E501813209F076C08091E9019091EA01DE
:10134000009719F0039709F06DC08091E800877F3E
:101350008093E8008091E80082FD05C08091E4015F
:101360008111F8CF5FC08091F1008093620180917C
:10137000E8008B7753C08091E501813A09F052C0B3
:101380008091E9019091EA01892B09F04BC080918D
:10139000E800877F8093E8008091E80080FFFCCF21
:1013A00080910C0136C08091E5018132D9F58091A0
:1013B000E9019091EA01892BA9F58091E800877FE6
:1013C0008093E8000E94060C8091E70180930C0155
:1013D0000C94EA148091E501813221F58091E800B6
:1013E000877F8093E8000E94060C8091E80180933B
:1013F000630108958091E501813AA1F48091E800AC
:10140000877F8093E8008091E80080FFFCCF809187
:1014100063018093F1008091E8008E778093E8006B
:101420000C94060C089584B7877F84BF0FB6F89498
:10143000A8958091600088618093600010926000A0
:101440000FBE90E080E80FB6F8948093610090930F
:1014500061000FBE0E94A90F0E94570C0E94B40C9D
:101460008091E20084608093E20078940E943A0FB9
:101470000E94AB0F82E091E00E94550F0E944B2228
:101480008091E401853069F40E94791B8091E2012A
:101490008823B1F30E94A71B882391F30E94AC0A12
:1014A000EFCF0E94B10FECCF292F33272330310526
:1014B000C9F064F42130310581F02230310509F0A2
:1014C00043C08DE690E02CEB33E042C02132310581
:1014D000F1F02232310541F137C082E190E029E29A
:1014E00034E036C099278130910541F08230910572
:1014F00041F0892B49F5E8EBF3E005C0E0EAF3E0C1
:1015000002C0E8E8F3E0849190E09F0121C06430DC
:10151000D8F4E62FF0E0EE0FFF1FEE5DFE4F2081C6
:10152000318189E090E014C0643070F470E0FB0118
:10153000EE0FFF1FE65EFE4F20813181FB01EA5E68
:10154000FE4F808190E004C080E090E020E030E039
:10155000FA0131832083089580E189BD82E189BD4C
:1015600009B400FEFDCF8091D8008F7D8093D80014
:101570008091E00082608093E0008091E00081FD36
:10158000FCCF0895CF92DF92EF92FF920F931F93BB
:10159000CF93DF93EC018B016A010E94250C81112E
:1015A00033C0C114D10439F0F60180819181081B48
:1015B000190BC80FD91FE12CF12C0115110519F1D8
:1015C0008091E80085FD16C08091E8008E778093B9
:1015D000E800C114D10449F0F60180819181E80E40
:1015E000F91EF182E08285E00FC00E94250C88235D
:1015F00021F30AC089918093F10001501109FFEF96
:10160000EF1AFF0ADACF80E0DF91CF911F910F919F
:10161000FF90EF90DF90CF9008952091EB013091F3
:10162000EC012617370748F06115710539F4209150
:10163000E8002E772093E80001C0B90140E0611571
:101640007105A9F12091E401222309F443C025305A
:1016500009F442C02091E80023FD40C02091E80039
:1016600022FD32C02091E80020FFE9CF4091F30035
:101670002091F20030E0342BFC01CF01611571059F
:1016800059F02830310540F481918093F100615088
:1016900071092F5F3F4FF1CF41E02830310509F04C
:1016A00040E02091E8002E772093E800C8CF411158
:1016B000C9CF0AC08091E401882361F0853061F0D0
:1016C0008091E80083FD0AC08091E80082FFF2CF9C
:1016D00080E0089582E0089583E0089581E0089510
:1016E0002091EB013091EC012617370748F0611586
:1016F000710539F42091E8002E772093E80001C0AD
:10170000B901FC0120E06115710591F18091E401BE
:10171000882309F440C0853009F43FC08091E80077
:1017200083FD3DC08091E80082FD2FC08091E800DC
:1017300080FFE9CF2091F3008091F20090E0922B9E
:101740006115710559F08830910540F4249120937A
:10175000F1003196615071090196F2CF21E00897AE
:1017600009F020E08091E8008E778093E800CBCFED
:101770002111CCCF0AC08091E401882361F085302B
:1017800061F08091E80083FD0AC08091E80082FF4B
:10179000F2CF80E0089582E0089583E0089581E02B
:1017A0000895982F973058F59093E900981739F0DD
:1017B0007091EC002091ED005091F00003C0242FB7
:1017C000762F50E021FF19C03091EB003E7F30931F
:1017D000EB003091ED003D7F3093ED003091EB0058
:1017E00031603093EB007093EC002093ED00509348
:1017F000F0002091EE0027FF07C09F5FD3CF8F70CE
:101800008093E90081E0089580E008958091E501EA
:1018100087FF11C08091E80082FD05C08091E4013E
:101820008111F8CF11C08091E8008B770BC08091B7
:10183000E401882349F08091E80080FFF8CF80918F
:10184000E8008E778093E80008952091E4003091BD
:10185000E50095E64091EC00842F817040FF22C0A6
:101860008091E80080FD1CC08091E401882391F004
:10187000853091F08091EB0085FD10C04091E4002F
:101880005091E5004217530729F39A01915011F73F
:1018900084E0089582E0089583E0089581E008954A
:1018A00080E008954091E80042FFDECF08950E9455
:1018B000C50C0E94CD0CE0EEF0E080818160808359
:1018C000E8EDF0E080818F77808319BCA7EDB0E070
:1018D0008C918E7F8C9380818F7E80831092E30128
:1018E00008950F931F93CF93DF930E94C50C0E941E
:1018F000CD0CC8EDD0E088818F778883888180689F
:10190000888388818F7D888319BC1092E4011092AE
:10191000E0011092E2011092E10100EE10E0F80106
:1019200080818B7F808388818160888342E060E052
:1019300080E00E94D10BE1EEF0E080818E7F808319
:10194000E2EEF0E080818160808380818860808326
:10195000F80180818E7F8083888180618883DF9118
:10196000CF911F910F910895E8EDF0E080818F7E77
:101970008083E7EDF0E080818160808384E082BF36
:1019800081E08093E3010C94710CE8EDF0E080813C
:101990008E7F80831092E20008951092DA001092F8
:1019A000E10008951F920F920FB60F9211242F930A
:1019B0003F934F935F936F937F938F939F93AF93D7
:1019C000BF93EF93FF938091E10082FF0BC0809162
:1019D000E20082FF07C08091E1008B7F8093E100ED
:1019E0000E94390F8091DA0080FF1FC08091D800DB
:1019F00080FF1BC08091DA008E7F8093DA00809197
:101A0000D90080FF0DC080E189BD82E189BD09B4A4
:101A100000FEFDCF81E08093E4010E94310905C002
:101A200019BC1092E4010E943F098091E10080FFFF
:101A300019C08091E20080FF15C08091E2008E7F86
:101A40008093E2008091E20080618093E2008091C7
:101A5000D80080628093D80019BC85E08093E401AF
:101A60000E9443098091E10084FF30C08091E20030
:101A700084FF2CC080E189BD82E189BD09B400FEEC
:101A8000FDCF8091D8008F7D8093D8008091E100B8
:101A90008F7E8093E1008091E2008F7E8093E20050
:101AA0008091E20081608093E2008091E0018823D0
:101AB00011F084E007C08091E30087FD02C081E05F
:101AC00001C083E08093E4010E9445098091E10018
:101AD00083FF29C08091E20083FF25C08091E1004F
:101AE000877F8093E10082E08093E4011092E0011F
:101AF0008091E1008E7F8093E1008091E2008E7FF3
:101B00008093E2008091E20080618093E20042E0F5
:101B100060E080E00E94D10B8091F00088608093AB
:101B2000F0000E944209FF91EF91BF91AF919F9108
:101B30008F917F916F915F914F913F912F910F9076
:101B40000FBE0F901F9018951F920F920FB60F9215
:101B500011242F933F934F935F936F937F938F93B2
:101B60009F93AF93BF93CF93DF93EF93FF93C09176
:101B7000E900CF708091EC00D82FD17080FDD0E8C3
:101B80001092E9008091F000877F8093F0007894B4
:101B90000E94E80D1092E9008091F0008860809327
:101BA000F000CD2BCF70C093E900FF91EF91DF9152
:101BB000CF91BF91AF919F918F917F916F915F91E5
:101BC0004F913F912F910F900FBE0F901F9018953E
:101BD0001F93CF93DF93CDB7DEB7AA970FB6F894D4
:101BE000DEBF0FBECDBFE5EEF1E088E08E0F909135
:101BF000F10091938E13FBCF0E9461098091E80060
:101C000083FF1FC18091E5019091E601492F50E0CB
:101C10004A30510508F015C1FA01EA5AFF4F0C94F9
:101C2000F423803881F0823809F00BC18091E901FA
:101C30008F708093E9008091EB0085FB882780F905
:101C40001092E90006C08091E1019091E2019111AA
:101C500082609091E800977F9093E8008093F10074
:101C60001092F100C8C0282F2D7F09F0EAC0882308
:101C700019F0823061F0E5C08091E701813009F010
:101C8000E0C0933009F080E08093E2012BC08091A6
:101C9000E701811127C08091E9018F7009F4D1C05B
:101CA0008093E9002091EB0020FF1CC0933021F4C9
:101CB0008091EB00806214C09091EB009061909352
:101CC000EB0021E030E0A90102C0440F551F8A95C6
:101CD000E2F74093EA001092EA008091EB008860FE
:101CE0008093EB001092E9008091E800877F86C026
:101CF0008111A7C01091E7011F778091E3008078E0
:101D0000812B8093E3008091E800877F8093E80037
:101D10000E94060C8091E80080FFFCCF8091E300D8
:101D200080688093E300111102C082E001C083E06B
:101D30008093E40186C08058823008F082C0809190
:101D4000E7019091E8018C3D53E0950779F583E038
:101D50008A838AE289834FB7F894DE01139620E0E4
:101D60003EE051E2E32FF0E050935700E49120FF72
:101D700003C0E295EF703F5FEF708E2F90E0EA3086
:101D800010F0C79601C0C0968D939D932F5F2431AC
:101D900049F74FBF8091E800877F8093E8006AE2AF
:101DA00070E0CE0101960E940D0B14C0AE014F5F92
:101DB0005F4F6091E9010E94540ABC01892B09F42C
:101DC00040C09091E800977F9093E80089819A81C4
:101DD0000E94700B8091E8008B778093E80031C0FF
:101DE000803879F58091E800877F8093E8008091C2
:101DF000E0018093F1008091E8008E778093E80005
:101E00000E94060C1EC081111CC09091E701923007
:101E1000C0F48091E800877F8093E8009093E00110
:101E20000E94060C8091E001811106C08091E300C0
:101E300087FD02C081E001C084E08093E4010E943C
:101E40004D098091E80083FF0AC08091E800877FF8
:101E50008093E8008091EB0080628093EB00AA966B
:101E60000FB6F894DEBF0FBECDBFDF91CF911F91AB
:101E700008950895CF938091E4018823A1F0C09143
:101E8000E900CF709091EC00892F817090FD80E87F
:101E9000C82B1092E9008091E80083FD0E94E80DB4
:101EA000CF70C093E900CF9108959093690180931A
:101EB00068010895E0916801F0916901309721F07F
:101EC0000190F081E02D099480E00895E09168018F
:101ED000F0916901309721F00280F381E02D09949F
:101EE0000895E0916801F0916901309721F0048034
:101EF000F581E02D099408952091660130916701E4
:101F00008217930771F09093670180936601E091C7
:101F10006801F0916901309721F00680F781E02D8A
:101F20000994089520916401309165018217930707
:101F300071F09093650180936401E0916801F091E4
:101F40006901309721F00084F185E02D099408950E
:101F500008950C94A80F0E94C11B0E9468040C9461
:101F6000871CCF92DF92EF92FF920F931F93CF9334
:101F7000DF93CDB7DEB72B970FB6F894DEBF0FBE59
:101F8000CDBF0E9480048BE6C82E81E0D82E00E0F1
:101F900010E0E02E802F0E946E05F60141916F0146
:101FA000F42EF826B1F40F5F1F4F0E30110589F79C
:101FB0008FEF89838A831B820E94CA1B8160782FDE
:101FC0009D838C8349815A816B818D810E9454103D
:101FD00040C09091CD0191FF04C08B870E94740591
:101FE0008B8520E030E04F2D50E0922FBA01022E79
:101FF00002C0759567950A94E2F760FF24C02E83AE
:10200000EF8221E030E0690102C0CC0CDD1C9A9522
:10201000E2F790E08C219D21892B09F420E02887AC
:102020000E94CA1B8160782F9A8789874E815F81C1
:1020300068858A850E945410F801E559FE4F808119
:10204000C826C08206C02F5F3F4F2630310569F693
:10205000AACF0E946E1F10916A010E945A0F181792
:10206000A1F00E945A0F80936A012B960FB6F89444
:10207000DEBF0FBECDBFDF91CF911F910F91FF90BB
:10208000EF90DF90CF900C9450082B960FB6F894F9
:10209000DEBF0FBECDBFDF91CF911F910F91FF909B
:1020A000EF90DF90CF900895CF93DF93CDB7DEB759
:1020B0002B970FB6F894DEBF0FBECDBF4F83588766
:1020C00069877A878B87DE01119686E0FD01119280
:1020D0008A95E9F785E0FE01379601900D928A9581
:1020E000E1F749815A816B817C818D819E810E94BB
:1020F00084172B960FB6F894DEBF0FBECDBFDF91CD
:10210000CF9108950895CF93882309F4C2C0C82FB2
:10211000823859F40E945A0F81FDBBC089E30E94A6
:102120002D1A0E94FA1A89E30CC0833879F40E94B0
:102130005A0F80FDAEC083E50E942D1A0E94FA1A44
:1021400083E50E946F1ACF910C94FA1A843859F4DF
:102150000E945A0F82FD9DC087E40E942D1A0E94A2
:10216000FA1A87E4EECF8CEF8C0F813A48F48C2F6B
:102170000E94B02181118DC08C2F0E942D1AE3CFB7
:1021800080E28C0F883048F4C77081E001C0880F6E
:10219000CA95EAF70E94B31AD6CF8BE58C0F83302D
:1021A00078F4C53A29F0C63A31F083E890E005C0EA
:1021B00081E890E002C082E890E0CF910C947C0F1F
:1021C00088E58C0F833108F064C0C83A39F1C93A08
:1021D00041F1CA3A49F1CB3A51F1CC3A59F1CD3AF1
:1021E00061F1C03B69F1CE3A71F1CF3A79F1C13B6F
:1021F00081F1C23B89F1C33B91F1C43B99F1C53BED
:10220000A1F1C63BA9F1C73BB1F1C83BB9F1C93B4C
:10221000C1F1CA3BC9F180E090E038C082EE90E0A5
:1022200035C089EE90E032C08AEE90E02FC085EB99
:1022300090E02CC086EB90E029C087EB90E026C0B0
:102240008CEC90E023C08DEC90E020C083E891E01E
:102250001DC08AE891E01AC082E991E017C084E9C4
:1022600091E014C081E292E011C083E292E00EC0DE
:1022700084E292E00BC085E292E008C086E292E040
:1022800005C087E292E002C08AE292E0CF910C940E
:10229000920FCF910895882309F44BC0823859F4E6
:1022A0000E945A0F81FF45C089E30E942D1A0E94A7
:1022B000FA1A89E30CC0833871F40E945A0F80FF28
:1022C00038C083E50E942D1A0E94FA1A83E50E9405
:1022D0006F1A0C94FA1A843859F40E945A0F82FF2C
:1022E00028C087E40E942D1A0E94FA1A87E4EFCFD3
:1022F0009CEF980F913A58F390E2980F983050F471
:10230000877091E001C0990F8A95EAF7892F0E94A2
:10231000B91ADFCF9BE5980F933020F480E090E06E
:102320000C947C0F885A833120F480E090E00C9468
:10233000920F0895882321F00E94B31A0C94FA1A80
:102340000895882321F00E94B91A0C94FA1A08956E
:10235000BF92CF92DF92EF92FF920F931F93CF9392
:10236000DF9300D000D000D0CDB7DEB725E0FC0170
:10237000DE01119601900D922A95E1F7FC01D080C3
:1023800011810281258122952F7043815481452B33
:1023900009F4FCC21F3F21F4FFEFDF1609F4F6C277
:1023A0007C012E830E948210D9821A8369817A81EE
:1023B000802F0E94291A182FB92E0E94DE190E9420
:1023C000A5182E81002319F00E94D01A2E81EB2D22
:1023D000E295EF70F0E0E05AFF4F0C94F4238B2D60
:1023E000807F9B2D9F70F92E882319F0F29480EF47
:1023F000F822002389F0FF2009F475C280E2810FE2
:10240000883020F48F2D0E94B31A03C08F2D0E94B4
:10241000C31A0E94FA1A67C2812F0E944B11FF2033
:1024200009F4B4C2105E8F2D183018F40E94B91A46
:1024300002C00E94C91A26960FB6F894DEBF0FBEDE
:10244000CDBFDF91CF911F910F91FF90EF90DF9063
:10245000CF90BF900C94FA1A3B2D307F8B2D8F704C
:10246000303211F08295807F112319F0113021F163
:102470002CC00023B9F0222309F4A0C1213009F0B7
:102480009DC126960FB6F894DEBF0FBECDBFDF917B
:10249000CF911F910F91FF90EF90DF90CF90BF9061
:1024A0000C94E31A222319F0213009F46FC28E83B1
:1024B0000E94E61A8E8196C1002321F0223008F096
:1024C00065C27CC1211162C28DC1002321F022238B
:1024D00009F474C108C2222309F484C119C22B2D46
:1024E00026952695237030E02115310521F0213005
:1024F0003105D1F04BC2002321F0812F9B2D937029
:1025000002C080E090E026960FB6F894DEBF0FBEC2
:10251000CDBFDF91CF911F910F91FF90EF90DF9092
:10252000CF90BF900C947C0F002321F0812F9B2D26
:10253000937002C080E090E026960FB6F894DEBF5C
:102540000FBECDBFDF91CF911F910F91FF90EF9004
:10255000DF90CF90BF900C94920F812F002319F041
:102560000E94761E02C00E94DE1E26960FB6F894C8
:10257000DEBF0FBECDBFDF91CF911F910F91FF90B6
:10258000EF90DF90CF90BF900C94631F8B2D8370E2
:1025900009F07BC00111FAC1812F82958695877061
:1025A000880F880F912F9F70C92ED12CE12CF12C10
:1025B000082E04C0CC0CDD1CEE1CFF1C0A94D2F7C4
:1025C00014FF12C04FE050E060E070E004C0440F20
:1025D000551F661F771F8A95D2F7CB01BA01609508
:1025E00070958095909503C060E070E0CB012B2D35
:1025F000269526952370422F50E042305105D9F0A0
:102600004330510569F16C297D298E299F2941307C
:10261000510551F126960FB6F894DEBF0FBECDBF1F
:10262000DF91CF911F910F91FF90EF90DF90CF90AE
:10263000BF900C94CC186C297D298E299F29269651
:102640000FB6F894DEBF0FBECDBFDF91CF911F91C3
:102650000F91FF90EF90DF90CF90BF900C94E8180F
:102660000E94CC18C701B60126960FB6F894DEBFBB
:102670000FBECDBFDF91CF911F910F91FF90EF90D3
:10268000DF90CF90BF900C94B018002319F08B2DE1
:10269000817001C08695882309F478C1812F8295C5
:1026A00086958770880F880F912F9F70C92ED12C27
:1026B000E12CF12C082E04C0CC0CDD1CEE1CFF1C00
:1026C0000A94D2F714FF12C04FE050E060E070E0CF
:1026D00004C0440F551F661F771F8A95D2F7CB01A0
:1026E000BA01609570958095909503C060E070E0A8
:1026F000CB012B2D269526952370422F50E042309A
:102700005105D9F04330510569F16C297D298E2995
:102710009F294130510551F126960FB6F894DEBF3E
:102720000FBECDBFDF91CF911F910F91FF90EF9022
:10273000DF90CF90BF900C94A6196C297D298E292B
:102740009F2926960FB6F894DEBF0FBECDBFDF914E
:10275000CF911F910F91FF90EF90DF90CF90BF909E
:102760000C94C2190E94A619C701B60126960FB68D
:10277000F894DEBF0FBECDBFDF91CF911F910F91B7
:10278000FF90EF90DF90CF90BF900C948A19103F8C
:10279000D1F118F4103E50F4A1C0123F09F463C007
:1027A00008F44CC0133F09F473C098C01F708B2D00
:1027B0008F710023A1F00E942319812F26960FB656
:1027C000F894DEBF0FBECDBFDF91CF911F910F9167
:1027D000FF90EF90DF90CF90BF900C949A110E94E1
:1027E0004419812F26960FB6F894DEBF0FBECDBFD9
:1027F000DF91CF911F910F91FF90EF90DF90CF90DD
:10280000BF900C94A1110023A9F02111BFC08B2D02
:102810008F7126960FB6F894DEBF0FBECDBFDF9145
:10282000CF911F910F91FF90EF90DF90CF90BF90CD
:102830000C946919223008F0A9C0E9CF0023A9F04F
:102840008B2D8F7126960FB6F894DEBF0FBECDBFCD
:10285000DF91CF911F910F91FF90EF90DF90CF907C
:10286000BF900C942319002359F38B2D8F7126965A
:102870000FB6F894DEBF0FBECDBFDF91CF911F9191
:102880000F91FF90EF90DF90CF90BF900C94441980
:10289000002399F08B2D8F7126960FB6F894DEBF2A
:1028A0000FBECDBFDF91CF911F910F91FF90EF90A1
:1028B000DF90CF90BF900C940E1926960FB6F89427
:1028C000DEBF0FBECDBFDF91CF911F910F91FF9063
:1028D000EF90DF90CF90BF900C9404190023A9F0E3
:1028E000222309F4ADCF812F26960FB6F894DEBFD0
:1028F0000FBECDBFDF91CF911F910F91FF90EF9051
:10290000DF90CF90BF900C948310222309F4ADCFB9
:10291000812F26960FB6F894DEBF0FBECDBFDF9194
:10292000CF911F910F91FF90EF90DF90CF90BF90CC
:102930000C944B114B2D4F70612FC7010E94040363
:1029400026960FB6F894DEBF0FBECDBFDF91CF91B4
:102950001F910F91FF90EF90DF90CF90BF900C945C
:1029600028184B2D4F70612FC70126960FB6F8948B
:10297000DEBF0FBECDBFDF91CF911F910F91FF90B2
:10298000EF90DF90CF90BF900C94750526960FB610
:10299000F894DEBF0FBECDBFDF91CF911F910F9195
:1029A000FF90EF90DF90CF90BF9008950E94D01AD3
:1029B0000E94E01A0E94A51A0E94FA1A0E9413208F
:1029C0000E94631F80E090E00E947C0F80E090E016
:1029D0000C94920F0E94C01A0C94D6140E941E1AD6
:1029E000292F22952F7030E02C3031054CF42A30FD
:1029F00031056CF4225031092230310588F407C0CA
:102A00002C30310549F02F30310531F009C0803EBE
:102A100048F0803F29F406C093FB882780F9089589
:102A200080E0089581E00895CF93DF9300D000D037
:102A30001F92CDB7DEB70F900F900F900F900F90B1
:102A4000DF91CF910895CF93DF9300D000D000D0D5
:102A5000CDB7DEB726960FB6F894DEBF0FBECDBF5A
:102A6000DF91CF9108951F93CF93DF93C0917901A8
:102A700016E080917A01C81799F0D0E01C9FF00110
:102A80001D9FF00D1124E558FE4F40815181628158
:102A90007381848195810E9423152196C770E9CFA7
:102AA000DF91CF911F9108954091AB015091AC01FE
:102AB0006091AD017091AE018091AF019091B00134
:102AC0000C9423158091B00182958F7009F054C049
:102AD0008091AD01882309F44FC080917901A091C4
:102AE0007A016091AB017091AC014091AE015091BF
:102AF000AF01B6E08A1709F43FC090E041155105D7
:102B0000C1F17F3F11F46F3FA1F1B89FF001B99F70
:102B1000F00D1124E558FE4F218172132AC0208147
:102B2000621327C02281211124C0238134812417FC
:102B3000350710F421503109241B350B283C310591
:102B4000C0F42091B0012F7020612093B00126E0E5
:102B5000289FF001299FF00D1124E058FE4F80813D
:102B60008F70806180838BEA91E00E94A8110C94A1
:102B7000331501968770BECF0895CF92DF92EF9202
:102B8000FF920F931F93CF93DF93CDB7DEB762977A
:102B90000FB6F894DEBF0FBECDBF8C0185E0F80103
:102BA000DE011D9601900D928A95E1F7D8014C91B6
:102BB00011965C91119712966C9112971396CD9085
:102BC000DC9014973091AB017091AC018091AE0113
:102BD0009091AF01009709F46BC17F3F19F43F3F1B
:102BE00009F466C1E090AD01EE2009F4C0C0209167
:102BF000B001C816D90628F0F601E81BF90BCF0181
:102C000004C0809590958C0D9D1DFF24F394883C05
:102C1000910578F0F12C207F09F0C6C07C2DD98A6F
:102C2000C88A89890E9414158BEA91E00E94A81134
:102C3000B1C0822F807F09F046C0751314C03413D1
:102C400012C0611110C02F7020612093B0010E944A
:102C500054158BEA91E00E94A8118091B001D8012F
:102C600015968C932EC0CD2819F15F3F11F44F3F7C
:102C7000F9F0F62E61111CC08091790120917A0142
:102C800036E0821709F45AC090E0389FF001399F6E
:102C9000F00D1124E558FE4F7181571306C0708165
:102CA000471303C07281711103C001968770E9CF89
:102CB000F62E662309F418C18091B00181608093DB
:102CC000B001F12C11C1751308C0341306C0611195
:102CD00004C08091B001D801C3C04D875E878D8547
:102CE0009E856A8B0E94EE146A898823E1F166232F
:102CF000D1F12091B001822F82958F7090E00297E0
:102D000074F08091AB019091AC0198878F83198604
:102D1000DB86CA862C87CE0107960E94A81186E022
:102D2000F801ABEAB1E001900D928A95E1F70E94BB
:102D300062150E945415FF24F394D6C04D875E8718
:102D40008D859E850E941E1A292F22952F7030E0B6
:102D5000223031050CF0BCC09F7009F0B6C0805E17
:102D6000883008F4C1C0C8010E94A811E4CFC81679
:102D7000D90608F453C0F601E81BF90BCF01883CD3
:102D8000910508F450C0F12C7C2DD98AC88A898914
:102D90000E941415EBEAF1E086E0DF011D928A95AE
:102DA000E9F70E945415A0C0751314C0341312C063
:102DB000611110C08091B001F8018583C8010E94A3
:102DC000A81186E0EBEAF1E0DF011D928A95E9F7B0
:102DD000FE2C8AC04D875E878D859E856A8B0E94FA
:102DE000EE146A89882309F4BECF662309F4BBCFA9
:102DF0002091B001822F82958F7090E002970CF4A1
:102E00008ECF8091AB019091AC019A8389831B8214
:102E1000DD82CC822E83CE0101967FCF8095909566
:102E20008C0D9D1DACCFF62E662309F49CCF751337
:102E30002EC034132CC02091B00120FD1FC0822F62
:102E400082958F70D9F0D80115962C9315978F30F5
:102E500049F08F5F982F9295907F822F8F70892BEA
:102E600015968C93C8010E94A81186E0F801ABEA80
:102E7000B1E001900D928A95E1F793CF86E0F801D9
:102E8000ABEAB1E001900D928A95E1F72DC04D8734
:102E90005E878D859E850E94EE14811140CF8091C2
:102EA000B00181608093B001C8010E94A8111CC0CC
:102EB000662309F458CF4D875E878D859E850E94D5
:102EC000EE14882309F44FCF2ACF811148CF0CC0CC
:102ED000243031050CF047CF9F7009F440CFF80142
:102EE0009581907F09F03BCF8F2D62960FB6F894B5
:102EF000DEBF0FBECDBFDF91CF911F910F91FF902D
:102F0000EF90DF90CF9008951F93CF93DF93CDB7CD
:102F1000DEB72C970FB6F894DEBF0FBECDBF4F8340
:102F2000588769877A878B879C87CE0107960E948E
:102F3000BD15882369F08F8198852A853B85232BD1
:102F4000F1F19F3F09F063C08F3F09F060C037C0C7
:102F500086E0FE013796DE01119601900D928A956A
:102F6000E1F76F817885EA85FB85309741F17F3FF6
:102F700011F46F3F21F120917A0130E0C9010196EF
:102F8000877099274091790150E08417950709F4DB
:102F900047C069837A83FD83EC8396E0929FD001DA
:102FA000939FB00D1124A558BE4FFE01319601909C
:102FB0000D929A95E1F780937A010E94331516E0FD
:102FC0008091790190917A018917C1F1189FC00110
:102FD000112485589E4F0E94BD15882379F1E091F8
:102FE00079011E9FF0011124E558FE4F4081518167
:102FF00062817381848195810E942315809179017A
:1030000090E001968770992780937901D9CF4F81FD
:10301000588569857A858B859C850E942315CFCF3D
:103020000E94EA1410927A0110927901EBEAF1E021
:1030300086E0DF011D928A95E9F7C1CF2C960FB685
:10304000F894DEBF0FBECDBFDF91CF911F910895E1
:10305000EF92FF920F931F93CF93DF938C01892BF5
:1030600009F46CC0F12CEE24E394E8012196F801F8
:103070008491843740F4843008F051C0813081F06D
:10308000823019F15BC0853709F444C0A8F19CE790
:10309000980F903708F052C08F770E944B1141C0B3
:1030A0000E5F1F4FFE01C49180E28C0F883048F400
:1030B000C7708E2D01C0880FCA95EAF70E94D31AF7
:1030C00014C08C2F0E9483102DC00E5F1F4FFE0175
:1030D000C49180E28C0F883058F4C7708E2D01C0E7
:1030E000880FCA95EAF70E94D91A0E94FA1A1AC0E4
:1030F0008C2F0E944B1116C00E5F1F4FFE01C49112
:10310000CC2381F08FE99FE00197F1F700C0000028
:10311000C150F6CF0E5F1F4FFE01F49003C00E9416
:1031200083108E018F2D882309F49FCFEFE9FFE0F4
:103130003197F1F700C000008150F5CFDF91CF91BA
:103140001F910F91FF90EF90089508956093B5013E
:103150007093B6018093B7019093B8010C94D61484
:103160000F931F930091B5011091B6012091B70103
:103170003091B801DC01CB01802B912BA22BB32B1A
:103180008093B5019093B601A093B701B093B801B5
:103190001F910F910C94D6140F931F930091B501BA
:1031A0001091B6012091B7013091B801DC01CB013B
:1031B00080239123A223B3238093B5019093B6017A
:1031C000A093B701B093B8011F910F910C94D6143E
:1031D0000F931F930091B5011091B6012091B70193
:1031E0003091B801DC01CB0180279127A227B327BA
:1031F0008093B5019093B601A093B701B093B80145
:103200001F910F910C94D6141092B1011092B2013B
:103210001092B3011092B4010C94D61441E050E026
:1032200060E070E004C0440F551F661F771F8A9549
:10323000D2F74093B1015093B2016093B301709300
:10324000B4010C94D61441E050E060E070E004C09A
:10325000440F551F661F771F8A95D2F78091B101E1
:103260009091B201A091B301B091B401482B592BB8
:103270006A2B7B2B4093B1015093B2016093B30151
:103280007093B4010C94D61441E050E060E070E01B
:1032900004C0440F551F661F771F8A95D2F74095CB
:1032A0005095609570958091B1019091B201A09177
:1032B000B301B091B401482359236A237B2340937F
:1032C000B1015093B2016093B3017093B4010C94B7
:1032D000D61441E050E060E070E004C0440F551F98
:1032E000661F771F8A95D2F78091B1019091B20144
:1032F000A091B301B091B401482759276A277B27D1
:103300004093B1015093B2016093B3017093B40143
:103310000C94D6140F931F930091B1011091B20138
:103320002091B3013091B401DC01CB01802B912BB2
:10333000A22BB32B8093B1019093B201A093B30160
:10334000B093B4011F910F910C94D6140F931F9357
:103350000091B1011091B2012091B3013091B401FB
:10336000DC01CB0180239123A223B3238093B101FD
:103370009093B201A093B301B093B4011F910F9148
:103380000C94D6140F931F930091B1011091B201C8
:103390002091B3013091B401DC01CB01802791274A
:1033A000A227B3278093B1019093B201A093B301F8
:1033B000B093B4011F910F910C94D6140895CF923D
:1033C000DF92EF92FF920F931F93CF93DF938C01C5
:1033D000C090B501D090B601E090B701F090B8016F
:1033E0008091B1019091B201A091B301B091B4016B
:1033F000C82AD92AEA2AFB2ACFE1D0E0D701C601A0
:103400000C2E04C0B695A795979587950A94D2F788
:1034100080FF06C0B8018C2F0E94B507019721F4E8
:10342000219760F780E001C08C2FDF91CF911F9131
:103430000F91FF90EF90DF90CF900895CF93DF939F
:10344000EC010E94DF19BE010E94B507DF91CF9108
:103450000895CB010E941E1A089590910C019923A2
:1034600021F090910D01911109C020910E01309130
:103470000F01F90132969FEF40E01FC0982F9695FB
:10348000969596959F3050F5E0910E01F0910F01C1
:10349000E90FF11D877021E030E0A90102C0440F5F
:1034A000551F8A95E2F7CA019181892B818308957E
:1034B0009F3F39F04F5F4E3041F051915813F8CF94
:1034C0000DC05111F7CF942FF5CF9F3F39F0F9017F
:1034D000E90FF11D97FDFA95828308950895909163
:1034E0000C01992321F090910D01911109C02091B7
:1034F0000E0130910F01F9013296205F3F4F1FC03E
:10350000982F9695969596959F30F0F4E0910E0140
:10351000F0910F01E90FF11D877021E030E0A90162
:1035200002C0440F551F8A95E2F7CA018095918128
:103530008923818308953196E217F30729F090815A
:103540009813F9CF1082F7CF089581E090E0E091D1
:103550000E01F0910F01E80FF91F108201968031E2
:103560009105A9F708959091CC01892B8093CC0106
:10357000089580959091CC0189238093CC01089582
:103580001092CC0108959091CB01892B8093CB01AF
:10359000089580959091CB0189238093CB01089564
:1035A0001092CB0108959091CA01892B8093CA0192
:1035B000089580959091CA0189238093CA01089546
:1035C0001092CA0108958093B90108951092B9012B
:1035D000089580910E0190910F01FC0131969C019C
:1035E000205F3F4F80E0919191118F5FE217F307C9
:1035F000D1F70895E0910E01F0910F018091CC0177
:103600008083E0910E01F0910F0190818091CB01B8
:10361000892B8083E0910E01F0910F0190818091C0
:10362000CA01892B80838091B901882361F0E091E0
:103630000E01F0910F019081892B80830E94E91A7D
:1036400081111092B90180910E0190910F010C949B
:10365000660FCF92DF92EF92FF926C01EE24FF246F
:10366000C114D104E104F10421F0C701B60120E145
:1036700001C020E0C72ED82EE92EFF24C114D104AA
:10368000E104F10419F0285FC701B6016B017C0168
:1036900054E0F694E794D794C7945A95D1F7C1149F
:1036A000D104E104F10419F02C5FC701B6016B01EC
:1036B0007C0142E0F694E794D794C7944A95D1F7F9
:1036C000C114D104E104F10419F02E5FC701B60161
:1036D000DC01CB01B695A79597958795892B8A2B09
:1036E0008B2B09F02F5F822FFF90EF90DF90CF9010
:1036F00008958091E401843039F11092CE0120E4E4
:1037000088E190E00FB6F894A895809360000FBE12
:103710002093600080E00E94500883B7817F84601E
:1037200083BF83B7816083BF7894889583B78E7F8A
:1037300083BF0FB6F894A89580916000886180934C
:103740006000109260000FBE089508950895CF9311
:103750000E94A51B0E9480040E94A61BC0E08C2F23
:103760000E946E05811104C0CF5FCE30C1F701C049
:1037700081E0CF9108950E94EA140E945A0F0C94A0
:10378000500882E084BD93E095BD9AEF97BD809389
:103790006E0008952FB7F8948091CF019091D001D9
:1037A000A091D101B091D2012FBF0895CF92DF92A5
:1037B000EF92FF920F931F932FB7F8944091CF0190
:1037C0005091D0016091D1017091D2012FBF6A0157
:1037D0007B01EE24FF248C0120E030E0C016D106EE
:1037E000E206F30610F4415051099A01281B390BE7
:1037F000C9011F910F91FF90EF90DF90CF90089536
:103800001F920F920FB60F9211248F939F93AF9335
:10381000BF938091CF019091D001A091D101B0913F
:10382000D2010196A11DB11D8093CF019093D001CB
:10383000A093D101B093D201BF91AF919F918F918D
:103840000F900FBE0F901F9018950E94570CF89480
:103850002FEF87EA91E6215080409040E1F700C0C9
:10386000000087E090EBDC018093EE019093EF0184
:10387000A093F001B093F1019CE088E10FB6F894B9
:10388000A895809360000FBE90936000FFCFEF92E9
:10389000FF920F931F93CF93DF93D82FC0E08C2F0D
:1038A0000E946E0500E010E0E82EF12CC701002E0A
:1038B00002C0959587950A94E2F780FD06C00F5FD8
:1038C0001F4F0630110591F709C0602F7C2F80E053
:1038D0000E947605D813F3CF81E004C0CF5FCE30CD
:1038E000F1F680E0DF91CF911F910F91FF90EF9063
:1038F0000895CF93C82F8CE20E94471C882321F0A3
:103900008C2FCF910C94471C80E0CF910895CF93DA
:103910000E94CE1D811102C00E94B41DC5E6C15097
:1039200049F00E9480048FE39CE90197F1F700C001
:103930000000F5CF89E20E94791C811113C18AE24F
:103940000E94791C81110E94B41D85E00E94791C9F
:1039500081110E94251C0E94D91D8093CD0187E012
:103960000E94791C8823A9F18BE10E94791C88238D
:1039700051F08091CD0181FB222720F991E092271F
:1039800090FB81F90EC08EE00E94791C882361F0C3
:103990008091CD0182FB222720F991E0922790FBB4
:1039A00082F98093CD0115C080E10E94791C90912D
:1039B000CD01882341F093FB222720F981E0822763
:1039C00080FB93F904C0892F809580FB90F9909338
:1039D000CD018091CD010E94DD1D0E94EB1D8093E1
:1039E000ED0180EE0E94791C882341F08091ED0169
:1039F000982F909590FB80F98093ED0189E30E94C8
:103A0000791C882359F08091ED0181FB222720F950
:103A100091E0922790FB81F98093ED0182EE0E9464
:103A2000791C882359F08091ED0182FB222720F92F
:103A300091E0922790FB82F98093ED0186EE0E943F
:103A4000791C882359F08091ED0183FB222720F90E
:103A500091E0922790FB83F98093ED0183EE0E9421
:103A6000791C882359F08091ED0184FB222720F9ED
:103A700091E0922790FB84F98093ED0185E30E9409
:103A8000791C882359F08091ED0185FB222720F9CC
:103A900091E0922790FB85F98093ED0181E30E94EC
:103AA000791C882359F08091ED0186FB222720F9AB
:103AB00091E0922790FB86F98093ED0181E10E94CD
:103AC000791C882359F08091ED0187FB222720F98A
:103AD00091E0922790FB87F98093ED018091ED01B1
:103AE0000E94EF1D8091ED0187FB882780F980936C
:103AF0000D0187E20E94791CC82F8EE10E94791C7B
:103B00008111C2608FE10E94791C8111C46080E242
:103B10000E94791C8111C86081E20E94791C811188
:103B2000C06182E20E94791C8111C06283E20E941E
:103B3000791C8111C06484E20E94791C882311F0F1
:103B4000C06802C0CC2329F08C2F0E94E61D6C2F88
:103B500003C00E94E21D682F70E080E090E0CF91EA
:103B60000C94A618CF9108956DEE7EEF80E090E062
:103B70000E942E2460E082E090E00E941C2460E01D
:103B800083E090E00E941C2460E084E090E00E94CA
:103B90001C2460E085E090E00C941C2480E090E020
:103BA0000E94162421E08D3E9E4F09F020E0822FD6
:103BB000089582E090E00C940E24682F82E090E05B
:103BC0000C941C2483E090E00C940E24682F83E076
:103BD00090E00C941C2484E090E00C940E24682F58
:103BE00084E090E00C941C248091D50180FF0BC0F0
:103BF0006091130185E0689FB00111247595679568
:103C0000759567952BC081FF09C06091130185E010
:103C1000689FB00111247595679520C082FF07C089
:103C20006091130185E0689FB001112417C0909145
:103C3000D6019923D1F060911201961788F720914F
:103C4000130185E0289F90011124929FA001939F6A
:103C5000500D112470E0CA010E94E0236038710504
:103C600040F46115710539F002C065E070E0862FFF
:103C700008958FE7089581E008958091D50180FF30
:103C800008C06091110170E075956795759567950D
:103C900021C081FF06C06091110170E075956795A4
:103CA00019C082FF04C06091110170E010C09091B2
:103CB000D6019923C1F0609110019617A0F7809169
:103CC0001101899FC001112470E00E94E023603837
:103CD000710528F46115710521F0862F08958FE78D
:103CE000089581E0089561E070E0F4CF803F21F411
:103CF0000E94F41D819504C0813F29F40E94F41DA7
:103D00008093D9010895823F21F40E94F41D81958A
:103D100004C0833F29F40E94F41D8093D8010895C4
:103D2000893F19F40E943D1E05C08A3F31F40E946C
:103D30003D1E81958093DA0108958B3F21F40E9406
:103D40003D1E819504C08C3F29F40E943D1E809346
:103D5000DB010895843F21F48091D701816017C071
:103D6000853F21F48091D701826011C0863F21F404
:103D70008091D70184600BC0873F21F48091D701E7
:103D8000886005C0883F31F48091D70180618093BD
:103D9000D70108958D3F21F48091D50181600BC03A
:103DA0008E3F21F48091D501826005C08F3F29F4B8
:103DB0008091D50184608093D5010895803F39F4C6
:103DC0008091D90187FF6CC01092D90169C0813FF1
:103DD00029F48091D9011816BCF362C09091D801E2
:103DE000823F29F497FF5CC01092D80159C0833FED
:103DF00019F41916CCF354C0893F41F48091DA01CB
:103E000018160CF04DC01092DA014AC08A3F29F40E
:103E10008091DA0187FF44C0F6CF8B3F39F480915F
:103E2000DB0187FF3DC01092DB013AC08C3F29F4D3
:103E30008091DB011816BCF333C0843F21F48091DC
:103E4000D7018E7F17C0853F21F48091D7018D7FE8
:103E500011C0863F21F48091D7018B7F0BC0873F33
:103E600021F48091D701877F05C0883F31F480918C
:103E7000D7018F7E8093D70113C08D3F21F48091AD
:103E8000D5018E7F0BC08E3F21F48091D5018D7FAF
:103E900005C08F3F29F48091D5018B7F8093D50198
:103EA0008091D80181110EC08091D90181110AC081
:103EB0008091DA01811106C08091DB01811102C07D
:103EC0001092D601089587ED91E00E94710F0E9433
:103ED000CA1B9093D4018093D30108951F93CF936D
:103EE000DF938091D3019091D4010E94D61BAC0145
:103EF0009091D601992321F02091140130E006C061
:103F0000209115018AE0289F900111244217530740
:103F100008F485C08091D801C091D901D091DA010F
:103F20001091DB01811107C0C11175C0D11173C09F
:103F3000111171C074C09F3F19F09F5F9093D6011B
:103F4000181624F40E94F41D8093D8018091D801A2
:103F500087FF05C00E94F41D81958093D8011C162F
:103F600024F40E94F41D8093D9018091D90187FF28
:103F700005C00E94F41D81958093D9016091D801FC
:103F8000662331F1C091D901CC2311F1062E000C2A
:103F9000770B880B990B0E94E72223E333E343E37B
:103FA0005FE30E944B230E94AF226093D8016C2FE5
:103FB000CC0F770B880B990B0E94E72223E333E3A6
:103FC00043E35FE30E944B230E94AF226093D90139
:103FD0001D1624F40E943D1E8093DA018091DA01BF
:103FE00087FF05C00E943D1E81958093DA0111165E
:103FF00024F40E943D1E8093DB018091DB0187FF4A
:1040000005C00E943D1E81958093DB01DF91CF9119
:104010001F910C94631F9F3F09F08FCF97CFDF91C3
:10402000CF911F910895E7EDF1E085E0DF011D924A
:104030008A95E9F71092D6011092D5010895833040
:1040400081F128F4813059F08230D1F00895853023
:1040500009F449C0B8F1863009F456C0089580913A
:104060001501262F30E0280F311D2F3F310524F494
:10407000680F6093150108958FEF809315010895DF
:1040800080911401262F30E0280F311D2F3F31057C
:1040900024F4680F6093140108958FEF8093140146
:1040A000089580911301262F30E0280F311D2F3FF6
:1040B000310524F4680F6093130108958FEF809306
:1040C0001301089580911201262F30E0280F311D31
:1040D0002F3F310524F4680F6093120108958FEF8C
:1040E00080931201089580911101262F30E0280F4E
:1040F000311D2F3F310524F4680F6093110108959D
:104100008FEF80931101089580911001262F30E0E8
:10411000280F311D2F3F310524F4680F60931001E3
:1041200008958FEF809310010895833011F128F4E2
:10413000813049F0823091F00895853081F120F18D
:104140008630C1F1089580911501681720F4861B0F
:10415000809315010895109215010895809114011E
:10416000681720F4861B809314010895109214019F
:10417000089580911301681720F4861B8093130122
:10418000089510921301089580911201681720F488
:10419000861B809312010895109212010895809158
:1041A0001101681720F4861B809311010895109265
:1041B0001101089580911001681720F4861B8093E7
:1041C000100108951092100108950F931F938D31DF
:1041D00009F46BC008F03FC08E3009F47FC0C0F412
:1041E000873009F469C068F4863009F0B1C0809165
:1041F000CD01817F8E7F8093CD0181E08093DD01B1
:10420000A8C0883009F4A2C08B3009F49FC0A0C0B8
:10421000863109F49BC078F4803109F472C0813191
:1042200009F096C00E94EA1490910D0181E089275F
:1042300080930D018BC0893109F488C08B3109F05E
:1042400087C08091CD0181FB222720F991E0922740
:1042500090FB81F94CC0853309F470C048F4873273
:1042600009F46CC008F459C0893209F467C070C001
:10427000833438F48A3308F04EC0883309F466C0BA
:1042800067C0833409F45AC0883409F061C00E94C1
:10429000EA140FEF13ED20E3015010402040E1F746
:1042A00000C000000E94251C51C00E9469220E948B
:1042B0005A0F0E9450084AC09091CD01892F8095D5
:1042C000817080FB90F929F0966098609093CD0101
:1042D00040C0997F977F9093CD0138C08091CD01E8
:1042E00082FB222720F991E0922790FB82F98093AC
:1042F000CD01992359F18091CD0181608093CD0149
:1043000025C08091CD0183FB222720F991E09227DF
:1043100090FB83F9ECCF895301C08D5141E050E00F
:1043200060E070E08A019B0104C0000F111F221F92
:10433000331F8A95D2F7C901B80104C061E070E06B
:1043400080E090E00E94A6180E94EA1481E001C07B
:1043500080E01F910F91089580E0089580E0089516
:10436000CF93C82F8091DD01813079F018F0823031
:10437000E9F187C0E0910E01F0910F018081813158
:1043800069F0823209F07FC009C0E0910E01F0911E
:104390000F018081813111F0823261F48C2F0E94F3
:1043A000AC21811104C08C2F0E94E5201DC081E04A
:1043B00090E01AC08C2F0E94AE21811114C0C4312C
:1043C00079F048F4CB3079F0C03109F060C082E078
:1043D0008093DD0108C0C93219F0C83321F057C0FD
:1043E0001092DD0154C081E0817053C0C93289F15F
:1043F00018F5C43171F1A8F4C73009F046C08AE05D
:104400008093150194E19093140193E0909313012C
:104410008093120188E08093110188E2809310015B
:1044200034C0CE51C63088F5EC2FF0E0E65DFE4F8B
:1044300080818093DC0129C0CE34E9F020F4CB34B4
:1044400021F56AE013C0C13579F0C235F1F461E0BD
:104450000DC08091DC01882319F01092DC0115C099
:1044600081E08093DD0115C061E006C08091DC0130
:104470000E941F200AC06AE08091DC010E94952002
:1044800004C01092DD0180E004C081E002C080E041
:10449000ABCFCF910895E1E8F0E080818860808320
:1044A0008081816080838FB7F89493E09093890036
:1044B00090ED909388008FBF0895EFE6F0E0808143
:1044C000826080830895EFE6F0E080818D7F8083B5
:1044D0000895EFE6F0E0908182E0892780830895D7
:1044E0001F920F920FB60F9211242F933F934F9369
:1044F0005F936F937F938F939F93AF93BF93EF934C
:10450000FF938091DE019091DF0101969093DF018E
:104510008093DE01811103C082E00E945008E09187
:10452000DF01E695E695F0E0EA5CFA4FE4918091D0
:10453000DE018E1303C080E00E945008FF91EF91CE
:10454000BF91AF919F918F917F916F915F914F91AB
:104550003F912F910F900FBE0F901F9018950E94C2
:10456000B6226894B1110C94452308950E942A2321
:1045700088F09F5798F0B92F9927B751B0F0E1F024
:10458000660F771F881F991F1AF0BA95C9F714C0D4
:10459000B13091F00E944423B1E008950C9444237B
:1045A000672F782F8827B85F39F0B93FCCF386950D
:1045B00077956795B395D9F73EF49095809570956A
:1045C00061957F4F8F4F9F4F0895E89409C097FBE7
:1045D0003EF490958095709561957F4F8F4F9F4FDA
:1045E0009923A9F0F92F96E9BB279395F69587951E
:1045F00077956795B795F111F8CFFAF4BB0F11F4E1
:1046000060FF1BC06F5F7F4F8F4F9F4F16C0882387
:1046100011F096E911C0772321F09EE8872F762FBD
:1046200005C0662371F096E8862F70E060E02AF0FE
:104630009A95660F771F881FDAF7880F96958795EA
:1046400097F9089557FD9058440F551F59F05F3F53
:1046500071F04795880F97FB991F61F09F3F79F0A4
:1046600087950895121613061406551FF2CF469526
:10467000F1DF08C0161617061806991FF1CF8695A8
:104680007105610508940895E894BB27662777278C
:10469000CB0197F908950E945E230C94CF230E94CA
:1046A000C12338F00E94C82320F0952311F00C9408
:1046B000B8230C94BE2311240C9445230E9422237A
:1046C00070F3959FC1F3950F50E0551F629FF00165
:1046D000729FBB27F00DB11D639FAA27F00DB11D7E
:1046E000AA1F649F6627B00DA11D661F829F222707
:1046F000B00DA11D621F739FB00DA11D621F839F8E
:10470000A00D611D221F749F3327A00D611D231F63
:10471000849F600D211D822F762F6A2F11249F57B1
:1047200050409AF0F1F088234AF0EE0FFF1FBB1FB4
:10473000661F771F881F91505040A9F79E3F510573
:1047400080F00C94B8230C9445235F3FE4F3983E2B
:10475000D4F3869577956795B795F795E7959F5F1D
:10476000C1F7FE2B880F911D9695879597F90895AF
:1047700097F99F6780E870E060E008959FEF80EC14
:10478000089500240A9416161706180609060895B7
:1047900000240A9412161306140605060895092E1D
:1047A0000394000C11F4882352F0BB0F40F4BF2B8C
:1047B00011F460FF04C06F5F7F4F8F4F9F4F0895CC
:1047C00097FB072E16F4009407D077FD09D00E94BE
:1047D000FA2307FC05D03EF4909581959F4F0895EC
:1047E000709561957F4F0895EE0FFF1F0590F4912E
:1047F000E02D0994AA1BBB1B51E107C0AA1FBB1FD8
:10480000A617B70710F0A61BB70B881F991F5A955C
:10481000A9F780959095BC01CD010895F999FECF37
:1048200092BD81BDF89A992780B50895A8E1B0E0BE
:1048300042E050E00C943624262FF999FECF92BD29
:1048400081BDF89A019700B4021639F01FBA20BD55
:104850000FB6F894FA9AF99A0FBE08950196272F89
:104860000E941D240C941C24DC01CB01FC01F9994D
:10487000FECF06C0F2BDE1BDF89A319600B40D92AC
:0C48800041505040B8F70895F894FFCF65
:10488C0020025208E008BD08890855080101BA0148
:10489C0028080A03140A3F4D3639F704AA04740495
:1048AC003B04CE03E70300041904010203040506CC
:0448BC0007080900E0
:00000001FF

@ -5,8 +5,8 @@
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
#define STEN 3 // steno
#define STEN 2 // steno
#define MDIA 3 // media keys
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@ -17,19 +17,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |--------+------+------+------+-------+-------------| |-------+------+------+------+------+------+--------|
* | Del | ' | , | . | P | Y | Esc | | Caps | F | G | C | R | L | / |
* |--------+------+------+------+-------+------| | | |------+------+------+------+------+--------|
* | BkSp | A | O | E | U | I |------| |-------| D | H | T | N |S / L2|- / Cmd |
* | BkSp | A | O | E | U | I |------| |-------| D | H | T | N | S | - |
* |--------+------+------+------+-------+------| Tab | | Enter |------+------+------+------+------+--------|
* | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | RShift |
* `--------+------+------+------+-------+-------------' `--------------+------+------+------+------+--------'
* |Grv/L1| '" |AltShf| Left | Right | | Up | Down | [ | ] | ~L1 |
* | L1 | NONE | Grv | Left | Right | | Up | Down | [ | ] | L1 |
* `-----------------------------------' `----------------------------------'
* ,-------------. ,---------------.
* | PgUp | PgDn | | Home | End |
* ,------|------|------| |-------+-------+------.
* | | | NONE | | NONE | | |
* | Alt | NONE |------| |-------| Space | Ctrl |
* | | | Supr | | AltGr | | |
* `--------------------' `----------------------'
* ,--------------. ,---------------.
* | PgUp | PgDn | | Home | End |
* ,------|-------|------| |-------+-------+------.
* | | | NONE | | AltGr | | |
* | Alt | Enter |------| |-------| Space | Ctrl |
* | | | Supr | | ~MDIA | | |
* `---------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
@ -39,19 +39,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_DELT, KC_QUOT, KC_COMM,KC_DOT, KC_P, KC_Y, KC_ESC,
KC_BSPC, KC_A, KC_O, KC_E, KC_U, KC_I,
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_TAB,
LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
MO(SYMB), KC_NO, KC_GRV, KC_LEFT,KC_RGHT,
KC_PGUP,KC_PGDN,
KC_NO,
KC_LALT,KC_ENT ,KC_LGUI,
// right hand
KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS,
KC_CAPS, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
KC_D, KC_H, KC_T, KC_N, LT(MDIA, KC_S), GUI_T(KC_MINS),
KC_ENT, KC_B, KC_M, KC_W, KC_V, KC_Z , KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS,
KC_CAPS, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
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_NO,
KC_RALT,KC_SPC,KC_RCTL
KC_RALT,
KC_FN1,KC_SPC,KC_RCTL
),
/* Keymap 1: Symbol Layer
*
@ -95,7 +95,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
[STEN] = KEYMAP( // layout: layer 2: Steno for Plover
// left hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,
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_NO, KC_NO,
KC_NO,
PV_A, PV_O, KC_NO,
// right hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
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_NO, KC_NO,
KC_NO,
KC_FN1, PV_E, PV_U
),
/* Keymap 3: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
@ -136,31 +158,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS,
KC_TRNS, KC_TRNS, KC_WBAK
),
[STEN] = KEYMAP( // layout: layer 4: Steno for Plover
// left hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,
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_NO, KC_NO,
KC_NO,
PV_A, PV_O, KC_NO,
// right hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
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_NO, KC_NO,
KC_NO,
KC_NO, PV_E, PV_U
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
[1] = ACTION_LAYER_TAP_TOGGLE(MDIA) // FN1 - Momentary Layer 3 (Media)
};
void toggle_steno(int pressed)
@ -200,26 +201,17 @@ void matrix_init_user(void) {
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
uint32_t layer0 = layer_state & (1UL << 0),
layer1 = layer_state & (1UL << 1),
layer2 = layer_state & (1UL << 2),
layer3 = layer_state & (1UL << 3);
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;
case 3:
ergodox_right_led_3_on();
break;
default:
// none
break;
}
if (layer1) ergodox_right_led_1_on();
if (layer2) ergodox_right_led_2_on();
if (layer3) ergodox_right_led_3_on();
};

@ -0,0 +1,187 @@
#include "ergodox_ez.h"
#include "debug.h"
#include "action_layer.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 | | | | 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | A | S | D | F | G |------| |------| H | J | K | L |; / L2| ' / L |
* |--------+------+------+------+------+------| L | | L |------+------+------+------+------+--------|
* | L | Z | X | C | V | B | | | | N | M | , | . | / / | R |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | L | L | L | | | | | | [ | ] | ~L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,---------------.
* | `~ | '" | | ⎋ | ⌫ |
* ,------|------|------| |------+--------+------.
* | | | PgUp | | PgDn | | |
* | | |------| |------| |Enter |
* | | | L | | L | | |
* `--------------------' `----------------------'
*/
// 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, 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, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LGUI,
KC_LCTL, KC_LALT, KC_LGUI,KC_LEFT,KC_RGHT,
KC_GRV, KC_QUOT,
KC_PGUP,
KC_SPC,KC_BSPC,KC_LALT,
// right hand
KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
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),GUI_T(KC_QUOT),
KC_LGUI, KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
KC_ESC, KC_BSPC,
KC_PGDN,
KC_LCTL, KC_TAB, KC_ENT
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | [ | ] | { | } | | | | | / | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | < | > | ( | ) | |------| |------| - | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | & | 1 | 2 | 3 | = | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | 0 | . | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | Home | | |
* | | |------| |------| | |
* | | | | | End | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = KEYMAP(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, 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,
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_SLSH, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_MINS, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_EQL, KC_TRNS,
KC_0, KC_DOT, KC_LEFT, KC_RGHT, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_HOME,
KC_END , KC_TRNS, KC_TRNS
),
/* Keymap 2: Media keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F14 | F15 | | | | | | Q | W | ` | ` | | | Power |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | PgUp | | | | | | ] | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | Home | PgDn | End | |------| |------| [ | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | |L+Spc| Spc | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| C | V |
* | | | | | X | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
[MDIA] = KEYMAP(
KC_TRNS, KC_F14 , KC_F15 , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, /* F14 dims screen, F15 brightens */
KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END , KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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
LGUI(KC_Q), LGUI(KC_W), LGUI(LSFT(KC_GRV)), LGUI(KC_GRV), LALT(LSFT(KC_TAB)), LALT(KC_TAB), KC_PWR,
KC_TRNS, LGUI(KC_RBRC), LGUI(LALT(KC_UP)), KC_UP , LGUI(LALT(KC_DOWN)), KC_TRNS, KC_TRNS,
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,
LGUI(KC_X), LGUI(KC_C), LGUI(KC_V)
),
};
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
switch(id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
#endif
// 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;
}
};

@ -0,0 +1,45 @@
# The Zweihander Layout
NB: the backtick (\`) is special in Markdown. If I write ⌘\` in this readme, I mean “command-backtick”, not “command-backslash-backtick”.
This layout is tuned for people who…
## use OS X
This layout doesnt make any concessions for Windows use. While it should work fine in Windows, Im not about to devote precious keyboard space to Windows-specific shortcuts.
## mouse left-handed while doing other things with the right hand
I tend to have my mouse in my left hand, but I like to use my other hand to make things go faster. Ive added a bunch of buttons to the media layer to speed up browsing in Safari and Finder:
- Close Window (⌘W)
- Back (⌘[)
- Forward (⌘])
- Open and Close Parent Folder (⌥⌘↓)
- Go Up and Close Just-Left Folder (⌥⌘↑)
- Cycle through open windows in current application (⌘\` and ⌘⇧\`)
- Cycle through tabs in current window (⌥⇥ and ⌥⇧⇥)
- Space (page down in browsers; Quick Look in the Finder)
- Shift-Space (page up in web browsers)
Because moving letter-by-letter is way slower than moving word-by-word, I added Option (⌥) to the bottommost button on the left side. This key can be held easily while holding ; (activate media layer) and pressing J and L to move left and right by word.
## use lots of modifier keys in OS X menu-item shortcuts
I wanted to preserve the feel of a number of shortcuts that involve pressing lots of modifier keys at once; this is why the bottom left of the keyboard has shift, control, option, and command in the usual spaces. Further, some common shortcuts I press have a key on the right side of the keyboard. These shortcuts include:
- Empty Trash Without Asking for Confirmation (⇧⌥⌘⌫)
- Shut Down Without Asking for Confirmation (⇧⌥⌘ power)
## use Emacs-style shortcuts
I press C-a, C-e, and C-k all the time. Its difficult to press these key combinations with the control key on the bottom left and Im too quick on the draw for the control function on the / key to work reliably, so the bottommost thumb button on the right side is another control key.
## use spreadsheets
All the common spreadsheet operations (+-*/=) are now on the right side of the symbol layer.

@ -0,0 +1,1152 @@
:100000000C9465020C94A9020C94A9020C94A90208
:100010000C94A9020C94A9020C94A9020C94A902B4
:100020000C94A9020C94A9020C94720C0C94440D2B
:100030000C94A9020C94A9020C94A9020C94A90294
:100040000C94A9020C940E220C94A9020C94A902FF
:100050000C94A9020C949D1B0C94A9020C94A90267
:100060000C94A9020C94A9020C94A9020C94A90264
:100070000C94A9020C94A9020C94A9020C94A90254
:100080000C94A9020C94A9020C94A9020C94A90244
:100090000C94A9020C94A9020C94A9020C94A90234
:1000A0000C94A9020C94A9020C94A902B10DD30DD1
:1000B000C10ED30DC10E180E3B0EC10E900EA30E35
:1000C0008F118F11CC11CC110F124D1266146614C2
:1000D00066126614671367133A1466146614511493
:1000E0000000F0A12E004C002A00E100E00000001A
:1000F0001E00140004001D00E200E2001F001A00B0
:1001000016001B00E3002A0020000800070006007C
:1001100050002C0021001500090019004F004B0071
:10012000220017000A0005000000350050000154AD
:100130000000E300000034004F0001540000E30021
:100140000000290023001C000B00110000002A0001
:10015000240018000D00100052004E0025000C0075
:100160000E00360051002800260012000F00370054
:100170002F002B0027001300338238713000E0007D
:100180002D0031003478E500C100000001000100BD
:1001900001000100010000003A001E0220022202BC
:1001A000010001003B001F022102230201000100A7
:1001B0003C002F0226022F00010001003D0030020A
:1001C00027023000010001003E00310235003502F7
:1001D000000001000100010000000100000001001A
:1001E0000100010000000100000001003F00380094
:1001F0002D002402000001004000240021001E0008
:1002000027004A004100250022001F00370001009E
:100210004200260023002000500001004300250278
:100220002E022E004F004D00440045000100010049
:1002300001000000010001000100010001000000B8
:100240006900010001000100010001006A000100D5
:100250004A0001000100010001004B004E000100B6
:1002600001000100010001004D000100010001003A
:100270000100010001000100000001000100010077
:10028000000001000000010014080100000001004E
:10029000000001001A0830082F082C02000001009D
:1002A000350A520C50002C00A900010035085200FC
:1002B0005100AC00AA0001002B06510C4F00AB000E
:1002C000A80001002B040100010001000100010051
:1002D000A5000100AE00010001000000160345006A
:1002E000720067006F0044006F0078002000450036
:1002F0005A00000016034500720067006F004400BA
:100300006F007800200045005A0000000403090433
:1003100009026D00040100A0FA09040000010301B4
:100320000100092111010001223F00070581030896
:10033000000A090401000103010200092111010062
:1003400001224D000705820308000A09040200018A
:100350000300000009211101000122360007058376
:100360000308000A09040300010300000009211129
:100370000100012239000705840310000112011059
:100380000100000008EDFE07130100010200010555
:10039000010906A101050719E029E71500250195C6
:1003A0000875018102050819012905950575019156
:1003B000029501750391010507190029771500259C
:1003C00001957875018102C005010980A1018502AE
:1003D00016010026B7001A01002AB7007510950112
:1003E0008100C0050C0901A1018503160100269CAE
:1003F000021A01002A9C02751095018100C00501B6
:100400000902A1010901A100050919012905150029
:10041000250195057501810295017503810105018D
:10042000093009311581257F950275088106093843
:100430001581257F950175088106050C0A3802157E
:1004400081257F950175088106C0C005010906A1B7
:1004500001050719E029E7150025019508750181B7
:100460000295017508810105081901290595057591
:100470000191029501750391010507190029FF15E6
:100480000025FF950675088100C0000000000000EF
:100490000000000000010204060A0F17202C3A4A4F
:1004A0005D71879DB3C7DAE9F5FCFFFCF5E9DAC7B2
:1004B000B39D87715D4A3A2C20170F0A060402018A
:1004C0000000000000000000000011241FBECFEF5C
:1004D000DAE0DEBFCDBF04B603FE24C08091EE019A
:1004E0009091EF01A091F001B091F1018730904B14
:1004F000A740B04BB9F41092EE011092EF011092A8
:10050000F0011092F10114BE84B7877F84BF88E1A7
:100510000FB6F89480936000109260000FBEE0E088
:10052000FFE3099511E0A0E0B1E0EAEAF7E402C0D8
:1005300005900D92A433B107D9F711E0A4E3B1E01F
:1005400001C01D92AE3EB107E1F70E94B6090C94BE
:10055000D3230C94000061110BC0FC01828188231D
:1005600021F085EE0E94231003C085EE0E94EB105F
:1005700080E090E0089508956091B1017091B2011A
:100580008091B3019091B4010E94C91A56985E9867
:1005900025982D9826982E9827982F98813019F015
:1005A000823021F00895259A2D9A0895269A2E9A40
:1005B00008950C94BC0256985E9825982D9826981C
:1005C0002E9827982F988FEF90E090938900809332
:1005D000880090938B0080938A0090938D00809385
:1005E0008C00259A2D9A2FEF80E792E021508040D1
:1005F0009040E1F700C00000269A2E9A2FEF80E786
:1006000092E0215080409040E1F700C00000279A1E
:100610002F9A2FEF80E792E0215080409040E1F741
:1006200000C0000025982D982FEF80E792E0215020
:1006300080409040E1F700C0000026982E982FEFF0
:1006400080E792E0215080409040E1F700C0000038
:1006500027982F9856985E9825982D9826982E982A
:1006600027982F98089589EA8093800089E08093E5
:10067000810024982C983F988AB18F748AB96E981B
:10068000479A8BB1806B8BB9769A0E94DB020C94EF
:10069000BB0280E2809300018091340181110EC081
:1006A0000E94980381E0809334012FEF83ED90E363
:1006B000215080409040E1F700C0000080E40E949B
:1006C0009E038093000181112EC00E94C803809375
:1006D0000001811128C00E94C8038093000181118C
:1006E00022C08FE30E94C8038093000181111BC0C8
:1006F0000E94C00380E40E949E0380930001811148
:1007000012C08CE00E94C8038093000181110BC0CD
:100710000E94C80380930001811105C08FE30E94ED
:10072000C803809300010E94C003809100010895D6
:100730001092B9008AE08093B800089594EA9093EB
:10074000BC009091BC0097FFFCCF9091B900987FBE
:10075000983021F0903111F081E008958093BB0032
:1007600084E88093BC008091BC0087FFFCCF80911F
:10077000B900887F883111F0803471F780E00895E6
:1007800084E98093BC008091BC0084FDFCCF089577
:100790008093BB0084E88093BC008091BC0087FFFD
:1007A000FCCF9091B900987F81E0983209F480E005
:1007B000089584E88093BC008091BC0087FFFCCF43
:1007C0008091BB00089580910001811115C080E4E3
:1007D0000E949E038093000181110CC082E10E945F
:1007E000C80380930001811105C08FEF0E94C803E8
:1007F000809300010E94C00384B1807F84B985B1D9
:10080000807F85B98AB1837F8AB98BB1837F8BB9A9
:100810003E98469808950E944903809300010E94E3
:10082000E30380B38C7080BB81B3836F81BBA6E38D
:10083000B1E0E4E4F1E08EE08E0F11921D928E1390
:10084000FCCF0C943303BF92CF92DF92EF92FF92D2
:100850000F931F93CF93DF9380910001882379F04A
:10086000809135018F5F80933501811108C00E940E
:10087000490380930001811102C00E94DB0206E35C
:1008800011E0C0E0D0E0DD24D39482E0C82EEE2455
:10089000E394F12CC730D10500F58091000181115E
:1008A00064C080E40E949E0380930001811112C005
:1008B00082E10E94C8038093000181110BC0C7012F
:1008C0000C2E01C0880F0A94EAF780950E94C80395
:1008D000809300010E94C00348C0CA30A1F028F4F0
:1008E000C83059F0C93061F005C0CC3089F070F0E3
:1008F000CD3089F0209A289810C0219A29980DC0EF
:10090000229A2A980AC0239A2B9807C0529A01C0AB
:10091000539A5B9802C03E9A469890EA9A95F1F7EE
:100920009FB1799902C082E001C080E091709D255D
:10093000982B7C9902C084E001C080E0892B7D99CE
:1009400002C038E001C030E0832B7E9902C020E174
:1009500001C020E0822B9FB19095991F9927991F84
:100960009295990F907E892B0FC080910001811183
:1009700049C080E40E949E0380930001882379F19E
:10098000B12C0E94C0038B2DF8019081981719F0AB
:100990008083C09201010E94E30321960F5F1F4FE5
:1009A000CE30D10509F076CF80910101882361F125
:1009B000815080930101882339F08FE99FE00197EE
:1009C000F1F700C0000020C0A4E4B1E0E6E3F1E0EC
:1009D000CF01825F91919D938E13FCCF15C083E16F
:1009E0000E94C803809300018111CACF81E40E9454
:1009F0009E03809300018111C3CF0E94D903B82EBA
:100A0000B094BFCF80E0C0CF0E94D90281E0DF91D7
:100A1000CF911F910F91FF90EF90DF90CF90BF90FB
:100A20000895E82FF0E0EC5BFE4F80810895089573
:100A3000089596E0799FF001112494E5899FE00DD7
:100A4000F11D1124E60FF11DEE0FFF1FEC51FF4FBA
:100A5000859194910895880F991FFC01E05AF04008
:100A6000859194910895880F991FFC01E052FF4FE2
:100A70008591949108950F931F93CF93DF93EC0189
:100A80008115904350F5C11580E2D80708F0B3C036
:100A9000CB3BD10590F4C83AD10508F05AC0C53A0D
:100AA000D10508F04BC0C430D10508F0BBC1219777
:100AB00009F0B5C101E010E0F5C1CF3FD10511F05B
:100AC00008F0B0C1C03FD10508F092C0CE01805EF1
:100AD0009109089708F4A6C1A2C1C11591E5D907EB
:100AE000A8F4C23020E5D20708F09EC0C11580E509
:100AF000D80709F485C008F091C0C11520E4D207D9
:100B000008F08DC1DD278E01106CCCC1C11580E8C5
:100B1000D80758F4C11590E7D90708F07CC1C11572
:100B200020E6D20708F422C17AC1C11580E9D807AE
:100B300008F075C1DF708E01106AB4C1C53AD105E5
:100B400009F472C1C63AD10509F071C102E810E496
:100B5000A9C1C83AD10509F46DC1C93AD10509F452
:100B60006CC1CA3AD10509F46BC1CB3AD10509F47D
:100B70006AC1CC3AD10509F469C1CD3AD10509F46D
:100B800068C1C03BD10509F467C1CE3AD10509F46B
:100B900066C1CF3AD10509F465C1C13BD10509F45D
:100BA00064C1C23BD10509F463C1C33BD10509F45B
:100BB00062C1C43BD10509F461C1C53BD10509F44B
:100BC00060C1C63BD10509F45FC1C73BD10509F43B
:100BD0005EC1C83BD10509F45DC1C93BD10509F42B
:100BE0005CC1CA3BD10509F45BC100E014E45AC101
:100BF0008E01106557C1CE019F700E94330553C10D
:100C00000E948A149FEF24E38CE0915020408040A2
:100C1000E1F700C000000E94C21B44C18091CD01D9
:100C200081608093CD013EC10E946B1D811102C085
:100C30000E94511D0E94881D90E09093EE018093C8
:100C4000ED01C23090E5D90721F48091ED0181607A
:100C500086C0C43020E5D20721F48091ED01826086
:100C60007EC0C63080E5D80721F48091ED01846014
:100C700076C0C83090E5D90719F48091ED0127C0FE
:100C8000CA3020E5D20721F48091ED01806167C070
:100C9000CC3080E5D80721F48091ED0180625FC0FF
:100CA000CE3090E5D90721F48091ED01806457C0E2
:100CB000C03120E5D20721F48091ED0180684FC05A
:100CC000C23180E5D80729F48091ED018460886005
:100CD00046C0C33090E5D90721F48091ED018E7FA5
:100CE0003EC0C53020E5D20721F48091ED018D7F13
:100CF00036C0C73080E5D80721F48091ED018B7FA5
:100D00002EC0C93090E5D90719F48091ED0126C0B5
:100D1000CB3020E5D20721F48091ED018F7E1FC0FA
:100D2000CD3080E5D80721F48091ED018F7D17C08B
:100D3000CF3090E5D90721F48091ED018F7B0FC072
:100D4000C13120E5D20721F48091ED018F7707C0F2
:100D5000C331D04531F48091ED018B7F877F809343
:100D6000ED018091ED010E948C1D9CC08D2F992773
:100D70008F70992781309105D9F49E012370332714
:100D800002C0880F991F2A95E2F79C688E0144E003
:100D9000000F111F4A95E1F700271370802B912B4C
:100DA00053E0CC0FDD1F5A95E1F7C076DD272FC049
:100DB0008230910531F4DC2FCC278E01016F106A4F
:100DC00071C08330910569F4CE018370992701E0E9
:100DD00010E002C0000F111F8A95E2F7C8019C685D
:100DE0000FC0049709F05EC0CE018370992701E01F
:100DF00010E002C0000F111F8A95E2F7C8019A683F
:100E000023E0CC0FDD1F2A95E1F7C07ED7708C015F
:100E10000C2B1D2B47C0DF708E01106243C000E019
:100E200010E040C08E013EC001E810E43BC003E882
:100E300010E438C002EE14E435C009EE14E432C008
:100E40000AEE14E42FC005EB14E42CC006EB14E406
:100E500029C007EB14E426C00CEC14E423C00DEC0D
:100E600014E420C003E815E41DC00AE815E41AC024
:100E700002E915E417C004E915E414C001E216E420
:100E800011C003E216E40EC004E216E40BC005E252
:100E900016E408C006E216E405C007E216E402C044
:100EA0000AE216E4C801DF91CF911F910F910895D6
:100EB00096E0799FF001112494E5899FE00DF11DE2
:100EC0001124E60FF11DEE0FFF1FEC51FF4F85912E
:100ED0009491803E9105E0F4803C910558F5813372
:100EE000910509F46FC048F48932910509F463C093
:100EF0008A32910509F46DC072C089339105E9F019
:100F000082389105D1F08533910509F44DC067C051
:100F1000833E910581F138F4803E9105B9F0823E1F
:100F20009105D9F05CC0863E910561F1873E91053F
:100F3000A1F155C00E942B0508952091ED0120FDDF
:100F400002C021FF4CC080EE90E049C08091ED01CD
:100F500080FFF9CF89E390E042C08091ED0182FFEC
:100F60000EC08091ED0184FF03C080E090E037C0A7
:100F700083EE90E034C08091ED0182FFF2CF82EEEB
:100F800090E02DC08091ED0183FF0BC08091ED01B9
:100F900084FDEBCF87EE90E022C08091ED0183FFCE
:100FA000F5CF86EE90E01BC08091ED0185FF07C074
:100FB00089E290E014C08091ED0185FFF9CF85E3CF
:100FC00090E00DC08091ED0186FF07C08AE290E0BD
:100FD00006C08091ED0186FFF9CF81E390E00E9489
:100FE0003B05089508950C94F207809162010895DD
:100FF000CF93DF9300D01F92CDB7DEB79C018091D5
:10100000E401843019F593E099833B832A8390931C
:10101000E9008FEF9091E800815095FD06C095EDB5
:101020009A95F1F700008111F5CF8091E80085FFD6
:101030000DC040E050E063E070E0CE0101960E94F8
:10104000620A8091E8008E778093E8000F900F90FD
:101050000F90DF91CF910895CF93DF9300D01F922F
:10106000CDB7DEB72091E401243021F522E02983B9
:101070009B838A8383E08093E9008FEF9091E8005F
:10108000815095FD06C095ED9A95F1F7000081110C
:10109000F5CF8091E80085FF0DC040E050E063E0AF
:1010A00070E0CE0101960E94620A8091E8008E777E
:1010B0008093E8000F900F900F90DF91CF910895EB
:1010C0002091E4012430F1F422E02093E9002FEF95
:1010D0003091E800215035FD06C035ED3A95F1F725
:1010E00000002111F5CF2091E80025FF0BC040E062
:1010F00050E065E070E00E94620A8091E8008E771F
:101100008093E8000895CF93DF93EC019091E40180
:10111000943009F046C080910C018823D9F0809169
:101120000D018823B9F09093E9008FEF9091E800CA
:10113000815095FD06C095E19A95F1F70000811167
:10114000F5CF8091E80085FF2CC040E050E060E1E1
:1011500070E017C081E08093E9008FEF9091E80084
:10116000815095FD06C095ED9A95F1F7000081112B
:10117000F5CF8091E80085FF14C040E050E068E0C2
:1011800070E0CE010E94620A8091E8008E77809321
:10119000E80080E1FE01A2E5B1E001900D928A95A0
:1011A000E1F7DF91CF9108958091E301811109C0AA
:1011B0000E94F70B0E94540C8091E200846080939F
:1011C000E20008951092E301089508950C94FB2124
:1011D0000E94581B0E9401220E94FA0E0C94F307F1
:1011E00042E061EC81E00E94710B42E061EC82E040
:1011F0000E94710B42E061EC83E00E94710B42E1BE
:1012000061EC84E00C94710B8091E601833009F469
:1012100055C030F4813071F0823009F48EC00895E9
:101220008A3009F47AC08B3009F460C0893009F043
:101230009CC020C08091E501813A09F096C0809160
:10124000E800877F8093E8008091E9019091EA01AE
:10125000892B21F460E182E591E003C060E080E049
:1012600090E070E00E94AD0A8091E8008B77809357
:10127000E80008958091E501813209F076C08091FF
:10128000E9019091EA01009719F0039709F06DC008
:101290008091E800877F8093E8008091E80082FDDC
:1012A00005C08091E4018111F8CF5FC08091F10009
:1012B000809362018091E8008B7753C08091E501B3
:1012C000813A09F052C08091E9019091EA01892B9D
:1012D00009F04BC08091E800877F8093E8008091FF
:1012E000E80080FFFCCF80910C0136C08091E501C1
:1012F0008132D9F58091E9019091EA01892BA9F514
:101300008091E800877F8093E8000E94A60B80917F
:10131000E70180930C010C948A148091E5018132DD
:1013200021F58091E800877F8093E8000E94A60B5A
:101330008091E8018093630108958091E501813AED
:10134000A1F48091E800877F8093E8008091E80015
:1013500080FFFCCF809163018093F1008091E800D1
:101360008E778093E8000C94A60B089584B7877F4E
:1013700084BF88E10FB6F8948093600010926000FB
:101380000FBE90E080E80FB6F894809361009093D0
:1013900061000FBE0E94490F0E94F70B0E94540C7F
:1013A0008091E20084608093E20078940E94DA0EDB
:1013B0000E944B0F82E091E00E94F50E0E94E9210D
:1013C0008091E401853069F40E94191B8091E2014B
:1013D0008823B1F30E94441B882391F30E944C0A96
:1013E000EFCF0E94510FECCF292F33272330310547
:1013F000C9F064F42130310581F02230310509F063
:1014000043C08DE690E020E133E042C02132310557
:10141000F1F02232310541F137C082E190E02DE751
:1014200033E036C099278130910541F08230910533
:1014300041F0892B49F5ECE0F3E005C0E4EFF2E080
:1014400002C0ECEDF2E0849190E09F0121C0643095
:10145000D8F4E62FF0E0EE0FFF1FEE5DFE4F208187
:10146000318189E090E014C0643070F470E0FB01D9
:10147000EE0FFF1FE65EFE4F20813181FB01EA5E29
:10148000FE4F808190E004C080E090E020E030E0FA
:10149000FA0131832083089580E189BD82E189BD0D
:1014A00009B400FEFDCF8091D8008F7D8093D800D5
:1014B0008091E00082608093E0008091E00081FDF7
:1014C000FCCF0895CF92DF92EF92FF920F931F937C
:1014D000CF93DF93EC018B016A010E94C50B811150
:1014E00033C0C114D10439F0F60180819181081B09
:1014F000190BC80FD91FE12CF12C0115110519F199
:101500008091E80085FD16C08091E8008E77809379
:10151000E800C114D10449F0F60180819181E80E00
:10152000F91EF182E08285E00FC00E94C50B88237E
:1015300021F30AC089918093F10001501109FFEF56
:10154000EF1AFF0ADACF80E0DF91CF911F910F9160
:10155000FF90EF90DF90CF9008952091EB013091B4
:10156000EC012617370748F06115710539F4209111
:10157000E8002E772093E80001C0B90140E0611532
:101580007105A9F12091E401222309F443C025301B
:1015900009F442C02091E80023FD40C02091E800FA
:1015A00022FD32C02091E80020FFE9CF4091F300F6
:1015B0002091F20030E0342BFC01CF016115710560
:1015C00059F02830310540F481918093F100615049
:1015D00071092F5F3F4FF1CF41E02830310509F00D
:1015E00040E02091E8002E772093E800C8CF411119
:1015F000C9CF0AC08091E401882361F0853061F091
:101600008091E80083FD0AC08091E80082FFF2CF5C
:1016100080E0089582E0089583E0089581E00895D0
:101620002091EB013091EC012617370748F0611546
:10163000710539F42091E8002E772093E80001C06D
:10164000B901FC0120E06115710591F18091E4017F
:10165000882309F440C0853009F43FC08091E80038
:1016600083FD3DC08091E80082FD2FC08091E8009D
:1016700080FFE9CF2091F3008091F20090E0922B5F
:101680006115710559F08830910540F4249120933B
:10169000F1003196615071090196F2CF21E008976F
:1016A00009F020E08091E8008E778093E800CBCFAE
:1016B0002111CCCF0AC08091E401882361F08530EC
:1016C00061F08091E80083FD0AC08091E80082FF0C
:1016D000F2CF80E0089582E0089583E0089581E0EC
:1016E0000895982F973058F59093E900981739F09E
:1016F0007091EC002091ED005091F00003C0242F78
:10170000762F50E021FF19C03091EB003E7F3093DF
:10171000EB003091ED003D7F3093ED003091EB0018
:1017200031603093EB007093EC002093ED00509308
:10173000F0002091EE0027FF07C09F5FD3CF8F708E
:101740008093E90081E0089580E008958091E501AB
:1017500087FF11C08091E80082FD05C08091E401FF
:101760008111F8CF11C08091E8008B770BC0809178
:10177000E401882349F08091E80080FFF8CF809150
:10178000E8008E778093E80008952091E40030917E
:10179000E50095E64091EC00842F817040FF22C067
:1017A0008091E80080FD1CC08091E401882391F0C5
:1017B000853091F08091EB0085FD10C04091E400F0
:1017C0005091E5004217530729F39A01915011F700
:1017D00084E0089582E0089583E0089581E008950B
:1017E00080E008954091E80042FFDECF08950E9416
:1017F000650C0E946D0CE0EEF0E0808181608083DA
:10180000E8EDF0E080818F77808319BCA7EDB0E030
:101810008C918E7F8C9380818F7E80831092E301E8
:1018200008950F931F93CF93DF930E94650C0E943E
:101830006D0CC8EDD0E088818F77888388818068BF
:10184000888388818F7D888319BC1092E40110926F
:10185000E0011092E2011092E10100EE10E0F801C7
:1018600080818B7F808388818160888342E060E013
:1018700080E00E94710BE1EEF0E080818E7F80833A
:10188000E2EEF0E0808181608083808188608083E7
:10189000F80180818E7F8083888180618883DF91D9
:1018A000CF911F910F910895E8EDF0E080818F7E38
:1018B0008083E7EDF0E080818160808384E082BFF7
:1018C00081E08093E3010C94110CE8EDF0E080815D
:1018D0008E7F80831092E20008951092DA001092B9
:1018E000E10008951F920F920FB60F9211242F93CB
:1018F0003F934F935F936F937F938F939F93AF9398
:10190000BF93EF93FF938091E10082FF0BC0809122
:10191000E20082FF07C08091E1008B7F8093E100AD
:101920000E94D90E8091DA0080FF1FC08091D800FC
:1019300080FF1BC08091DA008E7F8093DA00809157
:10194000D90080FF0DC080E189BD82E189BD09B465
:1019500000FEFDCF81E08093E4010E94D40805C021
:1019600019BC1092E4010E94E2088091E10080FF1E
:1019700019C08091E20080FF15C08091E2008E7F47
:101980008093E2008091E20080618093E200809188
:10199000D80080628093D80019BC85E08093E40170
:1019A0000E94E6088091E10084FF30C08091E2004F
:1019B00084FF2CC080E189BD82E189BD09B400FEAD
:1019C000FDCF8091D8008F7D8093D8008091E10079
:1019D0008F7E8093E1008091E2008F7E8093E20011
:1019E0008091E20081608093E2008091E001882391
:1019F00011F084E007C08091E30087FD02C081E020
:101A000001C083E08093E4010E94E8088091E10036
:101A100083FF29C08091E20083FF25C08091E1000F
:101A2000877F8093E10082E08093E4011092E001DF
:101A30008091E1008E7F8093E1008091E2008E7FB3
:101A40008093E2008091E20080618093E20042E0B6
:101A500060E080E00E94710B8091F00088608093CC
:101A6000F0000E94E508FF91EF91BF91AF919F9127
:101A70008F917F916F915F914F913F912F910F9037
:101A80000FBE0F901F9018951F920F920FB60F92D6
:101A900011242F933F934F935F936F937F938F9373
:101AA0009F93AF93BF93CF93DF93EF93FF93C09137
:101AB000E900CF708091EC00D82FD17080FDD0E884
:101AC0001092E9008091F000877F8093F000789475
:101AD0000E94880D1092E9008091F0008860809348
:101AE000F000CD2BCF70C093E900FF91EF91DF9113
:101AF000CF91BF91AF919F918F917F916F915F91A6
:101B00004F913F912F910F900FBE0F901F901895FE
:101B10001F93CF93DF93CDB7DEB7AA970FB6F89494
:101B2000DEBF0FBECDBFE5EEF1E088E08E0F9091F5
:101B3000F10091938E13FBCF0E9404098091E8007D
:101B400083FF1FC18091E5019091E601492F50E08C
:101B50004A30510508F015C1FA01EA5AFF4F0C94BA
:101B60008323803881F0823809F00BC18091E9012C
:101B70008F708093E9008091EB0085FB882780F9C6
:101B80001092E90006C08091E1019091E20191116B
:101B900082609091E800977F9093E8008093F10035
:101BA0001092F100C8C0282F2D7F09F0EAC08823C9
:101BB00019F0823061F0E5C08091E701813009F0D1
:101BC000E0C0933009F080E08093E2012BC0809167
:101BD000E701811127C08091E9018F7009F4D1C01C
:101BE0008093E9002091EB0020FF1CC0933021F48A
:101BF0008091EB00806214C09091EB009061909313
:101C0000EB0021E030E0A90102C0440F551F8A9586
:101C1000E2F74093EA001092EA008091EB008860BE
:101C20008093EB001092E9008091E800877F86C0E6
:101C30008111A7C01091E7011F778091E3008078A0
:101C4000812B8093E3008091E800877F8093E800F8
:101C50000E94A60B8091E80080FFFCCF8091E300FA
:101C600080688093E300111102C082E001C083E02C
:101C70008093E40186C08058823008F082C0809151
:101C8000E7019091E8018C3D53E0950779F583E0F9
:101C90008A838AE289834FB7F894DE01139620E0A5
:101CA0003EE051E2E32FF0E050935700E49120FF33
:101CB00003C0E295EF703F5FEF708E2F90E0EA3047
:101CC00010F0C79601C0C0968D939D932F5F24316D
:101CD00049F74FBF8091E800877F8093E8006AE270
:101CE00070E0CE0101960E94AD0A14C0AE014F5FB4
:101CF0005F4F6091E9010E94F409BC01892B09F44E
:101D000040C09091E800977F9093E80089819A8184
:101D10000E94100B8091E8008B778093E80031C01F
:101D2000803879F58091E800877F8093E800809182
:101D3000E0018093F1008091E8008E778093E800C5
:101D40000E94A60B1EC081111CC09091E701923029
:101D5000C0F48091E800877F8093E8009093E001D1
:101D60000E94A60B8091E001811106C08091E300E2
:101D700087FD02C081E001C084E08093E4010E94FD
:101D8000F0088091E80083FF0AC08091E800877F17
:101D90008093E8008091EB0080628093EB00AA962C
:101DA0000FB6F894DEBF0FBECDBFDF91CF911F916C
:101DB00008950895CF938091E4018823A1F0C09104
:101DC000E900CF709091EC00892F817090FD80E840
:101DD000C82B1092E9008091E80083FD0E94880DD5
:101DE000CF70C093E900CF910895909369018093DB
:101DF00068010895E0916801F0916901309721F040
:101E00000190F081E02D099480E00895E09168014F
:101E1000F0916901309721F00280F381E02D09945F
:101E20000895E0916801F0916901309721F00480F4
:101E3000F581E02D099408952091660130916701A4
:101E40008217930771F09093670180936601E09188
:101E50006801F0916901309721F00680F781E02D4B
:101E600009940895209164013091650182179307C8
:101E700071F09093650180936401E0916801F091A5
:101E80006901309721F00084F185E02D09940895CF
:101E900008950C94480F0E945E1B0E940B040C9442
:101EA000241CCF92DF92EF92FF920F931F93CF9358
:101EB000DF93CDB7DEB72B970FB6F894DEBF0FBE1A
:101EC000CDBF0E9423048BE6C82E81E0D82E00E00F
:101ED00010E0E02E802F0E941105F60141916F0164
:101EE000F42EF826B1F40F5F1F4F0E30110589F75D
:101EF0008FEF89838A831B820E94671B8160782F02
:101F00009D838C8349815A816B818D810E94F40F5E
:101F100040C09091CD0191FF04C08B870E941705AE
:101F20008B8520E030E04F2D50E0922FBA01022E39
:101F300002C0759567950A94E2F760FF24C02E836E
:101F4000EF8221E030E0690102C0CC0CDD1C9A95E3
:101F5000E2F790E08C219D21892B09F420E028876D
:101F60000E94671B8160782F9A8789874E815F81E5
:101F700068858A850E94F40FF801E559FE4F80813B
:101F8000C826C08206C02F5F3F4F2630310569F654
:101F9000AACF0E940B1F10916A010E94FA0E181717
:101FA000A1F00E94FA0E80936A012B960FB6F89466
:101FB000DEBF0FBECDBFDF91CF911F910F91FF907C
:101FC000EF90DF90CF900C94F3072B960FB6F89418
:101FD000DEBF0FBECDBFDF91CF911F910F91FF905C
:101FE000EF90DF90CF900895CF93DF93CDB7DEB71A
:101FF0002B970FB6F894DEBF0FBECDBF4F83588727
:1020000069877A878B87DE01119686E0FD01119240
:102010008A95E9F785E0FE01379601900D928A9541
:10202000E1F749815A816B817C818D819E810E947B
:1020300024172B960FB6F894DEBF0FBECDBFDF91ED
:10204000CF9108950895CF93882309F4C2C0C82F73
:10205000823859F40E94FA0E81FDBBC089E30E94C8
:10206000CD190E949A1A89E30CC0833879F40E9432
:10207000FA0E80FDAEC083E50E94CD190E949A1A27
:1020800083E50E940F1ACF910C949A1A843859F460
:102090000E94FA0E82FD9DC087E40E94CD190E9425
:1020A0009A1A87E4EECF8CEF8C0F813A48F48C2F8C
:1020B0000E944E2181118DC08C2F0E94CD19E3CF3B
:1020C00080E28C0F883048F4C77081E001C0880F2F
:1020D000CA95EAF70E94531AD6CF8BE58C0F83304E
:1020E00078F4C53A29F0C63A31F083E890E005C0AB
:1020F00081E890E002C082E890E0CF910C941C0F40
:1021000088E58C0F833108F064C0C83A39F1C93AC8
:1021100041F1CA3A49F1CB3A51F1CC3A59F1CD3AB1
:1021200061F1C03B69F1CE3A71F1CF3A79F1C13B2F
:1021300081F1C23B89F1C33B91F1C43B99F1C53BAD
:10214000A1F1C63BA9F1C73BB1F1C83BB9F1C93B0D
:10215000C1F1CA3BC9F180E090E038C082EE90E066
:1021600035C089EE90E032C08AEE90E02FC085EB5A
:1021700090E02CC086EB90E029C087EB90E026C071
:102180008CEC90E023C08DEC90E020C083E891E0DF
:102190001DC08AE891E01AC082E991E017C084E985
:1021A00091E014C081E292E011C083E292E00EC09F
:1021B00084E292E00BC085E292E008C086E292E001
:1021C00005C087E292E002C08AE292E0CF910C94CF
:1021D000320FCF910895882309F44BC0823859F407
:1021E0000E94FA0E81FF45C089E30E94CD190E942A
:1021F0009A1A89E30CC0833871F40E94FA0E80FFAA
:1022000038C083E50E94CD190E949A1A83E50E9486
:102210000F1A0C949A1A843859F40E94FA0E82FF0D
:1022200028C087E40E94CD190E949A1A87E4EFCF54
:102230009CEF980F913A58F390E2980F983050F431
:10224000877091E001C0990F8A95EAF7892F0E9463
:10225000591ADFCF9BE5980F933020F480E090E08F
:102260000C941C0F885A833120F480E090E00C9489
:10227000320F0895882321F00E94531A0C949A1A61
:102280000895882321F00E94591A0C949A1A0895EF
:10229000BF92CF92DF92EF92FF920F931F93CF9353
:1022A000DF9300D000D000D0CDB7DEB725E0FC0131
:1022B000DE01119601900D922A95E1F7FC01D08084
:1022C00011810281258122952F7043815481452BF4
:1022D00009F4FCC21F3F21F4FFEFDF1609F4F6C238
:1022E0007C012E830E942210D9821A8369817A810F
:1022F000802F0E94C919182FB92E0E947E190E94A2
:1023000045182E81002319F00E94701A2E81EB2DA2
:10231000E295EF70F0E0E05AFF4F0C9483238B2D91
:10232000807F9B2D9F70F92E882319F0F29480EF07
:10233000F822002389F0FF2009F475C280E2810FA2
:10234000883020F48F2D0E94531A03C08F2D0E94D5
:10235000631A0E949A1A67C2812F0E94EB10FF2015
:1023600009F4B4C2105E8F2D183018F40E94591A67
:1023700002C00E94691A26960FB6F894DEBF0FBEFF
:10238000CDBFDF91CF911F910F91FF90EF90DF9024
:10239000CF90BF900C949A1A3B2D307F8B2D8F706D
:1023A000303211F08295807F112319F0113021F124
:1023B0002CC00023B9F0222309F4A0C1213009F078
:1023C0009DC126960FB6F894DEBF0FBECDBFDF913C
:1023D000CF911F910F91FF90EF90DF90CF90BF9022
:1023E0000C94831A222319F0213009F46FC28E83D2
:1023F0000E94861A8E8196C1002321F0223008F0B7
:1024000065C27CC1211162C28DC1002321F022234B
:1024100009F474C108C2222309F484C119C22B2D06
:1024200026952695237030E02115310521F02130C5
:102430003105D1F04BC2002321F0812F9B2D9370E9
:1024400002C080E090E026960FB6F894DEBF0FBE83
:10245000CDBFDF91CF911F910F91FF90EF90DF9053
:10246000CF90BF900C941C0F002321F0812F9B2D47
:10247000937002C080E090E026960FB6F894DEBF1D
:102480000FBECDBFDF91CF911F910F91FF90EF90C5
:10249000DF90CF90BF900C94320F812F002319F062
:1024A0000E94131E02C00E947B1E26960FB6F8944F
:1024B000DEBF0FBECDBFDF91CF911F910F91FF9077
:1024C000EF90DF90CF90BF900C94001F8B2D837006
:1024D00009F07BC00111FAC1812F82958695877022
:1024E000880F880F912F9F70C92ED12CE12CF12CD1
:1024F000082E04C0CC0CDD1CEE1CFF1C0A94D2F785
:1025000014FF12C04FE050E060E070E004C0440FE0
:10251000551F661F771F8A95D2F7CB01BA016095C8
:1025200070958095909503C060E070E0CB012B2DF5
:10253000269526952370422F50E042305105D9F060
:102540004330510569F16C297D298E299F2941303D
:10255000510551F126960FB6F894DEBF0FBECDBFE0
:10256000DF91CF911F910F91FF90EF90DF90CF906F
:10257000BF900C946C186C297D298E299F29269672
:102580000FB6F894DEBF0FBECDBFDF91CF911F9184
:102590000F91FF90EF90DF90CF90BF900C94881830
:1025A0000E946C18C701B60126960FB6F894DEBFDC
:1025B0000FBECDBFDF91CF911F910F91FF90EF9094
:1025C000DF90CF90BF900C945018002319F08B2D02
:1025D000817001C08695882309F478C1812F829586
:1025E00086958770880F880F912F9F70C92ED12CE8
:1025F000E12CF12C082E04C0CC0CDD1CEE1CFF1CC1
:102600000A94D2F714FF12C04FE050E060E070E08F
:1026100004C0440F551F661F771F8A95D2F7CB0160
:10262000BA01609570958095909503C060E070E068
:10263000CB012B2D269526952370422F50E042305A
:102640005105D9F04330510569F16C297D298E2956
:102650009F294130510551F126960FB6F894DEBFFF
:102660000FBECDBFDF91CF911F910F91FF90EF90E3
:10267000DF90CF90BF900C9446196C297D298E294C
:102680009F2926960FB6F894DEBF0FBECDBFDF910F
:10269000CF911F910F91FF90EF90DF90CF90BF905F
:1026A0000C9462190E944619C701B60126960FB60E
:1026B000F894DEBF0FBECDBFDF91CF911F910F9178
:1026C000FF90EF90DF90CF90BF900C942A19103FAD
:1026D000D1F118F4103E50F4A1C0123F09F463C0C8
:1026E00008F44CC0133F09F473C098C01F708B2DC1
:1026F0008F710023A1F00E94C318812F26960FB678
:10270000F894DEBF0FBECDBFDF91CF911F910F9127
:10271000FF90EF90DF90CF90BF900C943A110E9401
:10272000E418812F26960FB6F894DEBF0FBECDBFFA
:10273000DF91CF911F910F91FF90EF90DF90CF909D
:10274000BF900C9441110023A9F02111BFC08B2D23
:102750008F7126960FB6F894DEBF0FBECDBFDF9106
:10276000CF911F910F91FF90EF90DF90CF90BF908E
:102770000C940919223008F0A9C0E9CF0023A9F070
:102780008B2D8F7126960FB6F894DEBF0FBECDBF8E
:10279000DF91CF911F910F91FF90EF90DF90CF903D
:1027A000BF900C94C318002359F38B2D8F7126967C
:1027B0000FB6F894DEBF0FBECDBFDF91CF911F9152
:1027C0000F91FF90EF90DF90CF90BF900C94E418A2
:1027D000002399F08B2D8F7126960FB6F894DEBFEB
:1027E0000FBECDBFDF91CF911F910F91FF90EF9062
:1027F000DF90CF90BF900C94AE1826960FB6F89449
:10280000DEBF0FBECDBFDF91CF911F910F91FF9023
:10281000EF90DF90CF90BF900C94A4180023A9F004
:10282000222309F4ADCF812F26960FB6F894DEBF90
:102830000FBECDBFDF91CF911F910F91FF90EF9011
:10284000DF90CF90BF900C942310222309F4ADCFDA
:10285000812F26960FB6F894DEBF0FBECDBFDF9155
:10286000CF911F910F91FF90EF90DF90CF90BF908D
:102870000C94EB104B2D4F70612FC7010E94AB02DF
:1028800026960FB6F894DEBF0FBECDBFDF91CF9175
:102890001F910F91FF90EF90DF90CF90BF900C941D
:1028A000C8174B2D4F70612FC70126960FB6F894AD
:1028B000DEBF0FBECDBFDF91CF911F910F91FF9073
:1028C000EF90DF90CF90BF900C94180526960FB62E
:1028D000F894DEBF0FBECDBFDF91CF911F910F9156
:1028E000FF90EF90DF90CF90BF9008950E94701AF4
:1028F0000E94801A0E94451A0E949A1A0E94B11FD3
:102900000E94001F80E090E00E941C0F80E090E099
:102910000C94320F0E94601A0C9476140E94BE1917
:10292000292F22952F7030E02C3031054CF42A30BD
:1029300031056CF4225031092230310588F407C08A
:102940002C30310549F02F30310531F009C0803E7F
:1029500048F0803F29F406C093FB882780F908954A
:1029600080E0089581E00895CF93DF9300D000D0F8
:102970001F92CDB7DEB70F900F900F900F900F9072
:10298000DF91CF910895CF93DF9300D000D000D096
:10299000CDB7DEB726960FB6F894DEBF0FBECDBF1B
:1029A000DF91CF9108951F93CF93DF93C091790169
:1029B00016E080917A01C81799F0D0E01C9FF001D1
:1029C0001D9FF00D1124E558FE4F40815181628119
:1029D0007381848195810E94C3142196C770E9CFC9
:1029E000DF91CF911F9108954091AB015091AC01BF
:1029F0006091AD017091AE018091AF019091B001F5
:102A00000C94C3148091B00182958F7009F054C06A
:102A10008091AD01882309F44FC080917901A09184
:102A20007A016091AB017091AC014091AE0150917F
:102A3000AF01B6E08A1709F43FC090E04115510597
:102A4000C1F17F3F11F46F3FA1F1B89FF001B99F31
:102A5000F00D1124E558FE4F218172132AC0208108
:102A6000621327C02281211124C0238134812417BD
:102A7000350710F421503109241B350B283C310552
:102A8000C0F42091B0012F7020612093B00126E0A6
:102A9000289FF001299FF00D1124E058FE4F8081FE
:102AA0008F70806180838BEA91E00E9448110C94C2
:102AB000D31401968770BECF0895CF92DF92EF9224
:102AC000FF920F931F93CF93DF93CDB7DEB762973B
:102AD0000FB6F894DEBF0FBECDBF8C0185E0F801C4
:102AE000DE011D9601900D928A95E1F7D8014C9177
:102AF00011965C91119712966C9112971396CD9046
:102B0000DC9014973091AB017091AC018091AE01D3
:102B10009091AF01009709F46BC17F3F19F43F3FDB
:102B200009F466C1E090AD01EE2009F4C0C0209127
:102B3000B001C816D90628F0F601E81BF90BCF0141
:102B400004C0809590958C0D9D1DFF24F394883CC6
:102B5000910578F0F12C207F09F0C6C07C2DD98A30
:102B6000C88A89890E94B4148BEA91E00E944811B6
:102B7000B1C0822F807F09F046C0751314C0341392
:102B800012C0611110C02F7020612093B0010E940B
:102B9000F4148BEA91E00E9448118091B001D801B1
:102BA00015968C932EC0CD2819F15F3F11F44F3F3D
:102BB000F9F0F62E61111CC08091790120917A0103
:102BC00036E0821709F45AC090E0389FF001399F2F
:102BD000F00D1124E558FE4F7181571306C0708126
:102BE000471303C07281711103C001968770E9CF4A
:102BF000F62E662309F418C18091B001816080939C
:102C0000B001F12C11C1751308C0341306C0611155
:102C100004C08091B001D801C3C04D875E878D8507
:102C20009E856A8B0E948E146A898823E1F166234F
:102C3000D1F12091B001822F82958F7090E00297A0
:102C400074F08091AB019091AC0198878F831986C5
:102C5000DB86CA862C87CE0107960E94481186E043
:102C6000F801ABEAB1E001900D928A95E1F70E947C
:102C700002150E94F414FF24F394D6C04D875E879A
:102C80008D859E850E94BE19292F22952F7030E0D8
:102C9000223031050CF0BCC09F7009F0B6C0805ED8
:102CA000883008F4C1C0C8010E944811E4CFC8169A
:102CB000D90608F453C0F601E81BF90BCF01883C94
:102CC000910508F450C0F12C7C2DD98AC88A8989D5
:102CD0000E94B414EBEAF1E086E0DF011D928A95D0
:102CE000E9F70E94F414A0C0751314C0341312C085
:102CF000611110C08091B001F8018583C8010E9464
:102D0000481186E0EBEAF1E0DF011D928A95E9F7D0
:102D1000FE2C8AC04D875E878D859E856A8B0E94BA
:102D20008E146A89882309F4BECF662309F4BBCFC9
:102D30002091B001822F82958F7090E002970CF461
:102D40008ECF8091AB019091AC019A8389831B82D5
:102D5000DD82CC822E83CE0101967FCF8095909527
:102D60008C0D9D1DACCFF62E662309F49CCF7513F8
:102D70002EC034132CC02091B00120FD1FC0822F23
:102D800082958F70D9F0D80115962C9315978F30B6
:102D900049F08F5F982F9295907F822F8F70892BAB
:102DA00015968C93C8010E94481186E0F801ABEAA1
:102DB000B1E001900D928A95E1F793CF86E0F8019A
:102DC000ABEAB1E001900D928A95E1F72DC04D87F5
:102DD0005E878D859E850E948E14811140CF8091E3
:102DE000B00181608093B001C8010E9448111CC0ED
:102DF000662309F458CF4D875E878D859E850E9496
:102E00008E14882309F44FCF2ACF811148CF0CC0EC
:102E1000243031050CF047CF9F7009F440CFF80102
:102E20009581907F09F03BCF8F2D62960FB6F89475
:102E3000DEBF0FBECDBFDF91CF911F910F91FF90ED
:102E4000EF90DF90CF9008951F93CF93DF93CDB78E
:102E5000DEB72C970FB6F894DEBF0FBECDBF4F8301
:102E6000588769877A878B879C87CE0107960E944F
:102E70005D15882369F08F8198852A853B85232BF2
:102E8000F1F19F3F09F063C08F3F09F060C037C088
:102E900086E0FE013796DE01119601900D928A952B
:102EA000E1F76F817885EA85FB85309741F17F3FB7
:102EB00011F46F3F21F120917A0130E0C9010196B0
:102EC000877099274091790150E08417950709F49C
:102ED00047C069837A83FD83EC8396E0929FD0019B
:102EE000939FB00D1124A558BE4FFE01319601905D
:102EF0000D929A95E1F780937A010E94D31416E01F
:102F00008091790190917A018917C1F1189FC001D0
:102F1000112485589E4F0E945D15882379F1E09118
:102F200079011E9FF0011124E558FE4F4081518127
:102F300062817381848195810E94C314809179019B
:102F400090E001968770992780937901D9CF4F81BE
:102F5000588569857A858B859C850E94C314CFCF5F
:102F60000E948A1410927A0110927901EBEAF1E042
:102F700086E0DF011D928A95E9F7C1CF2C960FB646
:102F8000F894DEBF0FBECDBFDF91CF911F910895A2
:102F9000EF92FF920F931F93CF93DF938C01892BB6
:102FA00009F46CC0F12CEE24E394E8012196F801B9
:102FB0008491843740F4843008F051C0813081F02E
:102FC000823019F15BC0853709F444C0A8F19CE751
:102FD000980F903708F052C08F770E94EB1041C0D5
:102FE0000E5F1F4FFE01C49180E28C0F883048F4C1
:102FF000C7708E2D01C0880FCA95EAF70E94731A18
:1030000014C08C2F0E9423102DC00E5F1F4FFE0195
:10301000C49180E28C0F883058F4C7708E2D01C0A7
:10302000880FCA95EAF70E94791A0E949A1A1AC064
:103030008C2F0E94EB1016C00E5F1F4FFE01C49133
:10304000CC2381F08FE99FE00197F1F700C00000E9
:10305000C150F6CF0E5F1F4FFE01F49003C00E94D7
:1030600023108E018F2D882309F49FCFEFE9FFE015
:103070003197F1F700C000008150F5CFDF91CF917B
:103080001F910F91FF90EF90089508956093B501FF
:103090007093B6018093B7019093B8010C947614A5
:1030A0000F931F930091B5011091B6012091B701C4
:1030B0003091B801DC01CB01802B912BA22BB32BDB
:1030C0008093B5019093B601A093B701B093B80176
:1030D0001F910F910C9476140F931F930091B501DB
:1030E0001091B6012091B7013091B801DC01CB01FC
:1030F00080239123A223B3238093B5019093B6013B
:10310000A093B701B093B8011F910F910C9476145E
:103110000F931F930091B5011091B6012091B70153
:103120003091B801DC01CB0180279127A227B3277A
:103130008093B5019093B601A093B701B093B80105
:103140001F910F910C9476141092B1011092B2015C
:103150001092B3011092B4010C94761441E050E047
:1031600060E070E004C0440F551F661F771F8A950A
:10317000D2F74093B1015093B2016093B3017093C1
:10318000B4010C94761441E050E060E070E004C0BB
:10319000440F551F661F771F8A95D2F78091B101A2
:1031A0009091B201A091B301B091B401482B592B79
:1031B0006A2B7B2B4093B1015093B2016093B30112
:1031C0007093B4010C94761441E050E060E070E03C
:1031D00004C0440F551F661F771F8A95D2F740958C
:1031E0005095609570958091B1019091B201A09138
:1031F000B301B091B401482359236A237B23409340
:10320000B1015093B2016093B3017093B4010C9477
:10321000761441E050E060E070E004C0440F551FB8
:10322000661F771F8A95D2F78091B1019091B20104
:10323000A091B301B091B401482759276A277B2791
:103240004093B1015093B2016093B3017093B40104
:103250000C9476140F931F930091B1011091B20159
:103260002091B3013091B401DC01CB01802B912B73
:10327000A22BB32B8093B1019093B201A093B30121
:10328000B093B4011F910F910C9476140F931F9378
:103290000091B1011091B2012091B3013091B401BC
:1032A000DC01CB0180239123A223B3238093B101BE
:1032B0009093B201A093B301B093B4011F910F9109
:1032C0000C9476140F931F930091B1011091B201E9
:1032D0002091B3013091B401DC01CB01802791270B
:1032E000A227B3278093B1019093B201A093B301B9
:1032F000B093B4011F910F910C9476140895CF925E
:10330000DF92EF92FF920F931F93CF93DF938C0185
:10331000C090B501D090B601E090B701F090B8012F
:103320008091B1019091B201A091B301B091B4012B
:10333000C82AD92AEA2AFB2ACFE1D0E0D701C60160
:103340000C2E04C0B695A795979587950A94D2F749
:1033500080FF06C0B8018C2F0E945807019721F406
:10336000219760F780E001C08C2FDF91CF911F91F2
:103370000F91FF90EF90DF90CF900895CF93DF9360
:10338000EC010E947F19BE010E945807DF91CF9186
:103390000895CB010E94BE19089590910C019923C4
:1033A00021F090910D01911109C020910E013091F1
:1033B0000F01F90132969FEF40E01FC0982F9695BC
:1033C000969596959F3050F5E0910E01F0910F0182
:1033D000E90FF11D877021E030E0A90102C0440F20
:1033E000551F8A95E2F7CA019181892B818308953F
:1033F0009F3F39F04F5F4E3041F051915813F8CF55
:103400000DC05111F7CF942FF5CF9F3F39F0F9013F
:10341000E90FF11D97FDFA95828308950895909123
:103420000C01992321F090910D01911109C0209177
:103430000E0130910F01F9013296205F3F4F1FC0FE
:10344000982F9695969596959F30F0F4E0910E0101
:10345000F0910F01E90FF11D877021E030E0A90123
:1034600002C0440F551F8A95E2F7CA0180959181E9
:103470008923818308953196E217F30729F090811B
:103480009813F9CF1082F7CF089581E090E0E09192
:103490000E01F0910F01E80FF91F108201968031A3
:1034A0009105A9F708959091CC01892B8093CC01C7
:1034B000089580959091CC0189238093CC01089543
:1034C0001092CC0108959091CB01892B8093CB0170
:1034D000089580959091CB0189238093CB01089525
:1034E0001092CB0108959091CA01892B8093CA0153
:1034F000089580959091CA0189238093CA01089507
:103500001092CA0108958093B90108951092B901EB
:10351000089580910E0190910F01FC0131969C015C
:10352000205F3F4F80E0919191118F5FE217F30789
:10353000D1F70895E0910E01F0910F018091CC0137
:103540008083E0910E01F0910F0190818091CB0179
:10355000892B8083E0910E01F0910F019081809181
:10356000CA01892B80838091B901882361F0E091A1
:103570000E01F0910F019081892B80830E94891A9E
:1035800081111092B90180910E0190910F010C945C
:10359000060FCF92DF92EF92FF926C01EE24FF2490
:1035A000C114D104E104F10421F0C701B60120E106
:1035B00001C020E0C72ED82EE92EFF24C114D1046B
:1035C000E104F10419F0285FC701B6016B017C0129
:1035D00054E0F694E794D794C7945A95D1F7C11460
:1035E000D104E104F10419F02C5FC701B6016B01AD
:1035F0007C0142E0F694E794D794C7944A95D1F7BA
:10360000C114D104E104F10419F02E5FC701B60121
:10361000DC01CB01B695A79597958795892B8A2BC9
:103620008B2B09F02F5F822FFF90EF90DF90CF90D0
:1036300008958091E401843021F11092CE0120E4BC
:1036400088E190E00FB6F894A895809360000FBED3
:103650002093600080E00E94F30783B7817F84603D
:1036600083BF83B7816083BF7894889583B78E7F4B
:1036700083BF88E10FB6F8948093600010926000D9
:103680000FBE089508950895CF930E94421B0E9493
:1036900023040E94431BC0E08C2F0E94110581115E
:1036A00004C0CF5FCE30C1F701C081E0CF91089553
:1036B0000E948A140E94FA0E0C94F30782E084BDE3
:1036C00093E095BD9AEF97BD80936E0008952FB754
:1036D000F8948091CF019091D001A091D101B09147
:1036E000D2012FBF0895CF92DF92EF92FF920F93F6
:1036F0001F932FB7F8944091CF015091D001609162
:10370000D1017091D2012FBF6A017B01EE24FF2409
:103710008C0120E030E0C016D106E206F30610F47A
:10372000415051099A01281B390BC9011F910F9172
:10373000FF90EF90DF90CF9008951F920F920FB6F9
:103740000F9211248F939F93AF93BF938091CF01DA
:103750009091D001A091D101B091D2010196A11D0B
:10376000B11D8093CF019093D001A093D101B0936C
:10377000D201BF91AF919F918F910F900FBE0F908B
:103780001F9018950E94F70BF8942FEF87EA91E6A7
:10379000215080409040E1F700C0000087E090EBAE
:1037A000DC018093EE019093EF01A093F001B093C0
:1037B000F1019CE088E10FB6F894A8958093600031
:1037C0000FBE90936000FFCFEF92FF920F931F9375
:1037D000CF93DF93D82FC0E08C2F0E94110500E01B
:1037E00010E0E82EF12CC701002E02C095958795B8
:1037F0000A94E2F780FD06C00F5F1F4F06301105E7
:1038000091F709C0602F7C2F80E00E941905D81322
:10381000F3CF81E004C0CF5FCE30F1F680E0DF91DE
:10382000CF911F910F91FF90EF900895CF93C82FE4
:103830008CE20E94E41B882321F08C2FCF910C9402
:10384000E41B80E0CF910895CF930E946B1D8111FE
:1038500002C00E94511DC5E6C15049F00E942304D8
:103860008FE39CE90197F1F700C00000F5CF89E2F2
:103870000E94161C811113C18AE20E94161C81113C
:103880000E94511D85E00E94161C81110E94C21BDE
:103890000E94761D8093CD0187E00E94161C88232C
:1038A000A9F18BE10E94161C882351F08091CD0173
:1038B00081FB222720F991E0922790FB81F90EC02D
:1038C0008EE00E94161C882361F08091CD0182FB5E
:1038D000222720F991E0922790FB82F98093CD0175
:1038E00015C080E10E94161C9091CD01882341F003
:1038F00093FB222720F981E0822780FB93F904C003
:10390000892F809580FB90F99093CD018091CD0116
:103910000E947A1D0E94881D8093ED0180EE0E9416
:10392000161C882341F08091ED01982F909590FB13
:1039300080F98093ED0189E30E94161C882359F0D9
:103940008091ED0181FB222720F991E0922790FBE5
:1039500081F98093ED0182EE0E94161C882359F0B4
:103960008091ED0182FB222720F991E0922790FBC4
:1039700082F98093ED0186EE0E94161C882359F08F
:103980008091ED0183FB222720F991E0922790FBA3
:1039900083F98093ED0183EE0E94161C882359F071
:1039A0008091ED0184FB222720F991E0922790FB82
:1039B00084F98093ED0185E30E94161C882359F059
:1039C0008091ED0185FB222720F991E0922790FB61
:1039D00085F98093ED0181E30E94161C882359F03C
:1039E0008091ED0186FB222720F991E0922790FB40
:1039F00086F98093ED0181E10E94161C882359F01D
:103A00008091ED0187FB222720F991E0922790FB1E
:103A100087F98093ED018091ED010E948C1D8091CA
:103A2000ED0187FB882780F980930D0187E20E94D2
:103A3000161CC82F8EE10E94161C8111C2608FE1F6
:103A40000E94161C8111C46080E20E94161C811124
:103A5000C86081E20E94161C8111C06182E20E944E
:103A6000161C8111C06283E20E94161C8111C06481
:103A700084E20E94161C882311F0C06802C0CC2387
:103A800029F08C2F0E94831D6C2F03C00E947F1D84
:103A9000682F70E080E090E0CF910C944618CF91B1
:103AA00008956DEE7EEF80E090E00E94BD2360E01F
:103AB00082E090E00E94AB2360E083E090E00E940F
:103AC000AB2360E084E090E00E94AB2360E085E0FF
:103AD00090E00C94AB2380E090E00E94A52321E0CD
:103AE0008D3E9E4F09F020E0822F089582E090E005
:103AF0000C949D23682F82E090E00C94AB2383E02C
:103B000090E00C949D23682F83E090E00C94AB230D
:103B100084E090E00C949D23682F84E090E00C9466
:103B2000AB238091D50180FF0BC06091130185E02C
:103B3000689FB001112475956795759567952BC0A1
:103B400081FF09C06091130185E0689FB0011124D5
:103B50007595679520C082FF07C06091130185E0CD
:103B6000689FB001112417C09091D6019923D1F01C
:103B700060911201961788F72091130185E0289F24
:103B800090011124929FA001939F500D112470E089
:103B9000CA010E946F236038710540F461157105F8
:103BA00039F002C065E070E0862F08958FE7089530
:103BB00081E008958091D50180FF08C060911101D6
:103BC00070E0759567957595679521C081FF06C072
:103BD0006091110170E07595679519C082FF04C06E
:103BE0006091110170E010C09091D6019923C1F04D
:103BF000609110019617A0F780911101899FC00173
:103C0000112470E00E946F236038710528F461155B
:103C1000710521F0862F08958FE7089581E00895BA
:103C200061E070E0F4CF803F21F40E94911D819506
:103C300004C0813F29F40E94911D8093D901089509
:103C4000823F21F40E94911D819504C0833F29F495
:103C50000E94911D8093D8010895893F19F40E9414
:103C6000DA1D05C08A3F31F40E94DA1D81958093E8
:103C7000DA0108958B3F21F40E94DA1D819504C07A
:103C80008C3F29F40E94DA1D8093DB010895843F64
:103C900021F48091D701816017C0853F21F4809184
:103CA000D701826011C0863F21F48091D7018460E2
:103CB0000BC0873F21F48091D701886005C0883F01
:103CC00031F48091D70180618093D70108958D3FB1
:103CD00021F48091D50181600BC08E3F21F4809149
:103CE000D501826005C08F3F29F48091D5018460A1
:103CF0008093D5010895803F39F48091D90187FFE1
:103D00006CC01092D90169C0813F29F48091D9011A
:103D10001816BCF362C09091D801823F29F497FF36
:103D20005CC01092D80159C0833F19F41916CCF326
:103D300054C0893F41F48091DA0118160CF04DC04F
:103D40001092DA014AC08A3F29F48091DA0187FF94
:103D500044C0F6CF8B3F39F48091DB0187FF3DC033
:103D60001092DB013AC08C3F29F48091DB011816D8
:103D7000BCF333C0843F21F48091D7018E7F17C0FC
:103D8000853F21F48091D7018D7F11C0863F21F4BA
:103D90008091D7018B7F0BC0873F21F48091D701A1
:103DA000877F05C0883F31F48091D7018F7E809353
:103DB000D70113C08D3F21F48091D5018E7F0BC0B8
:103DC0008E3F21F48091D5018D7F05C08F3F29F46E
:103DD0008091D5018B7F8093D5018091D80181118D
:103DE0000EC08091D90181110AC08091DA01811140
:103DF00006C08091DB01811102C01092D6010895A6
:103E000087ED91E00E94110F0E94671B9093D401EF
:103E10008093D30108951F93CF93DF938091D301B3
:103E20009091D4010E94731BAC019091D60199230B
:103E300021F02091140130E006C0209115018AE0A4
:103E4000289F900111244217530708F486C08091DF
:103E5000D801C091D901D091DA011091DB01811113
:103E600007C0C11176C0D11174C0111172C075C0E4
:103E70009F3F19F09F5F9093D601181624F40E947B
:103E8000911D8093D8018091D80187FF05C00E94C1
:103E9000911D81958093D8011C1624F40E94911DD8
:103EA0008093D9018091D90187FF05C00E94911D9F
:103EB00081958093D9016091D801662339F1C09131
:103EC000D901CC2319F1772767FD7095872F972F9C
:103ED0000E94802223E333E343E35FE30E94E42272
:103EE0000E944D226093D8016C2F772767FD709553
:103EF000872F972F0E94802223E333E343E35FE37E
:103F00000E94E4220E944D226093D9011D1624F4E0
:103F10000E94DA1D8093DA018091DA0187FF05C0E3
:103F20000E94DA1D81958093DA01111624F40E9413
:103F3000DA1D8093DB018091DB0187FF05C00E94C1
:103F4000DA1D81958093DB01DF91CF911F910C9455
:103F5000001F9F3F09F08ECF96CFDF91CF911F9129
:103F60000895E7EDF1E085E0DF011D928A95E9F71C
:103F70001092D6011092D5010895833081F128F472
:103F8000813059F08230D1F00895853009F449C06C
:103F9000B8F1863009F456C0089580911501262F96
:103FA00030E0280F311D2F3F310524F4680F609356
:103FB000150108958FEF80931501089580911401E4
:103FC000262F30E0280F311D2F3F310524F4680FD4
:103FD0006093140108958FEF8093140108958091E8
:103FE0001301262F30E0280F311D2F3F310524F417
:103FF000680F6093130108958FEF80931301089564
:1040000080911201262F30E0280F311D2F3F3105FE
:1040100024F4680F6093120108958FEF80931201CA
:10402000089580911101262F30E0280F311D2F3F78
:10403000310524F4680F6093110108958FEF809388
:104040001101089580911001262F30E0280F311DB5
:104050002F3F310524F4680F6093100108958FEF0E
:10406000809310010895833011F128F4813049F0D4
:10407000823091F00895853081F120F18630C1F1D0
:10408000089580911501681720F4861B809315010F
:10409000089510921501089580911401681720F475
:1040A000861B809314010895109214010895809145
:1040B0001301681720F4861B809313010895109252
:1040C0001301089580911201681720F4861B8093D4
:1040D000120108951092120108958091110168173C
:1040E00020F4861B80931101089510921101089508
:1040F00080911001681720F4861B809310010895A9
:104100001092100108950F931F938D3109F46BC025
:1041100008F03FC08E3009F47FC0C0F4873009F446
:1041200069C068F4863009F0B1C08091CD01817F0B
:104130008E7F8093CD0181E08093DD01A8C088301F
:1041400009F4A2C08B3009F49FC0A0C0863109F4E5
:104150009BC078F4803109F472C0813109F096C0B7
:104160000E948A1490910D0181E0892780930D01AE
:104170008BC0893109F488C08B3109F087C08091E8
:10418000CD0181FB222720F991E0922790FB81F954
:104190004CC0853309F470C048F4873209F46CC010
:1041A00008F459C0893209F467C070C0833438F408
:1041B0008A3308F04EC0883309F466C067C0833480
:1041C00009F45AC0883409F061C00E948A140FEFC4
:1041D00013ED20E3015010402040E1F700C0000043
:1041E0000E94C21B51C00E9407220E94FA0E0E9428
:1041F000F3074AC09091CD01892F8095817080FB93
:1042000090F929F0966098609093CD0140C0997F15
:10421000977F9093CD0138C08091CD0182FB2227FA
:1042200020F991E0922790FB82F98093CD019923A8
:1042300059F18091CD0181608093CD0125C080919D
:10424000CD0183FB222720F991E0922790FB83F98F
:10425000ECCF895301C08D5141E050E060E070E047
:104260008A019B0104C0000F111F221F331F8A9572
:10427000D2F7C901B80104C061E070E080E090E0CD
:104280000E9446180E948A1481E001C080E01F91BC
:104290000F91089580E0089580E00895CF93C82F8E
:1042A0008091DD01813079F018F08230E9F187C02A
:1042B000E0910E01F0910F018081813169F082322D
:1042C00009F07FC009C0E0910E01F0910F018081DB
:1042D000813111F0823261F48C2F0E944A218111C8
:1042E00004C08C2F0E9483201DC081E090E01AC082
:1042F0008C2F0E944C21811114C0C43179F048F4F4
:10430000CB3079F0C03109F060C082E08093DD01EC
:1043100008C0C93219F0C83321F057C01092DD012E
:1043200054C081E0817053C0C93289F118F5C4319D
:1043300071F1A8F4C73009F046C08AE080931501F6
:1043400094E19093140193E09093130180931201F0
:1043500088E08093110188E28093100134C0CE512F
:10436000C63088F5EC2FF0E0E65DFE4F808180934B
:10437000DC0129C0CE34E9F020F4CB3421F56AE029
:1043800013C0C13579F0C235F1F461E00DC0809100
:10439000DC01882319F01092DC0115C081E08093C4
:1043A000DD0115C061E006C08091DC010E94BD1FE7
:1043B0000AC06AE08091DC010E94332004C01092A0
:1043C000DD0180E004C081E002C080E0ABCFCF918E
:1043D0000895E1E8F0E080818860808380818160D9
:1043E00080838FB7F89493E09093890090ED909339
:1043F00088008FBF0895EFE6F0E0808182608083BF
:104400000895EFE6F0E080818D7F80830895EFE6E8
:10441000F0E0908182E08927808308951F920F92B7
:104420000FB60F9211242F933F934F935F936F9387
:104430007F938F939F93AF93BF93EF93FF9380915D
:10444000DE019091DF0101969093DF018093DE0100
:10445000811103C082E00E94F307E091DF01E6953D
:10446000E695F0E0E657FB4FE4918091DE018E1374
:1044700003C080E00E94F307FF91EF91BF91AF91DD
:104480009F918F917F916F915F914F913F912F916C
:104490000F900FBE0F901F90189504D06894B11123
:1044A0008DC0089570D088F09F5790F0B92F99274C
:1044B000B751A0F0D1F0660F771F881F991F1AF02F
:1044C000BA95C9F712C0B13081F077D0B1E0089544
:1044D00074C0672F782F8827B85F39F0B93FCCF3C5
:1044E000869577956795B395D9F73EF49095809525
:1044F000709561957F4F8F4F9F4F0895E89409C045
:1045000097FB3EF490958095709561957F4F8F4F06
:104510009F4F9923A9F0F92F96E9BB279395F6951C
:10452000879577956795B795F111F8CFFAF4BB0F9A
:1045300011F460FF1BC06F5F7F4F8F4F9F4F16C0FE
:10454000882311F096E911C0772321F09EE8872F88
:10455000762F05C0662371F096E8862F70E060E044
:104560002AF09A95660F771F881FDAF7880F9695BD
:10457000879597F9089557FD9058440F551F59F0A6
:104580005F3F71F04795880F97FB991F61F09F3F40
:1045900079F087950895121613061406551FF2CF69
:1045A0004695F1DF08C0161617061806991FF1CFB9
:1045B00086957105610508940895E894BB276627E0
:1045C0007727CB0197F908950BD078C069D028F0F0
:1045D0006ED018F0952309F05AC05FC01124EECFB9
:1045E000CADFA0F3959FD1F3950F50E0551F629F4E
:1045F000F001729FBB27F00DB11D639FAA27F00D3C
:10460000B11DAA1F649F6627B00DA11D661F829F62
:104610002227B00DA11D621F739FB00DA11D621F47
:10462000839FA00D611D221F749F3327A00D611D64
:10463000231F849F600D211D822F762F6A2F112446
:104640009F5750408AF0E1F088234AF0EE0FFF1F99
:10465000BB1F661F771F881F91505040A9F79E3FD0
:10466000510570F014C0AACF5F3FECF3983EDCF325
:10467000869577956795B795F795E7959F5FC1F70D
:10468000FE2B880F911D9695879597F9089597F9B8
:104690009F6780E870E060E008959FEF80EC0895E8
:1046A00000240A9416161706180609060895002411
:1046B0000A9412161306140605060895092E03948B
:1046C000000C11F4882352F0BB0F40F4BF2B11F4FF
:1046D00060FF04C06F5F7F4F8F4F9F4F089597FB20
:1046E000072E16F4009407D077FD09D00E94892385
:1046F00007FC05D03EF4909581959F4F08957095E5
:1047000061957F4F0895EE0FFF1F0590F491E02D06
:104710000994AA1BBB1B51E107C0AA1FBB1FA61708
:10472000B70710F0A61BB70B881F991F5A95A9F75A
:1047300080959095BC01CD010895F999FECF92BD69
:1047400081BDF89A992780B50895A8E1B0E042E0CC
:1047500050E00C94C523262FF999FECF92BD81BD60
:10476000F89A019700B4021639F01FBA20BD0FB6AF
:10477000F894FA9AF99A0FBE08950196272F0E948D
:10478000AC230C94AB23DC01CB01FC01F999FECFE7
:1047900006C0F2BDE1BDF89A319600B40D924150C9
:0A47A0005040B8F70895F894FFCFD9
:1047AA002002F507830860082C08F8070101BA01FE
:1047BA0028080A03140A3F4D36394B04FE03C8037E
:1047CA008F0322033B0354036D030102030405060E
:0447DA0007080900C3
:00000001FF

@ -17,7 +17,7 @@ This requires a little bit of familiarity with coding.
2. Clone the repository (download it)
3. Set up a build environment as per [the build guide](/BUILD_GUIDE.md)
- Using a Mac and have homebrew? just run `brew tap osx-cross/avr && brew install avr-libc`
4. Copy `keymaps/default/keymap.c` into `keymaps/your_name/keymap.c` (for example, `keymaps/german/keymap.c`)
4. Copy `keyboard/ergodox_ez/keymaps/default/keymap.c` into `keymaps/your_name/keymap.c` (for example, `keymaps/german/keymap.c`)
5. Edit this file, changing keycodes to your liking (see "Finding the keycodes you need" below). Try to edit the comments as well, so the "text graphics" represent your layout correctly. See below for more tips on sharing your work.
6. Compile your firmware by running `make clean` followed by `make KEYMAP=your_name`. For example, `make KEYMAP=german`. This will result in a hex file, which will always be called `ergodox_ez.hex`, regardless of your keymap name.
6. Flash this hex file using the [Teensy loader](https://www.pjrc.com/teensy/loader.html) as described in step 4 in the "Easy Way" above.

@ -0,0 +1,140 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# Target file name (without extension).
TARGET = gh60
# Directory common source filess exist
TOP_DIR = ../..
TMK_DIR = ../../tmk_core
# Directory keyboard dependent files exist
TARGET_DIR = .
# # project specific files
SRC = gh60.c
ifdef KEYMAP
SRC := keymaps/$(KEYMAP).c $(SRC)
else
SRC := keymaps/default.c $(SRC)
endif
CONFIG_H = config.h
# MCU name
#MCU = at90usb1287
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
# CONSOLE_ENABLE = yes # Console for debug(+400)
# COMMAND_ENABLE = yes # Commands for debug and configuration
KEYBOARD_LOCK_ENABLE = yes # Allow locking of keyboard via magic key
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
# MIDI_ENABLE = YES # MIDI controls
# UNICODE_ENABLE = YES # Unicode
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR)
include $(TOP_DIR)/quantum/quantum.mk

@ -0,0 +1,60 @@
## gh60 Rev C keyboard firmware
![gh60 Rev C PCB](gh60revc.jpg)
/* Column pin configuration
* col: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
* pin: F0 F1 E6 C7 C6 B6 D4 B1 B7 B5 B4 D7 D6 B3 (Rev.C)
*/
/* Row pin configuration
* row: 0 1 2 3 4
* pin: D0 D1 D2 D3 D5
*/
GPIO pads
0 F7 WASD LEDs
1 F6 ESC LED
2 F5 FN LED
3 F4 POKER Arrow LEDs
B2 Capslock LED
B0 not connected
Functions to controls LED clusters
gh60_caps_led_on()
gh60_poker_leds_on()
gh60_fn_led_on()
gh60_esc_led_on()
gh60_wasd_leds_on()
gh60_caps_led_off()
gh60_poker_leds_off()
gh60_fn_led_off()
gh60_esc_led_off()
gh60_wasd_leds_off()
======================
## Quantum MK Firmware
For the full Quantum feature list, see [the parent README.md](/README.md).
## Building
Download or clone the whole firmware and navigate to the keyboard/gh60_rev_c folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
Depending on which keymap you would like to use, you will have to compile slightly differently.
### Default
To build with the default keymap, simply run `make`.
### Other Keymaps
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` in the keymaps folder, and see keymap document (you can find in top README.md) and existent keymap files.
To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
```
$ make KEYMAP=[default|jack|<name>]
```
Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.

@ -0,0 +1,157 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER You
#define PRODUCT gh60
#define DESCRIPTION A custom keyboard
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 14
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
#define COLS (int []){ F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 }
#define ROWS (int []){ D0, D1, D2, D3, D5 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
#define BACKLIGHT_LEVELS 3
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/*
* Force NKRO
*
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
* makefile for this to work.)
*
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
* until the next keyboard reset.
*
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
* fully operational during normal computer usage.
*
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
* power-up.
*
*/
//#define FORCE_NKRO
/*
* Magic Key Options
*
* Magic keys are hotkey commands that allow control over firmware functions of
* the keyboard. They are best used in combination with the HID Listen program,
* found here: https://www.pjrc.com/teensy/hid_listen.html
*
* The options below allow the magic key functionality to be changed. This is
* useful if your keyboard/keypad is missing keys and you want magic key support.
*
*/
/* key combination for magic key command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* control how magic key switches layers */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
/* override magic key keymap */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
//#define MAGIC_KEY_HELP1 H
//#define MAGIC_KEY_HELP2 SLASH
//#define MAGIC_KEY_DEBUG D
//#define MAGIC_KEY_DEBUG_MATRIX X
//#define MAGIC_KEY_DEBUG_KBD K
//#define MAGIC_KEY_DEBUG_MOUSE M
//#define MAGIC_KEY_VERSION V
//#define MAGIC_KEY_STATUS S
//#define MAGIC_KEY_CONSOLE C
//#define MAGIC_KEY_LAYER0_ALT1 ESC
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
//#define MAGIC_KEY_LAYER0 0
//#define MAGIC_KEY_LAYER1 1
//#define MAGIC_KEY_LAYER2 2
//#define MAGIC_KEY_LAYER3 3
//#define MAGIC_KEY_LAYER4 4
//#define MAGIC_KEY_LAYER5 5
//#define MAGIC_KEY_LAYER6 6
//#define MAGIC_KEY_LAYER7 7
//#define MAGIC_KEY_LAYER8 8
//#define MAGIC_KEY_LAYER9 9
//#define MAGIC_KEY_BOOTLOADER PAUSE
//#define MAGIC_KEY_LOCK CAPS
//#define MAGIC_KEY_EEPROM E
//#define MAGIC_KEY_NKRO N
//#define MAGIC_KEY_SLEEP_LED Z
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,67 @@
#include "gh60.h"
#include "led.h"
__attribute__ ((weak))
void matrix_init_user(void) {
// 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
}
__attribute__ ((weak))
void process_action_user(keyrecord_t *record) {
// leave this function blank - it can be defined in a keymap file
}
__attribute__ ((weak))
void led_set_user(uint8_t usb_led) {
// leave this function blank - it can be defined in a keymap file
}
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
matrix_init_user();
}
void matrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
matrix_scan_user();
}
void process_action_kb(keyrecord_t *record) {
// put your per-action keyboard code here
// runs for every action, just before processing by the firmware
process_action_user(record);
}
void led_set_kb(uint8_t usb_led) {
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
gh60_caps_led_on();
} else {
gh60_caps_led_off();
}
// if (usb_led & (1<<USB_LED_NUM_LOCK)) {
// gh60_esc_led_on();
// } else {
// gh60_esc_led_off();
// }
// if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
// gh60_fn_led_on();
// } else {
// gh60_fn_led_off();
// }
led_set_user(usb_led);
}

@ -0,0 +1,81 @@
#ifndef GH60_H
#define GH60_H
#include "matrix.h"
#include "keymap_common.h"
#include "backlight.h"
#include <stddef.h>
/* GH60 LEDs
* GPIO pads
* 0 F7 WASD LEDs
* 1 F6 ESC LED
* 2 F5 FN LED
* 3 F4 POKER Arrow LEDs
* B2 Capslock LED
* B0 not connected
*/
inline void gh60_caps_led_on(void) { DDRB |= (1<<2); PORTB &= ~(1<<2); }
inline void gh60_poker_leds_on(void) { DDRF |= (1<<4); PORTF &= ~(1<<4); }
inline void gh60_fn_led_on(void) { DDRF |= (1<<5); PORTF &= ~(1<<5); }
inline void gh60_esc_led_on(void) { DDRF |= (1<<6); PORTF &= ~(1<<6); }
inline void gh60_wasd_leds_on(void) { DDRF |= (1<<7); PORTF &= ~(1<<7); }
inline void gh60_caps_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); }
inline void gh60_poker_leds_off(void) { DDRF &= ~(1<<4); PORTF &= ~(1<<4); }
inline void gh60_fn_led_off(void) { DDRF &= ~(1<<5); PORTF &= ~(1<<5); }
inline void gh60_esc_led_off(void) { DDRF &= ~(1<<6); PORTF &= ~(1<<6); }
inline void gh60_wasd_leds_off(void) { DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
/* GH60 keymap definition macro
* K2C, K31 and K3C are extra keys for ISO
*/
#define KEYMAP( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \
) { \
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D }, \
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D }, \
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D }, \
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D }, \
{ KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_##K45, KC_NO, KC_NO, KC_NO, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D } \
}
/* ANSI valiant. No extra keys for ISO */
#define KEYMAP_ANSI( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
) KEYMAP( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \
K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, NO, K3D, \
K40, K41, K42, K45, NO, K4A, K4B, K4C, K4D \
)
#define KEYMAP_HHKB( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49,\
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3C, \
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
) KEYMAP( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \
K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \
)
void matrix_init_user(void);
void matrix_scan_user(void);
void process_action_user(keyrecord_t *record);
void led_set_user(uint8_t usb_led);
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

@ -0,0 +1,69 @@
#include "gh60.h"
#include "action_layer.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* 0: qwerty */
KEYMAP(
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, GRV, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \
CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NO, ENT, \
LSFT,FN1, Z, X, C, V, B, N, M, COMM,DOT, SLSH,FN0, RSFT, \
LCTL,LGUI,LALT, SPC, BSLS,RALT,RGUI,APP, RCTL),
/* 1: fn */
KEYMAP(
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \
TRNS,TRNS,UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS),
/* 2: arrows */
KEYMAP(
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,UP, \
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,LEFT,DOWN,RGHT),
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay
[1] = ACTION_LAYER_TOGGLE(2), // toggle arrow overlay
};
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;
};
void matrix_scan_user(void) {
//Layer LED indicators
uint32_t layer = layer_state;
if (layer & (1<<1)) {
gh60_wasd_leds_on();
gh60_fn_led_on();
} else {
gh60_wasd_leds_off();
gh60_fn_led_off();
}
if (layer & (1<<2)) {
gh60_poker_leds_on();
gh60_esc_led_on();
} else {
gh60_poker_leds_off();
gh60_esc_led_off();
}
};

@ -0,0 +1,18 @@
/* Column pin configuration
* col: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
* pin: F0 F1 E6 C7 C6 B6 D4 B1 B7 B5 B4 D7 D6 B3 (Rev.C)
*/
/* Row pin configuration
* row: 0 1 2 3 4
* pin: D0 D1 D2 D3 D5
*/
GPIO pads
0 F7 WASD LEDs
1 F6 ESC LED
2 F5 FN LED
3 F4 POKER Arrow LEDs
B2 Capslock LED
B0 not connected

@ -171,10 +171,6 @@ endif
endif
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
SRC := backlight.c $(SRC)
endif
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax

@ -1,61 +0,0 @@
#include <avr/io.h>
#include "backlight.h"
#define CHANNEL OCR1C
void backlight_init_ports()
{
// Setup PB7 as output and output low.
DDRB |= (1<<7);
PORTB &= ~(1<<7);
// Use full 16-bit resolution.
ICR1 = 0xFFFF;
// I could write a wall of text here to explain... but TL;DW
// Go read the ATmega32u4 datasheet.
// And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
// Pin PB7 = OCR1C (Timer 1, Channel C)
// Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
// (i.e. start high, go low when counter matches.)
// WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
// Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
backlight_init();
}
void backlight_set(uint8_t level)
{
if ( level == 0 )
{
// Turn off PWM control on PB7, revert to output low.
TCCR1A &= ~(_BV(COM1C1));
CHANNEL = 0x0;
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
}
else if ( level == BACKLIGHT_LEVELS )
{
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness
CHANNEL = 0xFFFF;
}
else
{
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness
CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
}
}

@ -38,6 +38,7 @@ extern keymap_config_t keymap_config;
#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
@ -151,7 +152,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | 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 +161,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}
},
@ -319,13 +320,13 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
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_off(_MUSIC);
stop_all_notes();
layer_on(_PLOVER);
if (!eeconfig_is_enabled()) {
eeconfig_init();
@ -343,7 +344,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;
};
@ -363,7 +368,7 @@ void play_goodbye_tone()
}
uint8_t starting_note = 0x0C;
int offset = 7;
int offset = 0;
void process_action_user(keyrecord_t *record) {

@ -0,0 +1,2 @@
# The Default Planck Layout

@ -0,0 +1,383 @@
// 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 _MUSIC 5
#define _PLOVER 6
#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 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)
// 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 },
{M(M_BL), 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}
},
/* 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 |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | 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},
{_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______},
{_______, VC_DE, VC_IN, MUS_ON, MUS_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 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);
breathing_speed_set(2);
breathing_pulse();
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);
breathing_speed_set(2);
breathing_pulse();
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 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
stop_all_notes();
PLAY_NOTE_ARRAY(tone_plover, false, 0);
#endif
layer_off(_RAISE);
layer_off(_LOWER);
layer_off(_ADJUST);
layer_off(_MUSIC);
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()
{
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

@ -0,0 +1,2 @@
AUDIO_ENABLE = yes
NKRO_ENABLE = yes

@ -0,0 +1,88 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER Ortholinear Keyboards
#define PRODUCT The Planck Keyboard
#define DESCRIPTION A compact ortholinear keyboard
/* key matrix size */
#define MATRIX_ROWS 4
#define MATRIX_COLS 12
/* Planck PCB default pin-out */
#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 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* ws2812 RGB LED */
#define ws2812_PORTREG PORTD
#define ws2812_DDRREG DDRD
#define ws2812_pin PD1
#define RGBLED_NUM 28 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,547 @@
#include "planck.h"
#include "action_layer.h"
#include "eeconfig.h"
#include "led.h"
#ifdef AUDIO_ENABLE
#include "audio.h"
#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 MACRO_BACKLIGHT 20
#define M_QWRTY M(MACRO_QWERTY)
#define M_COLMK M(MACRO_COLEMAK)
#define M_DVORK M(MACRO_DVORAK)
#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 TIMBR_2 M(MACRO_TIMBRE_2)
#define TIMBR_3 M(MACRO_TIMBRE_3)
#define TIMBR_4 M(MACRO_TIMBRE_4)
#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)
#define MUS_OFF M(MACRO_MUSIC_OFF)
#define AUD_OFF M(MACRO_AUDIO_OFF)
#define AUD_ON M(MACRO_AUDIO_ON)
#define VC_UP M(MACRO_INC_VOICE)
#define VC_DOWN M(MACRO_DEC_VOICE)
#define SC_UNDO LCTL(KC_Z)
#define SC_REDO LCTL(KC_Y)
#define SC_CUT LCTL(KC_X)
#define SC_COPY LCTL(KC_C)
#define SC_PSTE LCTL(KC_V)
#define SC_SELA LCTL(KC_A)
#define SC_SAVE LCTL(KC_S)
#define SC_OPEN LCTL(KC_O)
#define SC_ACLS LALT(KC_F4)
#define SC_CCLS LCTL(KC_F4)
#define _______ KC_TRNS
#define XXXXXXX KC_NO
#define ________________ _______, _______
#define XXXXXXXXXXXXXXXX XXXXXXX, XXXXXXX
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* QWERTY
* .-----------------------------------------------------------------------------------------------------------.
* | TAB | Q | W | E | R | T | Y | U | I | O | P | BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | ESC | A | S | D | F | G | H | J | K | L | ; | ' |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LSHIFT | Z | X | C | V | B | N | M | , | . | / | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | SPACE | SPACE | LOWER | UP | DOWN | LEFT | RIGHT |
* '-----------------------------------------------------------------------------------------------------------'
*/
[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_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 },
},
/* COLEMAK
* .-----------------------------------------------------------------------------------------------------------.
* | TAB | Q | W | F | P | G | J | L | U | Y | ; | ESC |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | BACKSP | A | R | S | T | D | H | N | E | I | O | ' |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LSHIFT | Z | X | C | V | B | K | M | , | . | / | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | SPACE | SPACE | LOWER | UP | DOWN | LEFT | RIGHT |
* '-----------------------------------------------------------------------------------------------------------'
*/
[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_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 },
},
/* DVORAK
* .-----------------------------------------------------------------------------------------------------------.
* | TAB | ' | , | . | P | Y | F | G | C | R | L | BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | ESC | A | O | E | U | I | D | H | T | N | S | ' |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LSHIFT | ; | Q | J | K | X | B | M | W | V | Z | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | SPACE | SPACE | LOWER | UP | DOWN | LEFT | RIGHT |
* '-----------------------------------------------------------------------------------------------------------'
*/
[LAYER_DVORAK] = { /* 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 },
{ KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_UP, KC_DOWN, KC_LEFT, KC_RGHT },
},
/* Raise
* .-----------------------------------------------------------------------------------------------------------.
* | ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | XXXXXX | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | [ | ] | \ |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LSHIFT | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX | XXXXXX | XXXXXX | XXXXXX | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | BACKSP | BACKSP | LOWER | PG UP | PG DN | HOME | END |
* '-----------------------------------------------------------------------------------------------------------'
*/
[LAYER_RAISE] = { /* RAISED */
{ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL },
{ XXXXXXX, 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, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
{ _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_PGUP, KC_PGDN, KC_HOME, KC_END },
},
/* LOWERED
* .-----------------------------------------------------------------------------------------------------------.
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | INS |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | XXXXXX | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LSHIFT | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX | XXXXXX | XXXXXX | XXXXXX | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | BACKSP | BACKSP | LOWER | PG UP | PG DN | HOME | END |
* '-----------------------------------------------------------------------------------------------------------'
*/
[LAYER_LOWER] = { /* LOWERED */
{ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_INS },
{ XXXXXXX, 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, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
{ _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_PGUP, KC_PGDN, KC_HOME, KC_END },
},
/* FUNCTION
* .-----------------------------------------------------------------------------------------------------------.
* | NUM LK | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | PAUSE |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | CAP LK | F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | PRINT |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | SCR LK | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | MUTE |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LCTRL | LWIN | FN | LALT | RAISE | PLAY | PLAY | LOWER | VOL UP | VOL DN | NEXT | PREV |
* '-----------------------------------------------------------------------------------------------------------'
*/
[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_PAUS },
{ KC_CAPS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_PSCR },
{ KC_SLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE },
{ _______, _______, _______, _______, _______, KC_MPLY, KC_MPLY, _______, KC_VOLU, KC_VOLD, KC_MPRV, KC_MNXT },
},
#ifdef MOUSEKEY_ENABLE
[LAYER_MOUSE] = { /* MOUSE */
{ KC_ESC, KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC },
{ 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, KC_WH_U, KC_WH_D },
{ _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, KC_MS_U, KC_MS_D, KC_MS_L, KC_MS_R },
},
#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, M_RAISE, XXXXXXX, XXXXXXX, M_LOWER, 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 },
{ _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______ },
{ _______, _______, _______, _______, M_BACKL, RESET, _______, M_MOUSE, _______, _______, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, VC_UP, VC_DOWN, _______, _______ },
},
/*
[LAYER_EMPTY] = {
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, },
{ _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, },
},
*/
};
#ifdef AUDIO_ENABLE
float tone_my_startup[][2] = SONG(ODE_TO_JOY);
float tone_my_goodbye[][2] = SONG(ROCK_A_BYE_BABY);
float tone_qwerty[][2] = SONG(QWERTY_SOUND);
float tone_dvorak[][2] = SONG(DVORAK_SOUND);
float tone_colemak[][2] = SONG(COLEMAK_SOUND);
float tone_audio_on[][2] = SONG(CLOSE_ENCOUNTERS_5_NOTE);
float tone_music_on[][2] = SONG(DOE_A_DEER);
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 */
void persistant_default_layer_set(uint16_t default_layer)
{
eeconfig_update_default_layer(default_layer);
default_layer_set(default_layer);
}
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 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 */
}
break;
case MACRO_COLEMAK:
if (record->event.pressed)
{
persistant_default_layer_set(1UL<<LAYER_COLEMAK);
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
#endif /* AUDIO_ENABLE */
}
break;
case MACRO_DVORAK:
if (record->event.pressed)
{
persistant_default_layer_set(1UL<<LAYER_DVORAK);
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO);
#endif /* AUDIO_ENABLE */
}
break;
case MACRO_LOWER:
if (record->event.pressed)
{
layer_on(LAYER_LOWER);
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
else
{
layer_off(LAYER_LOWER);
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
break;
case MACRO_RAISE:
if (record->event.pressed)
{
layer_on(LAYER_RAISE);
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
else
{
layer_off(LAYER_RAISE);
update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
}
break;
case MACRO_FUNCTION:
if (record->event.pressed)
{
layer_on(LAYER_FUNCTION);
}
else
{
layer_off(LAYER_FUNCTION);
}
break;
#ifdef BACKLIGHT_ENABLE
case MACRO_BACKLIGHT:
if (record->event.pressed)
{
backlight_step();
}
#endif
#ifdef MOUSEKEY_ENABLE
case MACRO_MOUSE:
if (record->event.pressed)
{
layer_invert(LAYER_MOUSE);
}
break;
#endif /* MOUSEKEY_ENABLE */
#ifdef AUDIO_ENABLE
case MACRO_TIMBRE_1:
if (record->event.pressed) set_timbre(TIMBRE_12);
break;
case MACRO_TIMBRE_2:
if (record->event.pressed) set_timbre(TIMBRE_25);
break;
case MACRO_TIMBRE_3:
if (record->event.pressed) set_timbre(TIMBRE_50);
break;
case MACRO_TIMBRE_4:
if (record->event.pressed) set_timbre(TIMBRE_75);
break;
case MACRO_TEMPO_U:
if (record->event.pressed) increase_tempo(10);
break;
case MACRO_TEMPO_D:
if (record->event.pressed) decrease_tempo(10);
break;
case MACRO_TONE_DEFAULT:
if (record->event.pressed)
{
set_timbre(TIMBRE_DEFAULT);
set_tempo(TEMPO_DEFAULT);
}
break;
case MACRO_AUDIO_OFF:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
audio_off();
#endif
}
break;
case MACRO_AUDIO_ON:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
audio_on();
PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO);
#endif
}
break;
case MACRO_MUSIC_ON:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
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)
{
#ifdef AUDIO_ENABLE
voice_iterate();
PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
#endif
}
break;
case MACRO_DEC_VOICE:
if (record->event.pressed)
{
#ifdef AUDIO_ENABLE
voice_deiterate();
PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
#endif
}
break;
#endif /* AUDIO_ENABLE */
default:
break;
}
return MACRO_NONE;
};
#ifdef AUDIO_ENABLE
void process_action_user(keyrecord_t *record)
{
uint8_t starting_note = 0x0C;
int offset = 7;
if (IS_LAYER_ON(LAYER_MUSIC))
{
if (record->event.pressed)
{
play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
}
else
{
stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
}
}
}
void matrix_init_user(void)
{
set_voice(default_voice);
play_startup_tone();
println("Matrix Init");
}
void led_set_user(uint8_t usb_led)
{
static uint8_t old_usb_led = 0;
_delay_ms(10); // gets rid of tick
if ((usb_led & (1<<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;
}
void play_startup_tone()
{
_delay_ms(10); // gets rid of tick
PLAY_NOTE_ARRAY(tone_my_startup, false, STACCATO);
}
void play_goodbye_tone()
{
PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO);
_delay_ms(1000);
}
#endif /* AUDIO_ENABLE */

@ -0,0 +1,17 @@
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
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 = yes # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
CONFIG_H = keymaps/$(KEYMAP)/config.h

@ -1,179 +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 "print.h"
#include "action_layer.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 _DV 2
#define _LW 3
#define _RS 4
#define _FN 5
#define XXXXXXX KC_NO
#define _______ KC_TRNS
#define ASFT(kc) LSFT(RSFT(kc))
#define MG_B ASFT(KC_B)
#define MG_H ASFT(KC_H)
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 | , | . | Up |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | GUI | Alt | Del |Raise | Space |Lower | / | Left | Down |Right |
* `-----------------------------------------------------------------------------------'
*/
[_QW] = {
{RESET, 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_UP, KC_ENT },
{KC_LCTL, KC_LGUI, KC_LALT, KC_DEL, M(_LW), KC_SPC, KC_SPC, M(_RS), KC_SLSH, KC_LEFT, KC_DOWN, 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 |Raise | Space |Lower | 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 },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), 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 |Raise | Space |Lower | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
[_DV] = {
{KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
{KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
{KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
/* 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 |Qwerty|Colemk|Dvorak| Reset|Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_RS] = {
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
{_______, KC_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, XXXXXXX, XXXXXXX, XXXXXXX, RESET, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
},
/* Lower
* ,-----------------------------------------------------------------------------------.
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| F7 | F8 | F9 | F10 | F11 | F12 |Qwerty|Colemk|Dvorak| Reset|Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_LW] = {
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
{_______, KC_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, XXXXXXX, XXXXXXX, XXXXXXX, MG_B, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
},
/* Function
* ,-----------------------------------------------------------------------------------.
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| F7 | F8 | F9 | F10 | F11 | F12 |Qwerty|Colemk|Dvorak| Reset|Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_FN] = {
{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, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
}
};
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 _RS:
if (record->event.pressed) {
print("RS_DN");
layer_on(_RS);
update_tri_layer(_RS, _LW, _FN);
} else {
print("RS_UP");
layer_off(_RS);
update_tri_layer(_RS, _LW, _FN);
phex(layer_state);
}
break;
case _LW:
if (record->event.pressed) {
print("LW_DN");
layer_on(_LW);
update_tri_layer(_RS, _LW, _FN);
} else {
print("LW_UP");
layer_off(_LW);
update_tri_layer(_RS, _LW, _FN);
}
break;
default:
break;
}
return MACRO_NONE;
};

@ -9,6 +9,9 @@ void matrix_scan_user(void) {}
__attribute__ ((weak))
void process_action_user(keyrecord_t *record) {}
__attribute__ ((weak))
void led_set_user(uint8_t usb_led) {}
void matrix_init_kb(void) {
#ifdef BACKLIGHT_ENABLE
backlight_init_ports();
@ -32,3 +35,270 @@ void matrix_scan_kb(void) {
void process_action_kb(keyrecord_t *record) {
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()
{
// Setup PB7 as output and output low.
DDRB |= (1<<7);
PORTB &= ~(1<<7);
// Use full 16-bit resolution.
ICR1 = 0xFFFF;
// I could write a wall of text here to explain... but TL;DW
// Go read the ATmega32u4 datasheet.
// And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
// Pin PB7 = OCR1C (Timer 1, Channel C)
// Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
// (i.e. start high, go low when counter matches.)
// WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
// Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
backlight_init();
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;
}
else if ( level == BACKLIGHT_LEVELS )
{
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness
CHANNEL = 0xFFFF;
}
else
{
// 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

@ -10,6 +10,7 @@
#include "rgblight.h"
#endif
#include <stddef.h>
#include <avr/io.h>
#ifdef MIDI_ENABLE
#include <keymap_midi.h>
#endif
@ -44,4 +45,22 @@ void matrix_init_user(void);
void matrix_scan_user(void);
void process_action_user(keyrecord_t *record);
void led_set_user(uint8_t usb_led);
void backlight_init_ports(void);
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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -162,11 +162,6 @@ endif
endif
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
SRC := backlight.c $(SRC)
endif
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax

@ -1,61 +0,0 @@
#include <avr/io.h>
#include "backlight.h"
#define CHANNEL OCR1C
void backlight_init_ports()
{
// Setup PB7 as output and output low.
DDRB |= (1<<7);
PORTB &= ~(1<<7);
// Use full 16-bit resolution.
ICR1 = 0xFFFF;
// I could write a wall of text here to explain... but TL;DW
// Go read the ATmega32u4 datasheet.
// And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
// Pin PB7 = OCR1C (Timer 1, Channel C)
// Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
// (i.e. start high, go low when counter matches.)
// WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
// Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
backlight_init();
}
void backlight_set(uint8_t level)
{
if ( level == 0 )
{
// Turn off PWM control on PB7, revert to output low.
TCCR1A &= ~(_BV(COM1C1));
CHANNEL = 0x0;
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
}
else if ( level == BACKLIGHT_LEVELS )
{
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness
CHANNEL = 0xFFFF;
}
else
{
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness
CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
}
}

@ -319,7 +319,7 @@ void matrix_init_user(void) {
#ifdef AUDIO_ENABLE
uint8_t starting_note = 0x0C;
int offset = 7;
int offset = 0;
void process_action_user(keyrecord_t *record) {

@ -38,4 +38,65 @@ void matrix_scan_kb(void) {
void process_action_kb(keyrecord_t *record) {
process_action_user(record);
}
}
#ifdef BACKLIGHT_ENABLE
#define CHANNEL OCR1C
void backlight_init_ports()
{
// Setup PB7 as output and output low.
DDRB |= (1<<7);
PORTB &= ~(1<<7);
// Use full 16-bit resolution.
ICR1 = 0xFFFF;
// I could write a wall of text here to explain... but TL;DW
// Go read the ATmega32u4 datasheet.
// And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
// Pin PB7 = OCR1C (Timer 1, Channel C)
// Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
// (i.e. start high, go low when counter matches.)
// WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
// Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
backlight_init();
}
void backlight_set(uint8_t level)
{
if ( level == 0 )
{
// Turn off PWM control on PB7, revert to output low.
TCCR1A &= ~(_BV(COM1C1));
CHANNEL = 0x0;
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
}
else if ( level == BACKLIGHT_LEVELS )
{
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness
CHANNEL = 0xFFFF;
}
else
{
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness
CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
}
}
#endif

@ -10,6 +10,7 @@
#include "rgblight.h"
#endif
#include <stddef.h>
#include <avr/io.h>
#ifdef MIDI_ENABLE
#include <keymap_midi.h>
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -2,6 +2,11 @@
# Script to make a new quantum project
# Jack Humbert 2015
if [ -z "$1" ]; then
echo "Usage: $0 <keyboard_name>"
exit 1
fi
KEYBOARD=$1
KEYBOARD_UPPERCASE=$(echo $1 | awk '{print toupper($0)}')

@ -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>
@ -10,30 +10,28 @@
#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 */
/* 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;
// Set port PC6 (OC3A and /OC4A) as output
DDRC |= _BV(PORTC6);
/* Enable the OC4A output */
DDRC |= _BV(PORTC6);
DISABLE_AUDIO_COUNTER_3_ISR;
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
// 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);
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,295 +180,299 @@ 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) {
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);
}
void audio_off(void) {
audio_config.enable = 0;
eeconfig_update_audio(audio_config.raw);
}
#ifdef VIBRATO_ENABLE
#ifdef PWM_AUDIO
TIMSK3 |= _BV(OCIE3A);
#else
TIMSK3 |= _BV(OCIE3A);
TCCR3A |= _BV(COM3A1);
#endif
// 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
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 */
TIMSK3 |= _BV(OCIE3A);
// 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
@ -597,11 +482,8 @@ void play_startup_tone()
{
}
__attribute__ ((weak))
void play_goodbye_tone()
{
}
//------------------------------------------------------------------------------

@ -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,11 @@ 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);
#endif

@ -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()
{
}
//------------------------------------------------------------------------------

@ -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,
};

@ -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 */

@ -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
};

@ -1,4 +1,5 @@
#include "voices.h"
#include "audio.h"
#include "stdlib.h"
// these are imported from audio.c
@ -53,28 +54,28 @@ float voice_envelope(float frequency) {
}
break;
case octave_crunch:
polyphony_rate = 0;
switch (compensated_index) {
case 0 ... 9:
case 20 ... 24:
case 30 ... 32:
frequency = frequency / 2;
note_timbre = TIMBRE_12;
break;
case 10 ... 19:
case 25 ... 29:
case 33 ... 35:
frequency = frequency * 2;
note_timbre = TIMBRE_12;
break;
default:
note_timbre = TIMBRE_12;
break;
}
break;
// case octave_crunch:
// polyphony_rate = 0;
// switch (compensated_index) {
// case 0 ... 9:
// case 20 ... 24:
// case 30 ... 32:
// frequency = frequency / 2;
// note_timbre = TIMBRE_12;
// break;
// case 10 ... 19:
// case 25 ... 29:
// case 33 ... 35:
// frequency = frequency * 2;
// note_timbre = TIMBRE_12;
// break;
// default:
// note_timbre = TIMBRE_12;
// break;
// }
// break;
case duty_osc:
// This slows the loop down a substantial amount, so higher notes may freeze
@ -99,6 +100,36 @@ float voice_envelope(float frequency) {
if ((envelope_index % 8) == 0)
note_timbre = 0;
break;
case delayed_vibrato:
polyphony_rate = 0;
note_timbre = TIMBRE_50;
#define VOICE_VIBRATO_DELAY 150
#define VOICE_VIBRATO_SPEED 50
switch (compensated_index) {
case 0 ... VOICE_VIBRATO_DELAY:
break;
default:
frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
break;
}
break;
// case delayed_vibrato_octave:
// polyphony_rate = 0;
// if ((envelope_index % 2) == 1) {
// note_timbre = 0.55;
// } else {
// note_timbre = 0.45;
// }
// #define VOICE_VIBRATO_DELAY 150
// #define VOICE_VIBRATO_SPEED 50
// switch (compensated_index) {
// case 0 ... VOICE_VIBRATO_DELAY:
// break;
// default:
// frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
// break;
// }
// break;
// case duty_fifth_down:
// note_timbre = 0.5;
// if ((envelope_index % 3) == 0)
@ -129,4 +160,6 @@ float voice_envelope(float frequency) {
}
return frequency;
}
}

@ -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
@ -16,6 +15,8 @@ typedef enum {
octave_crunch,
duty_osc,
duty_octave_down,
delayed_vibrato,
// delayed_vibrato_octave,
// duty_fifth_down,
// duty_fourth_down,
// duty_third_down,

@ -24,10 +24,14 @@ 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>
@ -268,6 +272,14 @@ 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

@ -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
@ -205,6 +232,12 @@ 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)
// M-od, T-ap - 256 keycode max
#define MT(mod, kc) (kc | 0x7000 | ((mod & 0xF) << 8))
#define CTL_T(kc) MT(0x1, kc)

@ -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 )

@ -42,6 +42,13 @@ 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);
@ -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;

@ -28,7 +28,9 @@ ifeq ($(strip $(MIDI_ENABLE)), yes)
endif
ifeq ($(strip $(AUDIO_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/audio/audio.c $(QUANTUM_DIR)/audio/voices.c
SRC += $(QUANTUM_DIR)/audio/audio.c
SRC += $(QUANTUM_DIR)/audio/voices.c
SRC += $(QUANTUM_DIR)/audio/luts.c
endif
ifeq ($(strip $(UNICODE_ENABLE)), yes)

@ -190,7 +190,7 @@ void rgblight_mode(uint8_t mode) {
rgblight_config.mode = mode;
}
eeconfig_update_rgblight(rgblight_config.raw);
dprintf("rgblight mode: %u\n", rgblight_config.mode);
xprintf("rgblight mode: %u\n", rgblight_config.mode);
if (rgblight_config.mode == 1) {
rgblight_timer_disable();
} else if (rgblight_config.mode >=2 && rgblight_config.mode <=23) {
@ -207,7 +207,7 @@ void rgblight_mode(uint8_t mode) {
void rgblight_toggle(void) {
rgblight_config.enable ^= 1;
eeconfig_update_rgblight(rgblight_config.raw);
dprintf("rgblight toggle: rgblight_config.enable = %u\n", rgblight_config.enable);
xprintf("rgblight toggle: rgblight_config.enable = %u\n", rgblight_config.enable);
if (rgblight_config.enable) {
rgblight_mode(rgblight_config.mode);
} else {
@ -300,7 +300,7 @@ void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val){
rgblight_config.sat = sat;
rgblight_config.val = val;
eeconfig_update_rgblight(rgblight_config.raw);
dprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
xprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
}
}

@ -111,23 +111,41 @@ OPT_DEFS += -DBOOTLOADER_SIZE=512
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
KEYBOARD_LOCK_ENABLE = yes # Allow locking of keyboard via magic key
# change yes to no to disable
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
KEYBOARD_LOCK_ENABLE = yes # Allow locking of keyboard via magic key
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
#NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
# MIDI_ENABLE = YES # MIDI controls
# UNICODE_ENABLE = YES # Unicode
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no # USB Nkey Rollover
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no # Audio output on port C6
ifdef KEYMAP
ifeq ("$(wildcard keymaps/$(KEYMAP).c)","")
ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
include keymaps/$(KEYMAP)/makefile.mk
endif
endif
else
ifneq ("$(wildcard keymaps/default/makefile.mk)","")
include keymaps/default/makefile.mk
endif
endif
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax

@ -46,3 +46,64 @@ void led_set_kb(uint8_t usb_led) {
led_set_user(usb_led);
}
#ifdef BACKLIGHT_ENABLE
#define CHANNEL OCR1C
void backlight_init_ports()
{
// Setup PB7 as output and output low.
DDRB |= (1<<7);
PORTB &= ~(1<<7);
// Use full 16-bit resolution.
ICR1 = 0xFFFF;
// I could write a wall of text here to explain... but TL;DW
// Go read the ATmega32u4 datasheet.
// And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
// Pin PB7 = OCR1C (Timer 1, Channel C)
// Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
// (i.e. start high, go low when counter matches.)
// WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
// Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
backlight_init();
}
void backlight_set(uint8_t level)
{
if ( level == 0 )
{
// Turn off PWM control on PB7, revert to output low.
TCCR1A &= ~(_BV(COM1C1));
CHANNEL = 0x0;
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
}
else if ( level == BACKLIGHT_LEVELS )
{
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness
CHANNEL = 0xFFFF;
}
else
{
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness
CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
}
}
#endif

@ -3,7 +3,10 @@
#include "matrix.h"
#include "keymap_common.h"
#include "backlight.h"
#ifdef BACKLIGHT_ENABLE
#include "backlight.h"
#endif
#include <avr/io.h>
#include <stddef.h>
// This a shortcut to help you visually see your layout.

@ -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.
You'll need to reflash afterwards, because DFU requires the flash to be erased before messing with the eeprom.

@ -27,11 +27,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "action_util.h"
#include "action.h"
//#ifdef DEBUG_ACTION
#ifdef DEBUG_ACTION
#include "debug.h"
//#else
//#include "nodebug.h"
//#endif
#else
#include "nodebug.h"
#endif
void action_exec(keyevent_t event)
@ -74,6 +74,7 @@ void process_action_kb(keyrecord_t *record) {}
void process_action(keyrecord_t *record)
{
bool do_release_oneshot = false;
keyevent_t event = record->event;
#ifndef NO_ACTION_TAPPING
uint8_t tap_count = record->tap.count;
@ -81,6 +82,13 @@ void process_action(keyrecord_t *record)
if (IS_NOEVENT(event)) { return; }
#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
process_action_kb(record);
action_t action = store_or_get_action(event.pressed, event.key);
@ -95,6 +103,15 @@ void process_action(keyrecord_t *record)
// 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 +156,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 +339,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 +440,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_action(record);
layer_off(get_oneshot_layer());
}
#endif
}
@ -560,6 +640,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;

@ -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))

@ -4,11 +4,11 @@
#include "util.h"
#include "action_layer.h"
//#ifdef DEBUG_ACTION
#ifdef DEBUG_ACTION
#include "debug.h"
//#else
//#include "nodebug.h"
//#endif
#else
#include "nodebug.h"
#endif
/*

@ -19,11 +19,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "action_macro.h"
#include "wait.h"
//#ifdef DEBUG_ACTION
#ifdef DEBUG_ACTION
#include "debug.h"
//#else
//#include "nodebug.h"
//#endif
#else
#include "nodebug.h"
#endif
#ifndef NO_ACTION_MACRO

@ -6,11 +6,11 @@
#include "keycode.h"
#include "timer.h"
//#ifdef DEBUG_ACTION
#ifdef DEBUG_ACTION
#include "debug.h"
//#else
//#include "nodebug.h"
//#endif
#else
#include "nodebug.h"
#endif
#ifndef NO_ACTION_TAPPING

@ -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
*/

@ -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);

@ -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;
}

@ -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

@ -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;

@ -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

@ -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.

@ -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 ----------------

Loading…
Cancel
Save