]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Merge pull request #304 from adiabatic/ergodox-zweihander-osx
authorErez Zukerman <bulk@ezuk.org>
Wed, 4 May 2016 02:27:39 +0000 (22:27 -0400)
committerErez Zukerman <bulk@ezuk.org>
Wed, 4 May 2016 02:27:39 +0000 (22:27 -0400)
zweihander: comment out action_get_macro()

28 files changed:
keyboard/atomic/keymaps/pvc/config.h
keyboard/atomic/keymaps/pvc/keymap.c
keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/keymap.c [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/readme.md [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.hex [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.png [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/keymap.c [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/readme.md [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.hex [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.png [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/sneako/README.md [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/sneako/keymap.c [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/sneako/sneako.hex [new file with mode: 0644]
keyboard/ergodox_ez/keymaps/twey/keymap.c
keyboard/planck/keymaps/pvc/config.h
keyboard/planck/keymaps/pvc/keymap.c
keyboard/planck/keymaps/pvc/makefile.mk
quantum/audio/audio.c
quantum/audio/audio.h
quantum/audio/audio_pwm.c [new file with mode: 0644]
quantum/audio/frequency_lut.h [deleted file]
quantum/audio/luts.c [new file with mode: 0644]
quantum/audio/luts.h [new file with mode: 0644]
quantum/audio/vibrato_lut.h [deleted file]
quantum/audio/voices.c
quantum/audio/voices.h
quantum/keymap_common.c
quantum/quantum.mk

index cc926346463c217d624e0a8b205b74aa92fdf110..034bc5dc5cc27112680bc1294cdfa37584d0184b 100644 (file)
@@ -158,4 +158,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //#define NO_ACTION_MACRO
 //#define NO_ACTION_FUNCTION
 
+
+//#define VIBRATO_ENABLE
+//#define VIBRATO_STRENGTH_ENABLE
+
+
 #endif
index e17c41e23db446f0443c4ddf711a261c3d0968e6..3d604a868ebbd9d2be4875eabfe807e379345449 100644 (file)
@@ -11,8 +11,8 @@
 #define LAYER_QWERTY         0
 #define LAYER_COLEMAK        1
 #define LAYER_DVORAK         2
-#define LAYER_LOWER          3
-#define LAYER_RAISE          4
+#define LAYER_RAISE          3
+#define LAYER_LOWER          4
 #define LAYER_FUNCTION       5
 #define LAYER_MOUSE          6
 #define LAYER_MUSIC          7
@@ -21,8 +21,8 @@
 #define MACRO_QWERTY         0
 #define MACRO_COLEMAK        1
 #define MACRO_DVORAK         2
-#define MACRO_LOWER          3
-#define MACRO_RAISE          4
+#define MACRO_RAISE          3
+#define MACRO_LOWER          4
 #define MACRO_FUNCTION       5
 #define MACRO_MOUSE          6
 #define MACRO_TIMBRE_1       7
@@ -42,8 +42,8 @@
 #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_LOWER             M(MACRO_LOWER)
 #define M_FUNCT             M(MACRO_FUNCTION)
 #define M_MOUSE             M(MACRO_MOUSE)
 #define TIMBR_1             M(MACRO_TIMBRE_1)
@@ -148,23 +148,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC,  KC_SPC,  M_LOWER, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
  },
 
+ [LAYER_RAISE]        = { /* RAISED */
+  { KC_TILD, KC_PSCR, KC_PAUS, KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  ________________  },
+  { _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS   },
+  { _______, KC_F5,   KC_F6,   KC_F7,   KC_F8,   _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME  },
+  { _______, KC_F9,   KC_F10,  KC_F11,  KC_F12,  _______, _______, _______, _______, _______, _______, ________________, _______, KC_END   },
+  { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______  },
+ },
 
  [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_F13,  KC_F14,  KC_F15,  KC_F16,  _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS   },
+  { _______, KC_F17,  KC_F18,  KC_F19,  KC_F20,  _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME  },
+  { _______, KC_F21,  KC_F22,  KC_F23,  KC_F24,  _______, _______, _______, _______, _______, _______, ________________, _______, KC_END   },
   { _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______, _______, _______, _______, _______  },
  },
 
- [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   },
-  { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______  },
- },
-
  [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  },
@@ -281,28 +280,28 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
             }
             break;
 
-        case MACRO_LOWER:
+        case MACRO_RAISE:
             if (record->event.pressed)
             {
-                layer_on(LAYER_LOWER);
+                layer_on(LAYER_RAISE);
                 update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
             }
             else
             {
-                layer_off(LAYER_LOWER);
+                layer_off(LAYER_RAISE);
                 update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
             }
             break;
 
-        case MACRO_RAISE:
+        case MACRO_LOWER:
             if (record->event.pressed)
             {
-                layer_on(LAYER_RAISE);
+                layer_on(LAYER_LOWER);
                 update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
             }
             else
             {
-                layer_off(LAYER_RAISE);
+                layer_off(LAYER_LOWER);
                 update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
             }
             break;
@@ -468,36 +467,40 @@ void led_set_user(uint8_t usb_led)
 
     _delay_ms(10); // gets rid of tick
 
-    if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK)))
-    {
-            // If CAPS LK LED is turning on...
-            PLAY_NOTE_ARRAY(tone_caps_on,  false, LEGATO);
-    }
-    else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK)))
-    {
-            // If CAPS LK LED is turning off...
-            PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO);
-    }
-    else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK)))
-    {
-            // If NUM LK LED is turning on...
-            PLAY_NOTE_ARRAY(tone_numlk_on,  false, LEGATO);
-    }
-    else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK)))
-    {
-            // If NUM LED is turning off...
-            PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO);
-    }
-    else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
-    {
-            // If SCROLL LK LED is turning on...
-            PLAY_NOTE_ARRAY(tone_scroll_on,  false, LEGATO);
-    }
-    else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
-    {
-            // If SCROLL LED is turning off...
-            PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO);
-    }
+       if (!is_playing_notes())
+       {
+           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;
 }
 
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/keymap.c b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/keymap.c
new file mode 100644 (file)
index 0000000..e23c5a1
--- /dev/null
@@ -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) {
+};
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/readme.md b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/readme.md
new file mode 100644 (file)
index 0000000..80475ab
--- /dev/null
@@ -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`.
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.hex b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.hex
new file mode 100644 (file)
index 0000000..1be94c4
--- /dev/null
@@ -0,0 +1,1092 @@
+:100000000C94BB010C94FF010C94FF010C94FF01B4\r
+:100010000C94FF010C94FF010C94FF010C94FF0160\r
+:100020000C94FF010C94FF010C94E20A0C94B40BA5\r
+:100030000C94FF010C94FF010C94FF010C94FF0140\r
+:100040000C94FF010C9432200C94FF010C94FF01DE\r
+:100050000C94FF010C94BD190C94FF010C94FF014A\r
+:100060000C94FF010C94FF010C94FF010C94FF0110\r
+:100070000C94FF010C94FF010C94FF010C94FF0100\r
+:100080000C94FF010C94FF010C94FF010C94FF01F0\r
+:100090000C94FF010C94FF010C94FF010C94FF01E0\r
+:1000A0000C94FF010C94FF010C94FF01210C430CF4\r
+:1000B000310D430C310D880CAB0C310D000D130DBF\r
+:1000C000FF0FFF0F3C103C107F10BD10D612D61250\r
+:1000D000D610D612D711D711AA12D612D612C11223\r
+:1000E00035002B002971E1003A0000001E001400C9\r
+:1000F00004001D003B00E2001F001A0016001B0058\r
+:100100003C00297120000700080006003D002A007D\r
+:100110002100090017001900E300A90022000E00C9\r
+:100120000A0005000000AA003E00310000002F0078\r
+:100130000000A8003F000000000030000000AE00FA\r
+:1001400023000D001C0013000000AB002400180069\r
+:1001500011001000E700AC00250015000C0036006F\r
+:1001600050002C0026000F00120037005100340010\r
+:10017000270033000B0038005200E6002E002D004F\r
+:100180002800E5004F0000001603450072006700DC\r
+:100190006F0044006F007800200045005A00000006\r
+:1001A00016034500720067006F0044006F0078007E\r
+:1001B000200045005A0000000403090409026D00F4\r
+:1001C000040100A0FA090400000103010100092153\r
+:1001D00011010001223F000705810308000A0904FC\r
+:1001E00001000103010200092111010001224D005B\r
+:1001F0000705820308000A09040200010300000049\r
+:100200000921110100012236000705830308000AB5\r
+:10021000090403000103000000092111010001226B\r
+:1002200039000705840310000112011001000000CD\r
+:1002300008EDFE071301000102000105010906A1F6\r
+:1002400001050719E029E7150025019508750181C9\r
+:100250000205081901290595057501910295017599\r
+:100260000391010507190029771500250195787577\r
+:10027000018102C005010980A10185021601002645\r
+:10028000B7001A01002AB700751095018100C0055A\r
+:100290000C0901A1018503160100269C021A010028\r
+:1002A0002A9C02751095018100C005010902A10177\r
+:1002B0000901A10005091901290515002501950568\r
+:1002C000750181029501750381010501093009312C\r
+:1002D0001581257F95027508810609381581257FCE\r
+:1002E000950175088106050C0A38021581257F9550\r
+:1002F0000175088106C0C005010906A1010507199D\r
+:10030000E029E71500250195087501810295017521\r
+:1003100008810105081901290595057501910295C6\r
+:1003200001750391010507190029FF150025FF95A7\r
+:100330000675088100C000000000000000000000F9\r
+:1003400000010204060A0F17202C3A4A5D71879DAE\r
+:10035000B3C7DAE9F5FCFFFCF5E9DAC7B39D8771AD\r
+:100360005D4A3A2C20170F0A060402010000000023\r
+:1003700000000000000011241FBECFEFDAE0DEBF56\r
+:10038000CDBF04B603FE24C08091EF019091F0012F\r
+:10039000A091F101B091F2018730904BA740B04B92\r
+:1003A000B9F41092EF011092F0011092F101109245\r
+:1003B000F20114BE84B7877F84BF88E10FB6F8943A\r
+:1003C00080936000109260000FBEE0E0FFE30995AB\r
+:1003D00011E0A0E0B1E0E8EEF3E402C005900D9278\r
+:1003E000A433B107D9F711E0A4E3B1E001C01D9235\r
+:1003F000AF3EB107E1F70E9426080C94F2210C945D\r
+:100400000000089556985E9825982D9826982E9865\r
+:1004100027982F98089508950C940B0256985E988B\r
+:1004200025982D9826982E9827982F988FEF90E052\r
+:10043000909389008093880090938B0080938A002A\r
+:1004400090938D0080938C00259A2D9A2FEF80E752\r
+:1004500092E0215080409040E1F700C00000269AD1\r
+:100460002E9A2FEF80E792E0215080409040E1F7F4\r
+:1004700000C00000279A2F9A2FEF80E792E02150CA\r
+:1004800080409040E1F700C0000025982D982FEFA4\r
+:1004900080E792E0215080409040E1F700C00000EA\r
+:1004A00026982E982FEF80E792E0215080409040D0\r
+:1004B000E1F700C0000027982F9856985E9825987D\r
+:1004C0002D9826982E9827982F98089589EA80933A\r
+:1004D000800089E08093810024982C983F988AB10D\r
+:1004E0008F748AB96E98479A8BB1806B8BB9769A64\r
+:1004F0000E940E020C94020280E28093000180911F\r
+:10050000340181110EC00E94CB0281E0809334013E\r
+:100510002FEF83ED90E3215080409040E1F700C041\r
+:10052000000080E40E94D1028093000181112EC05E\r
+:100530000E94FB0280930001811128C00E94FB02EF\r
+:1005400080930001811122C08FE30E94FB028093FF\r
+:10055000000181111BC00E94F30280E40E94D102BD\r
+:1005600080930001811112C08CE00E94FB028093F5\r
+:10057000000181110BC00E94FB02809300018111D8\r
+:1005800005C08FE30E94FB02809300010E94F302EA\r
+:100590008091000108951092B9008AE08093B8001C\r
+:1005A000089594EA9093BC009091BC0097FFFCCF13\r
+:1005B0009091B900987F983021F0903111F081E04E\r
+:1005C00008958093BB0084E88093BC008091BC00B8\r
+:1005D00087FFFCCF8091B900887F883111F080348B\r
+:1005E00071F780E0089584E98093BC008091BC009D\r
+:1005F00084FDFCCF08958093BB0084E88093BC0009\r
+:100600008091BC0087FFFCCF9091B900987F81E07A\r
+:10061000983209F480E0089584E88093BC008091CA\r
+:10062000BC0087FFFCCF8091BB0008958091000142\r
+:10063000811115C080E40E94D102809300018111D4\r
+:100640000CC082E10E94FB0280930001811105C071\r
+:100650008FEF0E94FB02809300010E94F30284B19D\r
+:10066000807F84B985B1807F85B98AB1837F8AB95B\r
+:100670008BB1837F8BB93E98469808950E947C0287\r
+:10068000809300010E94160380B38C7080BB81B3FD\r
+:10069000836F81BBA6E3B1E0E4E4F1E08EE08E0F6E\r
+:1006A00011921D928E13FCCF0C946602BF92CF92D2\r
+:1006B000DF92EF92FF920F931F93CF93DF9380917E\r
+:1006C0000001882379F0809135018F5F8093350197\r
+:1006D000811108C00E947C0280930001811102C038\r
+:1006E0000E940E0206E311E0C0E0D0E0DD24D394C6\r
+:1006F00082E0C82EEE24E394F12CC730D10500F53A\r
+:1007000080910001811164C080E40E94D102809335\r
+:100710000001811112C082E10E94FB02809300015E\r
+:1007200081110BC0C7010C2E01C0880F0A94EAF793\r
+:1007300080950E94FB02809300010E94F30248C052\r
+:10074000CA30A1F028F4C83059F0C93061F005C0B2\r
+:10075000CC3089F070F0CD3089F0209A289810C004\r
+:10076000219A29980DC0229A2A980AC0239A2B9878\r
+:1007700007C0529A01C0539A5B9802C03E9A4698AD\r
+:1007800090EA9A95F1F79FB1799902C082E001C091\r
+:1007900080E091709D25982B7C9902C084E001C077\r
+:1007A00080E0892B7D9902C038E001C030E0832BC6\r
+:1007B0007E9902C020E101C020E0822B9FB190957C\r
+:1007C000991F9927991F9295990F907E892B0FC099\r
+:1007D00080910001811149C080E40E94D102809380\r
+:1007E0000001882379F1B12C0E94F3028B2DF801CE\r
+:1007F0009081981719F08083C09201010E9416031E\r
+:1008000021960F5F1F4FCE30D10509F076CF809132\r
+:100810000101882361F1815080930101882339F01F\r
+:100820008FE99FE00197F1F700C0000020C0A4E429\r
+:10083000B1E0E6E3F1E0CF01825F91919D938E13E9\r
+:10084000FCCF15C083E10E94FB028093000181115F\r
+:10085000CACF81E40E94D102809300018111C3CFED\r
+:100860000E940C03B82EB094BFCF80E0C0CF0E948E\r
+:100870000C0281E0DF91CF911F910F91FF90EF90DB\r
+:10088000DF90CF90BF900895E82FF0E0EC5BFE4F33\r
+:100890008081089508958B3B910578F4883A9105FD\r
+:1008A00040F5853A9105D0F48430910508F0B1C047\r
+:1008B0008130910509F4ADC06BC0803E910508F40C\r
+:1008C00067C0883E910508F4A4C09C01205F3109EF\r
+:1008D0002031310508F05CC090650895853A910596\r
+:1008E00009F459C0863A910509F058C082E890E4AD\r
+:1008F0000895883A910509F454C0893A910509F49C\r
+:1009000053C08A3A910509F452C08B3A910509F413\r
+:1009100051C08C3A910509F450C08D3A910509F403\r
+:100920004FC0803B910509F44EC08E3A910509F401\r
+:100930004DC08F3A910509F44CC0813B910509F4F3\r
+:100940004BC0823B910509F44AC0833B910509F4F1\r
+:1009500049C0843B910509F448C0853B910509F4E1\r
+:1009600047C0863B910509F446C0873B910509F4D1\r
+:1009700045C0883B910509F444C0893B910509F4C1\r
+:1009800043C08A3B910509F442C080E094E4089595\r
+:1009900080E090E0089581E890E4089583E890E491\r
+:1009A000089582EE94E4089589EE94E408958AEE21\r
+:1009B00094E4089585EB94E4089586EB94E4089517\r
+:1009C00087EB94E408958CEC94E408958DEC94E422\r
+:1009D000089583E895E408958AE895E4089582E906\r
+:1009E00095E4089584E995E4089581E296E40895F4\r
+:1009F00083E296E4089584E296E4089585E296E41D\r
+:100A0000089586E296E4089587E296E408958AE2DE\r
+:100A100096E40895089596E0799FF001112494E5F5\r
+:100A2000899FE00DF11D1124E60FF11DEE0FFF1F50\r
+:100A3000E052FF4F859194910895880F991FFC0112\r
+:100A4000E05AF040859194910895880F991FFC0118\r
+:100A5000E052FF4F85919491089526E0729FF00136\r
+:100A6000112444E5849FE00DF11D1124E60FF11DD2\r
+:100A7000EE0FFF1FE052FF4F859194919C013A9534\r
+:100A800021154FE1340708F41CC13F5121153041B5\r
+:100A900020F49F700E94250508959C013053211574\r
+:100AA000304118F49927906C0895811520E592073C\r
+:100AB00071F40E94FA124FEF84E39CE041508040B1\r
+:100AC0009040E1F700C000000E94E219FAC08130B6\r
+:100AD00020E5920731F48091CD0181608093CD01B2\r
+:100AE000F0C09C0130552115304108F051C0292F2C\r
+:100AF00033272F70332721303105D9F4AC014370EF\r
+:100B0000552702C0220F331F4A95E2F73C68AC011B\r
+:100B100064E0440F551F6A95E1F744275370242B76\r
+:100B2000352B73E0880F991F7A95E1F78076992726\r
+:100B30001DC02230310529F4982F8827816F906AD3\r
+:100B4000089523303105A9F4AC014370552721E005\r
+:100B500030E002C0220F331F4A95E2F73C6843E0C1\r
+:100B6000880F991F4A95E1F7807E9770822B932B0F\r
+:100B7000089524303105E1F4AC014370552721E09C\r
+:100B800030E002C0220F331F4A95E2F73A68E7CF00\r
+:100B90009C0130572115304118F49F7090620895E0\r
+:100BA0009C0130582115304118F49F70906A0895C7\r
+:100BB000803E9105E0F4803C910558F58133910524\r
+:100BC00009F46FC048F48932910509F463C08A3290\r
+:100BD000910509F46DC072C089339105E9F082383E\r
+:100BE0009105D1F08533910509F44DC067C0833E6E\r
+:100BF000910581F138F4803E9105B9F0823E91056E\r
+:100C0000D9F05CC0863E910561F1873E9105A1F166\r
+:100C100055C00E941D0508952091E00120FD02C0ED\r
+:100C200021FF4CC080EE90E049C08091E00180FF40\r
+:100C3000F9CF89E390E042C08091E00182FF0EC0CD\r
+:100C40008091E00184FF03C080E090E037C083EE34\r
+:100C500090E034C08091E00182FFF2CF82EE90E01C\r
+:100C60002DC08091E00183FF0BC08091E00184FDE5\r
+:100C7000EBCF87EE90E022C08091E00183FFF5CFBB\r
+:100C800086EE90E01BC08091E00185FF07C089E2FD\r
+:100C900090E014C08091E00185FFF9CF85E390E0FA\r
+:100CA0000DC08091E00186FF07C08AE290E006C097\r
+:100CB0008091E00186FFF9CF81E390E00E944B0430\r
+:100CC0000895089508950C94620680916201089534\r
+:100CD000CF93DF9300D01F92CDB7DEB79C018091F8\r
+:100CE000E601843019F593E099833B832A8390933E\r
+:100CF000E9008FEF9091E800815095FD06C095EDD9\r
+:100D00009A95F1F700008111F5CF8091E80085FFF9\r
+:100D10000DC040E050E063E070E0CE0101960E941B\r
+:100D2000D2088091E8008E778093E8000F900F90B2\r
+:100D30000F90DF91CF910895CF93DF9300D01F9252\r
+:100D4000CDB7DEB72091E601243021F522E02983DA\r
+:100D50009B838A8383E08093E9008FEF9091E80082\r
+:100D6000815095FD06C095ED9A95F1F7000081112F\r
+:100D7000F5CF8091E80085FF0DC040E050E063E0D2\r
+:100D800070E0CE0101960E94D2088091E8008E7733\r
+:100D90008093E8000F900F900F90DF91CF9108950E\r
+:100DA0002091E6012430F1F422E02093E9002FEFB6\r
+:100DB0003091E800215035FD06C035ED3A95F1F748\r
+:100DC00000002111F5CF2091E80025FF0BC040E085\r
+:100DD00050E065E070E00E94D2088091E8008E77D4\r
+:100DE0008093E8000895CF93DF93EC019091E601A2\r
+:100DF000943009F046C080910C018823D9F080918D\r
+:100E00000D018823B9F09093E9008FEF9091E800ED\r
+:100E1000815095FD06C095E19A95F1F7000081118A\r
+:100E2000F5CF8091E80085FF2CC040E050E060E104\r
+:100E300070E017C081E08093E9008FEF9091E800A7\r
+:100E4000815095FD06C095ED9A95F1F7000081114E\r
+:100E5000F5CF8091E80085FF14C040E050E068E0E5\r
+:100E600070E0CE010E94D2088091E8008E778093D6\r
+:100E7000E80080E1FE01A2E5B1E001900D928A95C3\r
+:100E8000E1F7DF91CF9108958091E501811109C0CB\r
+:100E90000E94670A0E94C40A8091E20084608093E5\r
+:100EA000E20008951092E501089508950C941F2022\r
+:100EB0000E9478190E9425200E946A0D0C946306F6\r
+:100EC00042E061EC81E00E94E10942E061EC82E0F5\r
+:100ED0000E94E10942E061EC83E00E94E10942E105\r
+:100EE00061EC84E00C94E1098091E801833009F41D\r
+:100EF00055C030F4813071F0823009F48EC008950D\r
+:100F00008A3009F47AC08B3009F460C0893009F066\r
+:100F10009CC020C08091E701813A09F096C0809181\r
+:100F2000E800877F8093E8008091EB019091EC01CD\r
+:100F3000892B21F460E182E591E003C060E080E06C\r
+:100F400090E070E00E941D098091E8008B7780930B\r
+:100F5000E80008958091E701813209F076C0809120\r
+:100F6000EB019091EC01009719F0039709F06DC027\r
+:100F70008091E800877F8093E8008091E80082FDFF\r
+:100F800005C08091E6018111F8CF5FC08091F1002A\r
+:100F9000809362018091E8008B7753C08091E701D4\r
+:100FA000813A09F052C08091EB019091EC01892BBC\r
+:100FB00009F04BC08091E800877F8093E800809122\r
+:100FC000E80080FFFCCF80910C0136C08091E701E2\r
+:100FD0008132D9F58091EB019091EC01892BA9F533\r
+:100FE0008091E800877F8093E8000E94160A809134\r
+:100FF000E90180930C010C94FA128091E70181328F\r
+:1010000021F58091E800877F8093E8000E94160A0E\r
+:101010008091EA018093630108958091E701813A0C\r
+:10102000A1F48091E800877F8093E8008091E80038\r
+:1010300080FFFCCF809163018093F1008091E800F4\r
+:101040008E778093E8000C94160A089584B7877F02\r
+:1010500084BF88E10FB6F89480936000109260001E\r
+:101060000FBE90E080E80FB6F894809361009093F3\r
+:1010700061000FBE0E94B90D0E94670A0E94C40A57\r
+:101080008091E20084608093E20078940E944A0D8F\r
+:101090000E94BB0D82E091E00E94650D0E940D2030\r
+:1010A0008091E601853069F40E9439198091E4014C\r
+:1010B0008823B1F30E946419882391F30E94BC082D\r
+:1010C000EFCF0E94C10DECCF292F332723303105FC\r
+:1010D000C9F064F42130310581F02230310509F086\r
+:1010E00043C08DE690E02CEB31E042C02132310567\r
+:1010F000F1F02232310541F137C082E190E029E27E\r
+:1011000032E036C099278130910541F08230910557\r
+:1011100041F0892B49F5E8EBF1E005C0E0EAF1E0A8\r
+:1011200002C0E8E8F1E0849190E09F0121C06430C2\r
+:10113000D8F4E62FF0E0EE0FFF1FEE5DFE4F2081AA\r
+:10114000318189E090E014C0643070F470E0FB01FC\r
+:10115000EE0FFF1FE65EFE4F20813181FB01EA5E4C\r
+:10116000FE4F808190E004C080E090E020E030E01D\r
+:10117000FA0131832083089580E189BD82E189BD30\r
+:1011800009B400FEFDCF8091D8008F7D8093D800F8\r
+:101190008091E00082608093E0008091E00081FD1A\r
+:1011A000FCCF0895CF92DF92EF92FF920F931F939F\r
+:1011B000CF93DF93EC018B016A010E94350A811104\r
+:1011C00033C0C114D10439F0F60180819181081B2C\r
+:1011D000190BC80FD91FE12CF12C0115110519F1BC\r
+:1011E0008091E80085FD16C08091E8008E7780939D\r
+:1011F000E800C114D10449F0F60180819181E80E24\r
+:10120000F91EF182E08285E00FC00E94350A882332\r
+:1012100021F30AC089918093F10001501109FFEF79\r
+:10122000EF1AFF0ADACF80E0DF91CF911F910F9183\r
+:10123000FF90EF90DF90CF9008952091ED013091D5\r
+:10124000EE012617370748F06115710539F4209132\r
+:10125000E8002E772093E80001C0B90140E0611555\r
+:101260007105A9F12091E601222309F443C025303C\r
+:1012700009F442C02091E80023FD40C02091E8001D\r
+:1012800022FD32C02091E80020FFE9CF4091F30019\r
+:101290002091F20030E0342BFC01CF016115710583\r
+:1012A00059F02830310540F481918093F10061506C\r
+:1012B00071092F5F3F4FF1CF41E02830310509F030\r
+:1012C00040E02091E8002E772093E800C8CF41113C\r
+:1012D000C9CF0AC08091E601882361F0853061F0B2\r
+:1012E0008091E80083FD0AC08091E80082FFF2CF80\r
+:1012F00080E0089582E0089583E0089581E00895F4\r
+:101300002091ED013091EE012617370748F0611565\r
+:10131000710539F42091E8002E772093E80001C090\r
+:10132000B901FC0120E06115710591F18091E601A0\r
+:10133000882309F440C0853009F43FC08091E8005B\r
+:1013400083FD3DC08091E80082FD2FC08091E800C0\r
+:1013500080FFE9CF2091F3008091F20090E0922B82\r
+:101360006115710559F08830910540F4249120935E\r
+:10137000F1003196615071090196F2CF21E0089792\r
+:1013800009F020E08091E8008E778093E800CBCFD1\r
+:101390002111CCCF0AC08091E601882361F085300D\r
+:1013A00061F08091E80083FD0AC08091E80082FF2F\r
+:1013B000F2CF80E0089582E0089583E0089581E00F\r
+:1013C0000895982F973058F59093E900981739F0C1\r
+:1013D0007091EC002091ED005091F00003C0242F9B\r
+:1013E000762F50E021FF19C03091EB003E7F309303\r
+:1013F000EB003091ED003D7F3093ED003091EB003C\r
+:1014000031603093EB007093EC002093ED0050932B\r
+:10141000F0002091EE0027FF07C09F5FD3CF8F70B1\r
+:101420008093E90081E0089580E008958091E701CC\r
+:1014300087FF11C08091E80082FD05C08091E60120\r
+:101440008111F8CF11C08091E8008B770BC080919B\r
+:10145000E601882349F08091E80080FFF8CF809171\r
+:10146000E8008E778093E80008952091E4003091A1\r
+:10147000E50095E64091EC00842F817040FF22C08A\r
+:101480008091E80080FD1CC08091E601882391F0E6\r
+:10149000853091F08091EB0085FD10C04091E40013\r
+:1014A0005091E5004217530729F39A01915011F723\r
+:1014B00084E0089582E0089583E0089581E008952E\r
+:1014C00080E008954091E80042FFDECF08950E9439\r
+:1014D000D50A0E94DD0AE0EEF0E080818160808321\r
+:1014E000E8EDF0E080818F77808319BCA7EDB0E054\r
+:1014F0008C918E7F8C9380818F7E80831092E5010A\r
+:1015000008950F931F93CF93DF930E94D50A0E94F3\r
+:10151000DD0AC8EDD0E088818F7788838881806874\r
+:10152000888388818F7D888319BC1092E601109290\r
+:10153000E2011092E4011092E30100EE10E0F801E4\r
+:1015400080818B7F808388818160888342E060E036\r
+:1015500080E00E94E109E1EEF0E080818E7F8083EF\r
+:10156000E2EEF0E08081816080838081886080830A\r
+:10157000F80180818E7F8083888180618883DF91FC\r
+:10158000CF911F910F910895E8EDF0E080818F7E5B\r
+:101590008083E7EDF0E080818160808384E082BF1A\r
+:1015A00081E08093E5010C94810AE8EDF0E0808110\r
+:1015B0008E7F80831092E20008951092DA001092DC\r
+:1015C000E10008951F920F920FB60F9211242F93EE\r
+:1015D0003F934F935F936F937F938F939F93AF93BB\r
+:1015E000BF93EF93FF938091E10082FF0BC0809146\r
+:1015F000E20082FF07C08091E1008B7F8093E100D1\r
+:101600000E94490D8091DA0080FF1FC08091D800B0\r
+:1016100080FF1BC08091DA008E7F8093DA0080917A\r
+:10162000D90080FF0DC080E189BD82E189BD09B488\r
+:1016300000FEFDCF81E08093E6010E94440705C0D3\r
+:1016400019BC1092E6010E9452078091E10080FFD0\r
+:1016500019C08091E20080FF15C08091E2008E7F6A\r
+:101660008093E2008091E20080618093E2008091AB\r
+:10167000D80080628093D80019BC85E08093E60191\r
+:101680000E9456078091E10084FF30C08091E20003\r
+:1016900084FF2CC080E189BD82E189BD09B400FED0\r
+:1016A000FDCF8091D8008F7D8093D8008091E1009C\r
+:1016B0008F7E8093E1008091E2008F7E8093E20034\r
+:1016C0008091E20081608093E2008091E2018823B2\r
+:1016D00011F084E007C08091E30087FD02C081E043\r
+:1016E00001C083E08093E6010E9458078091E100E9\r
+:1016F00083FF29C08091E20083FF25C08091E10033\r
+:10170000877F8093E10082E08093E6011092E201FE\r
+:101710008091E1008E7F8093E1008091E2008E7FD6\r
+:101720008093E2008091E20080618093E20042E0D9\r
+:1017300060E080E00E94E1098091F0008860809381\r
+:10174000F0000E945507FF91EF91BF91AF919F91DB\r
+:101750008F917F916F915F914F913F912F910F905A\r
+:101760000FBE0F901F9018951F920F920FB60F92F9\r
+:1017700011242F933F934F935F936F937F938F9396\r
+:101780009F93AF93BF93CF93DF93EF93FF93C0915A\r
+:10179000E900CF708091EC00D82FD17080FDD0E8A7\r
+:1017A0001092E9008091F000877F8093F000789498\r
+:1017B0000E94F80B1092E9008091F00088608093FD\r
+:1017C000F000CD2BCF70C093E900FF91EF91DF9136\r
+:1017D000CF91BF91AF919F918F917F916F915F91C9\r
+:1017E0004F913F912F910F900FBE0F901F90189522\r
+:1017F0001F93CF93DF93CDB7DEB7AA970FB6F894B8\r
+:10180000DEBF0FBECDBFE7EEF1E088E08E0F909116\r
+:10181000F10091938E13FBCF0E9474078091E80032\r
+:1018200083FF1FC18091E7019091E801492F50E0AB\r
+:101830004A30510508F015C1FA01EA5AFF4F0C94DD\r
+:10184000A721803881F0823809F00BC18091EB012B\r
+:101850008F708093E9008091EB0085FB882780F9E9\r
+:101860001092E90006C08091E3019091E40191118A\r
+:1018700082609091E800977F9093E8008093F10058\r
+:101880001092F100C8C0282F2D7F09F0EAC08823EC\r
+:1018900019F0823061F0E5C08091E901813009F0F2\r
+:1018A000E0C0933009F080E08093E4012BC0809188\r
+:1018B000E901811127C08091EB018F7009F4D1C03B\r
+:1018C0008093E9002091EB0020FF1CC0933021F4AD\r
+:1018D0008091EB00806214C09091EB009061909336\r
+:1018E000EB0021E030E0A90102C0440F551F8A95AA\r
+:1018F000E2F74093EA001092EA008091EB008860E2\r
+:101900008093EB001092E9008091E800877F86C009\r
+:101910008111A7C01091E9011F778091E3008078C1\r
+:10192000812B8093E3008091E800877F8093E8001B\r
+:101930000E94160A8091E80080FFFCCF8091E300AE\r
+:1019400080688093E300111102C082E001C083E04F\r
+:101950008093E60186C08058823008F082C0809172\r
+:10196000E9019091EA018C3D53E0950779F583E018\r
+:101970008A838AE289834FB7F894DE01139620E0C8\r
+:101980003EE051E2E32FF0E050935700E49120FF56\r
+:1019900003C0E295EF703F5FEF708E2F90E0EA306A\r
+:1019A00010F0C79601C0C0968D939D932F5F243190\r
+:1019B00049F74FBF8091E800877F8093E8006AE293\r
+:1019C00070E0CE0101960E941D0914C0AE014F5F68\r
+:1019D0005F4F6091EB010E946408BC01892B09F400\r
+:1019E00040C09091E800977F9093E80089819A81A8\r
+:1019F0000E9480098091E8008B778093E80031C0D5\r
+:101A0000803879F58091E800877F8093E8008091A5\r
+:101A1000E2018093F1008091E8008E778093E800E6\r
+:101A20000E94160A1EC081111CC09091E9019230DB\r
+:101A3000C0F48091E800877F8093E8009093E201F2\r
+:101A40000E94160A8091E201811106C08091E30094\r
+:101A500087FD02C081E001C084E08093E6010E941E\r
+:101A600060078091E80083FF0AC08091E800877FCB\r
+:101A70008093E8008091EB0080628093EB00AA964F\r
+:101A80000FB6F894DEBF0FBECDBFDF91CF911F918F\r
+:101A900008950895CF938091E6018823A1F0C09125\r
+:101AA000E900CF709091EC00892F817090FD80E863\r
+:101AB000C82B1092E9008091E80083FD0E94F80B8A\r
+:101AC000CF70C093E900CF910895909369018093FE\r
+:101AD00068010895E0916801F0916901309721F063\r
+:101AE0000190F081E02D099480E00895E091680173\r
+:101AF000F0916901309721F00280F381E02D099483\r
+:101B00000895E0916801F0916901309721F0048017\r
+:101B1000F581E02D099408952091660130916701C7\r
+:101B20008217930771F09093670180936601E091AB\r
+:101B30006801F0916901309721F00680F781E02D6E\r
+:101B400009940895209164013091650182179307EB\r
+:101B500071F09093650180936401E0916801F091C8\r
+:101B60006901309721F00084F185E02D09940895F2\r
+:101B700008950C94B80D0E947E190E943E030C94A7\r
+:101B8000441ACF92DF92EF92FF920F931F93CF935D\r
+:101B9000DF93CDB7DEB72B970FB6F894DEBF0FBE3D\r
+:101BA000CDBF0E9456038BE6C82E81E0D82E00E000\r
+:101BB00010E0E02E802F0E944404F60141916F0155\r
+:101BC000F42EF826B1F40F5F1F4F0E30110589F780\r
+:101BD0008FEF89838A831B820E9487198160782F07\r
+:101BE0009D838C8349815A816B818D810E94640E13\r
+:101BF00040C09091CD0191FF04C08B870E944A04A0\r
+:101C00008B8520E030E04F2D50E0922FBA01022E5C\r
+:101C100002C0759567950A94E2F760FF24C02E8391\r
+:101C2000EF8221E030E0690102C0CC0CDD1C9A9506\r
+:101C3000E2F790E08C219D21892B09F420E0288790\r
+:101C40000E9487198160782F9A8789874E815F81EA\r
+:101C500068858A850E94640EF801E559FE4F8081EF\r
+:101C6000C826C08206C02F5F3F4F2630310569F677\r
+:101C7000AACF0E942B1D10916A010E946A0D1817AD\r
+:101C8000A1F00E946A0D80936A012B960FB6F8941A\r
+:101C9000DEBF0FBECDBFDF91CF911F910F91FF909F\r
+:101CA000EF90DF90CF900C9463062B960FB6F894CC\r
+:101CB000DEBF0FBECDBFDF91CF911F910F91FF907F\r
+:101CC000EF90DF90CF900895CF93DF93CDB7DEB73D\r
+:101CD0002B970FB6F894DEBF0FBECDBF4F8358874A\r
+:101CE00069877A878B87DE01119686E0FD01119264\r
+:101CF0008A95E9F785E0FE01379601900D928A9565\r
+:101D0000E1F749815A816B817C818D819E810E949E\r
+:101D100094152B960FB6F894DEBF0FBECDBFDF91A2\r
+:101D2000CF9108950895CF93882309F4C2C0C82F96\r
+:101D3000823859F40E946A0D81FDBBC089E30E947C\r
+:101D40003D180E940A1989E30CC0833879F40E9477\r
+:101D50006A0D80FDAEC083E50E943D180E940A19FD\r
+:101D600083E50E947F18CF910C940A19843859F4A6\r
+:101D70000E946A0D82FD9DC087E40E943D180E946A\r
+:101D80000A1987E4EECF8CEF8C0F813A48F48C2F40\r
+:101D90000E94721F81118DC08C2F0E943D18E3CFCD\r
+:101DA00080E28C0F883048F4C77081E001C0880F52\r
+:101DB000CA95EAF70E94C318D6CF8BE58C0F833003\r
+:101DC00078F4C53A29F0C63A31F083E890E005C0CE\r
+:101DD00081E890E002C082E890E0CF910C948C0DF5\r
+:101DE00088E58C0F833108F064C0C83A39F1C93AEC\r
+:101DF00041F1CA3A49F1CB3A51F1CC3A59F1CD3AD5\r
+:101E000061F1C03B69F1CE3A71F1CF3A79F1C13B52\r
+:101E100081F1C23B89F1C33B91F1C43B99F1C53BD0\r
+:101E2000A1F1C63BA9F1C73BB1F1C83BB9F1C93B30\r
+:101E3000C1F1CA3BC9F180E090E038C082EE90E089\r
+:101E400035C089EE90E032C08AEE90E02FC085EB7D\r
+:101E500090E02CC086EB90E029C087EB90E026C094\r
+:101E60008CEC90E023C08DEC90E020C083E891E002\r
+:101E70001DC08AE891E01AC082E991E017C084E9A8\r
+:101E800091E014C081E292E011C083E292E00EC0C2\r
+:101E900084E292E00BC085E292E008C086E292E024\r
+:101EA00005C087E292E002C08AE292E0CF910C94F2\r
+:101EB000A20DCF910895882309F44BC0823859F4BC\r
+:101EC0000E946A0D81FF45C089E30E943D180E946F\r
+:101ED0000A1989E30CC0833871F40E946A0D80FFEF\r
+:101EE00038C083E50E943D180E940A1983E50E94CC\r
+:101EF0007F180C940A19843859F40E946A0D82FFE5\r
+:101F000028C087E40E943D180E940A1987E4EFCF99\r
+:101F10009CEF980F913A58F390E2980F983050F454\r
+:101F2000877091E001C0990F8A95EAF7892F0E9486\r
+:101F3000C918DFCF9BE5980F933020F480E090E044\r
+:101F40000C948C0D885A833120F480E090E00C943E\r
+:101F5000A20D0895882321F00E94C3180C940A1939\r
+:101F60000895882321F00E94C9180C940A19089535\r
+:101F7000BF92CF92DF92EF92FF920F931F93CF9376\r
+:101F8000DF9300D000D000D0CDB7DEB725E0FC0154\r
+:101F9000DE01119601900D922A95E1F7FC01D080A7\r
+:101FA00011810281258122952F7043815481452B17\r
+:101FB00009F4FCC21F3F21F4FFEFDF1609F4F6C25B\r
+:101FC0007C012E830E94920ED9821A8369817A81C4\r
+:101FD000802F0E943918182FB92E0E94EE170E94E8\r
+:101FE000B5162E81002319F00E94E0182E81EB2DEA\r
+:101FF000E295EF70F0E0E05AFF4F0C94A7218B2D93\r
+:10200000807F9B2D9F70F92E882319F0F29480EF2A\r
+:10201000F822002389F0FF2009F475C280E2810FC5\r
+:10202000883020F48F2D0E94C31803C08F2D0E948A\r
+:10203000D3180E940A1967C2812F0E945B0FFF20EC\r
+:1020400009F4B4C2105E8F2D183018F40E94C9181C\r
+:1020500002C00E94D91826960FB6F894DEBF0FBEB4\r
+:10206000CDBFDF91CF911F910F91FF90EF90DF9047\r
+:10207000CF90BF900C940A193B2D307F8B2D8F7021\r
+:10208000303211F08295807F112319F0113021F147\r
+:102090002CC00023B9F0222309F4A0C1213009F09B\r
+:1020A0009DC126960FB6F894DEBF0FBECDBFDF915F\r
+:1020B000CF911F910F91FF90EF90DF90CF90BF9045\r
+:1020C0000C94F318222319F0213009F46FC28E8387\r
+:1020D0000E94F6188E8196C1002321F0223008F06C\r
+:1020E00065C27CC1211162C28DC1002321F022236F\r
+:1020F00009F474C108C2222309F484C119C22B2D2A\r
+:1021000026952695237030E02115310521F02130E8\r
+:102110003105D1F04BC2002321F0812F9B2D93700C\r
+:1021200002C080E090E026960FB6F894DEBF0FBEA6\r
+:10213000CDBFDF91CF911F910F91FF90EF90DF9076\r
+:10214000CF90BF900C948C0D002321F0812F9B2DFC\r
+:10215000937002C080E090E026960FB6F894DEBF40\r
+:102160000FBECDBFDF91CF911F910F91FF90EF90E8\r
+:10217000DF90CF90BF900C94A20D812F002319F017\r
+:102180000E94331C02C00E949B1C26960FB6F89436\r
+:10219000DEBF0FBECDBFDF91CF911F910F91FF909A\r
+:1021A000EF90DF90CF90BF900C94201D8B2D83700B\r
+:1021B00009F07BC00111FAC1812F82958695877045\r
+:1021C000880F880F912F9F70C92ED12CE12CF12CF4\r
+:1021D000082E04C0CC0CDD1CEE1CFF1C0A94D2F7A8\r
+:1021E00014FF12C04FE050E060E070E004C0440F04\r
+:1021F000551F661F771F8A95D2F7CB01BA016095EC\r
+:1022000070958095909503C060E070E0CB012B2D18\r
+:10221000269526952370422F50E042305105D9F083\r
+:102220004330510569F16C297D298E299F29413060\r
+:10223000510551F126960FB6F894DEBF0FBECDBF03\r
+:10224000DF91CF911F910F91FF90EF90DF90CF9092\r
+:10225000BF900C94DC166C297D298E299F29269627\r
+:102260000FB6F894DEBF0FBECDBFDF91CF911F91A7\r
+:102270000F91FF90EF90DF90CF90BF900C94F816E5\r
+:102280000E94DC16C701B60126960FB6F894DEBF91\r
+:102290000FBECDBFDF91CF911F910F91FF90EF90B7\r
+:1022A000DF90CF90BF900C94C016002319F08B2DB7\r
+:1022B000817001C08695882309F478C1812F8295A9\r
+:1022C00086958770880F880F912F9F70C92ED12C0B\r
+:1022D000E12CF12C082E04C0CC0CDD1CEE1CFF1CE4\r
+:1022E0000A94D2F714FF12C04FE050E060E070E0B3\r
+:1022F00004C0440F551F661F771F8A95D2F7CB0184\r
+:10230000BA01609570958095909503C060E070E08B\r
+:10231000CB012B2D269526952370422F50E042307D\r
+:102320005105D9F04330510569F16C297D298E2979\r
+:102330009F294130510551F126960FB6F894DEBF22\r
+:102340000FBECDBFDF91CF911F910F91FF90EF9006\r
+:10235000DF90CF90BF900C94B6176C297D298E2901\r
+:102360009F2926960FB6F894DEBF0FBECDBFDF9132\r
+:10237000CF911F910F91FF90EF90DF90CF90BF9082\r
+:102380000C94D2170E94B617C701B60126960FB655\r
+:10239000F894DEBF0FBECDBFDF91CF911F910F919B\r
+:1023A000FF90EF90DF90CF90BF900C949A17103F62\r
+:1023B000D1F118F4103E50F4A1C0123F09F463C0EB\r
+:1023C00008F44CC0133F09F473C098C01F708B2DE4\r
+:1023D0008F710023A1F00E943317812F26960FB62C\r
+:1023E000F894DEBF0FBECDBFDF91CF911F910F914B\r
+:1023F000FF90EF90DF90CF90BF900C94AA0F0E94B7\r
+:102400005417812F26960FB6F894DEBF0FBECDBFAE\r
+:10241000DF91CF911F910F91FF90EF90DF90CF90C0\r
+:10242000BF900C94B10F0023A9F02111BFC08B2DD8\r
+:102430008F7126960FB6F894DEBF0FBECDBFDF9129\r
+:10244000CF911F910F91FF90EF90DF90CF90BF90B1\r
+:102450000C947917223008F0A9C0E9CF0023A9F025\r
+:102460008B2D8F7126960FB6F894DEBF0FBECDBFB1\r
+:10247000DF91CF911F910F91FF90EF90DF90CF9060\r
+:10248000BF900C943317002359F38B2D8F71269630\r
+:102490000FB6F894DEBF0FBECDBFDF91CF911F9175\r
+:1024A0000F91FF90EF90DF90CF90BF900C94541756\r
+:1024B000002399F08B2D8F7126960FB6F894DEBF0E\r
+:1024C0000FBECDBFDF91CF911F910F91FF90EF9085\r
+:1024D000DF90CF90BF900C941E1726960FB6F894FD\r
+:1024E000DEBF0FBECDBFDF91CF911F910F91FF9047\r
+:1024F000EF90DF90CF90BF900C9414170023A9F0B9\r
+:10250000222309F4ADCF812F26960FB6F894DEBFB3\r
+:102510000FBECDBFDF91CF911F910F91FF90EF9034\r
+:10252000DF90CF90BF900C94930E222309F4ADCF8F\r
+:10253000812F26960FB6F894DEBF0FBECDBFDF9178\r
+:10254000CF911F910F91FF90EF90DF90CF90BF90B0\r
+:102550000C945B0F4B2D4F70612FC7010E9401023D\r
+:1025600026960FB6F894DEBF0FBECDBFDF91CF9198\r
+:102570001F910F91FF90EF90DF90CF90BF900C9440\r
+:1025800038164B2D4F70612FC70126960FB6F89461\r
+:10259000DEBF0FBECDBFDF91CF911F910F91FF9096\r
+:1025A000EF90DF90CF90BF900C940A0526960FB65F\r
+:1025B000F894DEBF0FBECDBFDF91CF911F910F9179\r
+:1025C000FF90EF90DF90CF90BF9008950E94E018A9\r
+:1025D0000E94F0180E94B5180E940A190E94D11D8D\r
+:1025E0000E94201D80E090E00E948C0D80E090E031\r
+:1025F0000C94A20D0E94D0180C94E6120E942E1882\r
+:10260000292F22952F7030E02C3031054CF42A30E0\r
+:1026100031056CF4225031092230310588F407C0AD\r
+:102620002C30310549F02F30310531F009C0803EA2\r
+:1026300048F0803F29F406C093FB882780F908956D\r
+:1026400080E0089581E00895CF93DF9300D000D01B\r
+:102650001F92CDB7DEB70F900F900F900F900F9095\r
+:10266000DF91CF910895CF93DF9300D000D000D0B9\r
+:10267000CDB7DEB726960FB6F894DEBF0FBECDBF3E\r
+:10268000DF91CF9108951F93CF93DF93C09179018C\r
+:1026900016E080917A01C81799F0D0E01C9FF001F4\r
+:1026A0001D9FF00D1124E558FE4F4081518162813C\r
+:1026B0007381848195810E9433132196C770E9CF7D\r
+:1026C000DF91CF911F9108954091AB015091AC01E2\r
+:1026D0006091AD017091AE018091AF019091B00118\r
+:1026E0000C9433138091B00182958F7009F054C01F\r
+:1026F0008091AD01882309F44FC080917901A091A8\r
+:102700007A016091AB017091AC014091AE015091A2\r
+:10271000AF01B6E08A1709F43FC090E041155105BA\r
+:10272000C1F17F3F11F46F3FA1F1B89FF001B99F54\r
+:10273000F00D1124E558FE4F218172132AC020812B\r
+:10274000621327C02281211124C0238134812417E0\r
+:10275000350710F421503109241B350B283C310575\r
+:10276000C0F42091B0012F7020612093B00126E0C9\r
+:10277000289FF001299FF00D1124E058FE4F808121\r
+:102780008F70806180838BEA91E00E94B80F0C9477\r
+:10279000431301968770BECF0895CF92DF92EF92D8\r
+:1027A000FF920F931F93CF93DF93CDB7DEB762975E\r
+:1027B0000FB6F894DEBF0FBECDBF8C0185E0F801E7\r
+:1027C000DE011D9601900D928A95E1F7D8014C919A\r
+:1027D00011965C91119712966C9112971396CD9069\r
+:1027E000DC9014973091AB017091AC018091AE01F7\r
+:1027F0009091AF01009709F46BC17F3F19F43F3FFF\r
+:1028000009F466C1E090AD01EE2009F4C0C020914A\r
+:10281000B001C816D90628F0F601E81BF90BCF0164\r
+:1028200004C0809590958C0D9D1DFF24F394883CE9\r
+:10283000910578F0F12C207F09F0C6C07C2DD98A53\r
+:10284000C88A89890E9424138BEA91E00E94B80FFC\r
+:10285000B1C0822F807F09F046C0751314C03413B5\r
+:1028600012C0611110C02F7020612093B0010E942E\r
+:1028700064138BEA91E00E94B80F8091B001D801F7\r
+:1028800015968C932EC0CD2819F15F3F11F44F3F60\r
+:10289000F9F0F62E61111CC08091790120917A0126\r
+:1028A00036E0821709F45AC090E0389FF001399F52\r
+:1028B000F00D1124E558FE4F7181571306C0708149\r
+:1028C000471303C07281711103C001968770E9CF6D\r
+:1028D000F62E662309F418C18091B00181608093BF\r
+:1028E000B001F12C11C1751308C0341306C0611179\r
+:1028F00004C08091B001D801C3C04D875E878D852B\r
+:102900009E856A8B0E94FE126A898823E1F1662304\r
+:10291000D1F12091B001822F82958F7090E00297C3\r
+:1029200074F08091AB019091AC0198878F831986E8\r
+:10293000DB86CA862C87CE0107960E94B80F86E0F8\r
+:10294000F801ABEAB1E001900D928A95E1F70E949F\r
+:1029500072130E946413FF24F394D6C04D875E87E0\r
+:102960008D859E850E942E18292F22952F7030E08C\r
+:10297000223031050CF0BCC09F7009F0B6C0805EFB\r
+:10298000883008F4C1C0C8010E94B80FE4CFC8164F\r
+:10299000D90608F453C0F601E81BF90BCF01883CB7\r
+:1029A000910508F450C0F12C7C2DD98AC88A8989F8\r
+:1029B0000E942413EBEAF1E086E0DF011D928A9584\r
+:1029C000E9F70E946413A0C0751314C0341312C039\r
+:1029D000611110C08091B001F8018583C8010E9487\r
+:1029E000B80F86E0EBEAF1E0DF011D928A95E9F786\r
+:1029F000FE2C8AC04D875E878D859E856A8B0E94DE\r
+:102A0000FE126A89882309F4BECF662309F4BBCF7E\r
+:102A10002091B001822F82958F7090E002970CF484\r
+:102A20008ECF8091AB019091AC019A8389831B82F8\r
+:102A3000DD82CC822E83CE0101967FCF809590954A\r
+:102A40008C0D9D1DACCFF62E662309F49CCF75131B\r
+:102A50002EC034132CC02091B00120FD1FC0822F46\r
+:102A600082958F70D9F0D80115962C9315978F30D9\r
+:102A700049F08F5F982F9295907F822F8F70892BCE\r
+:102A800015968C93C8010E94B80F86E0F801ABEA56\r
+:102A9000B1E001900D928A95E1F793CF86E0F801BD\r
+:102AA000ABEAB1E001900D928A95E1F72DC04D8718\r
+:102AB0005E878D859E850E94FE12811140CF809198\r
+:102AC000B00181608093B001C8010E94B80F1CC0A2\r
+:102AD000662309F458CF4D875E878D859E850E94B9\r
+:102AE000FE12882309F44FCF2ACF811148CF0CC0A2\r
+:102AF000243031050CF047CF9F7009F440CFF80126\r
+:102B00009581907F09F03BCF8F2D62960FB6F89498\r
+:102B1000DEBF0FBECDBFDF91CF911F910F91FF9010\r
+:102B2000EF90DF90CF9008951F93CF93DF93CDB7B1\r
+:102B3000DEB72C970FB6F894DEBF0FBECDBF4F8324\r
+:102B4000588769877A878B879C87CE0107960E9472\r
+:102B5000CD13882369F08F8198852A853B85232BA7\r
+:102B6000F1F19F3F09F063C08F3F09F060C037C0AB\r
+:102B700086E0FE013796DE01119601900D928A954E\r
+:102B8000E1F76F817885EA85FB85309741F17F3FDA\r
+:102B900011F46F3F21F120917A0130E0C9010196D3\r
+:102BA000877099274091790150E08417950709F4BF\r
+:102BB00047C069837A83FD83EC8396E0929FD001BE\r
+:102BC000939FB00D1124A558BE4FFE013196019080\r
+:102BD0000D929A95E1F780937A010E94431316E0D3\r
+:102BE0008091790190917A018917C1F1189FC001F4\r
+:102BF000112485589E4F0E94CD13882379F1E091CE\r
+:102C000079011E9FF0011124E558FE4F408151814A\r
+:102C100062817381848195810E943313809179014F\r
+:102C200090E001968770992780937901D9CF4F81E1\r
+:102C3000588569857A858B859C850E943313CFCF13\r
+:102C40000E94FA1210927A0110927901EBEAF1E0F7\r
+:102C500086E0DF011D928A95E9F7C1CF2C960FB669\r
+:102C6000F894DEBF0FBECDBFDF91CF911F910895C5\r
+:102C7000EF92FF920F931F93CF93DF938C01892BD9\r
+:102C800009F46CC0F12CEE24E394E8012196F801DC\r
+:102C90008491843740F4843008F051C0813081F051\r
+:102CA000823019F15BC0853709F444C0A8F19CE774\r
+:102CB000980F903708F052C08F770E945B0F41C089\r
+:102CC0000E5F1F4FFE01C49180E28C0F883048F4E4\r
+:102CD000C7708E2D01C0880FCA95EAF70E94E318CD\r
+:102CE00014C08C2F0E94930E2DC00E5F1F4FFE014B\r
+:102CF000C49180E28C0F883058F4C7708E2D01C0CB\r
+:102D0000880FCA95EAF70E94E9180E940A191AC0AA\r
+:102D10008C2F0E945B0F16C00E5F1F4FFE01C491E7\r
+:102D2000CC2381F08FE99FE00197F1F700C000000C\r
+:102D3000C150F6CF0E5F1F4FFE01F49003C00E94FA\r
+:102D4000930E8E018F2D882309F49FCFEFE9FFE0CA\r
+:102D50003197F1F700C000008150F5CFDF91CF919E\r
+:102D60001F910F91FF90EF90089508956093B50122\r
+:102D70007093B6018093B7019093B8010C94E6125A\r
+:102D80000F931F930091B5011091B6012091B701E7\r
+:102D90003091B801DC01CB01802B912BA22BB32BFE\r
+:102DA0008093B5019093B601A093B701B093B80199\r
+:102DB0001F910F910C94E6120F931F930091B50190\r
+:102DC0001091B6012091B7013091B801DC01CB011F\r
+:102DD00080239123A223B3238093B5019093B6015E\r
+:102DE000A093B701B093B8011F910F910C94E61214\r
+:102DF0000F931F930091B5011091B6012091B70177\r
+:102E00003091B801DC01CB0180279127A227B3279D\r
+:102E10008093B5019093B601A093B701B093B80128\r
+:102E20001F910F910C94E6121092B1011092B20111\r
+:102E30001092B3011092B4010C94E61241E050E0FC\r
+:102E400060E070E004C0440F551F661F771F8A952D\r
+:102E5000D2F74093B1015093B2016093B3017093E4\r
+:102E6000B4010C94E61241E050E060E070E004C070\r
+:102E7000440F551F661F771F8A95D2F78091B101C5\r
+:102E80009091B201A091B301B091B401482B592B9C\r
+:102E90006A2B7B2B4093B1015093B2016093B30135\r
+:102EA0007093B4010C94E61241E050E060E070E0F1\r
+:102EB00004C0440F551F661F771F8A95D2F74095AF\r
+:102EC0005095609570958091B1019091B201A0915B\r
+:102ED000B301B091B401482359236A237B23409363\r
+:102EE000B1015093B2016093B3017093B4010C949B\r
+:102EF000E61241E050E060E070E004C0440F551F6E\r
+:102F0000661F771F8A95D2F78091B1019091B20127\r
+:102F1000A091B301B091B401482759276A277B27B4\r
+:102F20004093B1015093B2016093B3017093B40127\r
+:102F30000C94E6120F931F930091B1011091B2010E\r
+:102F40002091B3013091B401DC01CB01802B912B96\r
+:102F5000A22BB32B8093B1019093B201A093B30144\r
+:102F6000B093B4011F910F910C94E6120F931F932D\r
+:102F70000091B1011091B2012091B3013091B401DF\r
+:102F8000DC01CB0180239123A223B3238093B101E1\r
+:102F90009093B201A093B301B093B4011F910F912C\r
+:102FA0000C94E6120F931F930091B1011091B2019E\r
+:102FB0002091B3013091B401DC01CB01802791272E\r
+:102FC000A227B3278093B1019093B201A093B301DC\r
+:102FD000B093B4011F910F910C94E6120895CF9213\r
+:102FE000DF92EF92FF920F931F93CF93DF938C01A9\r
+:102FF000C090B501D090B601E090B701F090B80153\r
+:103000008091B1019091B201A091B301B091B4014E\r
+:10301000C82AD92AEA2AFB2ACFE1D0E0D701C60183\r
+:103020000C2E04C0B695A795979587950A94D2F76C\r
+:1030300080FF06C0B8018C2F0E942D05019721F456\r
+:10304000219760F780E001C08C2FDF91CF911F9115\r
+:103050000F91FF90EF90DF90CF900895CF93DF9383\r
+:10306000EC010E94EF17BE010E942D05DF91CF9168\r
+:103070000895CB010E942E18089590910C01992378\r
+:1030800021F090910D01911109C020910E01309114\r
+:103090000F01F90132969FEF40E01FC0982F9695DF\r
+:1030A000969596959F3050F5E0910E01F0910F01A5\r
+:1030B000E90FF11D877021E030E0A90102C0440F43\r
+:1030C000551F8A95E2F7CA019181892B8183089562\r
+:1030D0009F3F39F04F5F4E3041F051915813F8CF78\r
+:1030E0000DC05111F7CF942FF5CF9F3F39F0F90163\r
+:1030F000E90FF11D97FDFA95828308950895909147\r
+:103100000C01992321F090910D01911109C020919A\r
+:103110000E0130910F01F9013296205F3F4F1FC021\r
+:10312000982F9695969596959F30F0F4E0910E0124\r
+:10313000F0910F01E90FF11D877021E030E0A90146\r
+:1031400002C0440F551F8A95E2F7CA01809591810C\r
+:103150008923818308953196E217F30729F090813E\r
+:103160009813F9CF1082F7CF089581E090E0E091B5\r
+:103170000E01F0910F01E80FF91F108201968031C6\r
+:103180009105A9F708959091CC01892B8093CC01EA\r
+:10319000089580959091CC0189238093CC01089566\r
+:1031A0001092CC0108959091CB01892B8093CB0193\r
+:1031B000089580959091CB0189238093CB01089548\r
+:1031C0001092CB0108959091CA01892B8093CA0176\r
+:1031D000089580959091CA0189238093CA0108952A\r
+:1031E0001092CA0108958093B90108951092B9010F\r
+:1031F000089580910E0190910F01FC0131969C0180\r
+:10320000205F3F4F80E0919191118F5FE217F307AC\r
+:10321000D1F70895E0910E01F0910F018091CC015A\r
+:103220008083E0910E01F0910F0190818091CB019C\r
+:10323000892B8083E0910E01F0910F0190818091A4\r
+:10324000CA01892B80838091B901882361F0E091C4\r
+:103250000E01F0910F019081892B80830E94F91853\r
+:1032600081111092B90180910E0190910F010C947F\r
+:10327000760D8091E601843021F11092CE0120E498\r
+:1032800088E190E00FB6F894A895809360000FBE97\r
+:103290002093600080E00E94630683B7817F846092\r
+:1032A00083BF83B7816083BF7894889583B78E7F0F\r
+:1032B00083BF88E10FB6F89480936000109260009D\r
+:1032C0000FBE089508950895CF930E9462190E9439\r
+:1032D00056030E946319C0E08C2F0E9444048111A0\r
+:1032E00004C0CF5FCE30C1F701C081E0CF91089517\r
+:1032F0000E94FA120E946A0D0C94630682E084BD5B\r
+:1033000093E095BD9AEF97BD80936E0008952FB717\r
+:10331000F8948091CF019091D001A091D101B0910A\r
+:10332000D2012FBF0895CF92DF92EF92FF920F93B9\r
+:103330001F932FB7F8944091CF015091D001609125\r
+:10334000D1017091D2012FBF6A017B01EE24FF24CD\r
+:103350008C0120E030E0C016D106E206F30610F43E\r
+:10336000415051099A01281B390BC9011F910F9136\r
+:10337000FF90EF90DF90CF9008951F920F920FB6BD\r
+:103380000F9211248F939F93AF93BF938091CF019E\r
+:103390009091D001A091D101B091D2010196A11DCF\r
+:1033A000B11D8093CF019093D001A093D101B09330\r
+:1033B000D201BF91AF919F918F910F900FBE0F904F\r
+:1033C0001F9018950E94670AF8942FEF87EA91E6FC\r
+:1033D000215080409040E1F700C0000087E090EB72\r
+:1033E000DC018093EF019093F001A093F101B09381\r
+:1033F000F2019CE088E10FB6F894A89580936000F4\r
+:103400000FBE90936000FFCFEF92FF920F931F9338\r
+:10341000CF93DF93D82FC0E08C2F0E94440400E0AC\r
+:1034200010E0E82EF12CC701002E02C0959587957B\r
+:103430000A94E2F780FD06C00F5F1F4F06301105AA\r
+:1034400091F709C0602F7C2F80E00E940B05D813F4\r
+:10345000F3CF81E004C0CF5FCE30F1F680E0DF91A2\r
+:10346000CF911F910F91FF90EF900895CF93C82FA8\r
+:103470008CE20E94041A882321F08C2FCF910C94A7\r
+:10348000041A80E0CF910895CF930E948B1B811185\r
+:1034900002C00E94711BC5E6C15049F00E9456034C\r
+:1034A0008FE39CE90197F1F700C00000F5CF89E2B6\r
+:1034B0000E94361A811113C18AE20E94361A8111C4\r
+:1034C0000E94711B85E00E94361A81110E94E21948\r
+:1034D0000E94961B8093CD0187E00E94361A8823B4\r
+:1034E000A9F18BE10E94361A882351F08091CD0119\r
+:1034F00081FB222720F991E0922790FB81F90EC0F1\r
+:103500008EE00E94361A882361F08091CD0182FB03\r
+:10351000222720F991E0922790FB82F98093CD0138\r
+:1035200015C080E10E94361A9091CD01882341F0A8\r
+:1035300093FB222720F981E0822780FB93F904C0C6\r
+:10354000892F809580FB90F99093CD018091CD01DA\r
+:103550000E949A1B0E94A81B8093E00180EE0E94AB\r
+:10356000361A882341F08091E001982F909590FBC6\r
+:1035700080F98093E00189E30E94361A882359F08C\r
+:103580008091E00181FB222720F991E0922790FBB6\r
+:1035900081F98093E00182EE0E94361A882359F067\r
+:1035A0008091E00182FB222720F991E0922790FB95\r
+:1035B00082F98093E00186EE0E94361A882359F042\r
+:1035C0008091E00183FB222720F991E0922790FB74\r
+:1035D00083F98093E00183EE0E94361A882359F024\r
+:1035E0008091E00184FB222720F991E0922790FB53\r
+:1035F00084F98093E00185E30E94361A882359F00C\r
+:103600008091E00185FB222720F991E0922790FB31\r
+:1036100085F98093E00181E30E94361A882359F0EE\r
+:103620008091E00186FB222720F991E0922790FB10\r
+:1036300086F98093E00181E10E94361A882359F0CF\r
+:103640008091E00187FB222720F991E0922790FBEF\r
+:1036500087F98093E0018091E0010E94AC1B80918A\r
+:10366000E00187FB882780F980930D0187E20E94A3\r
+:10367000361AC82F8EE10E94361A8111C2608FE17E\r
+:103680000E94361A8111C46080E20E94361A8111AC\r
+:10369000C86081E20E94361A8111C06182E20E94F4\r
+:1036A000361A8111C06283E20E94361A8111C06409\r
+:1036B00084E20E94361A882311F0C06802C0CC232D\r
+:1036C00029F08C2F0E94A31B6C2F03C00E949F1B0C\r
+:1036D000682F70E080E090E0CF910C94B616CF9107\r
+:1036E00008956DEE7EEF80E090E00E94DD2160E0C5\r
+:1036F00082E090E00E94CF2160E083E090E00E94B1\r
+:10370000CF2160E084E090E00E94CF2160E085E07E\r
+:1037100090E00C94CF2180E090E00E94C92121E04C\r
+:103720008D3E9E4F09F020E0822F089582E090E0C8\r
+:103730000C94C121682F82E090E00C94CF2183E0AB\r
+:1037400090E00C94C121682F83E090E00C94CF218D\r
+:1037500084E090E00C94C121682F84E090E00C9408\r
+:10376000CF218091D50180FF0BC06091130185E0CE\r
+:10377000689FB001112475956795759567952BC065\r
+:1037800081FF09C06091130185E0689FB001112499\r
+:103790007595679520C082FF07C06091130185E091\r
+:1037A000689FB001112417C09091D6019923D1F0E0\r
+:1037B00060911201961788F72091130185E0289FE8\r
+:1037C00090011124929FA001939F500D112470E04D\r
+:1037D000CA010E9493216038710540F4611571059A\r
+:1037E00039F002C065E070E0862F08958FE70895F4\r
+:1037F00081E008958091D50180FF08C0609111019A\r
+:1038000070E0759567957595679521C081FF06C035\r
+:103810006091110170E07595679519C082FF04C031\r
+:103820006091110170E010C09091D6019923C1F010\r
+:10383000609110019617A0F780911101899FC00136\r
+:10384000112470E00E9493216038710528F46115FD\r
+:10385000710521F0862F08958FE7089581E008957E\r
+:1038600061E070E0F4CF803F21F40E94B11B8195AC\r
+:1038700004C0813F29F40E94B11B8093D9010895AF\r
+:10388000823F21F40E94B11B819504C0833F29F43B\r
+:103890000E94B11B8093D8010895893F19F40E94BA\r
+:1038A000FA1B05C08A3F31F40E94FA1B8195809370\r
+:1038B000DA0108958B3F21F40E94FA1B819504C020\r
+:1038C0008C3F29F40E94FA1B8093DB010895843F0A\r
+:1038D00021F48091D701816017C0853F21F4809148\r
+:1038E000D701826011C0863F21F48091D7018460A6\r
+:1038F0000BC0873F21F48091D701886005C0883FC5\r
+:1039000031F48091D70180618093D70108958D3F74\r
+:1039100021F48091D50181600BC08E3F21F480910C\r
+:10392000D501826005C08F3F29F48091D501846064\r
+:103930008093D5010895803F39F48091D90187FFA4\r
+:103940006CC01092D90169C0813F29F48091D901DE\r
+:103950001816BCF362C09091D801823F29F497FFFA\r
+:103960005CC01092D80159C0833F19F41916CCF3EA\r
+:1039700054C0893F41F48091DA0118160CF04DC013\r
+:103980001092DA014AC08A3F29F48091DA0187FF58\r
+:1039900044C0F6CF8B3F39F48091DB0187FF3DC0F7\r
+:1039A0001092DB013AC08C3F29F48091DB0118169C\r
+:1039B000BCF333C0843F21F48091D7018E7F17C0C0\r
+:1039C000853F21F48091D7018D7F11C0863F21F47E\r
+:1039D0008091D7018B7F0BC0873F21F48091D70165\r
+:1039E000877F05C0883F31F48091D7018F7E809317\r
+:1039F000D70113C08D3F21F48091D5018E7F0BC07C\r
+:103A00008E3F21F48091D5018D7F05C08F3F29F431\r
+:103A10008091D5018B7F8093D5018091D801811150\r
+:103A20000EC08091D90181110AC08091DA01811103\r
+:103A300006C08091DB01811102C01092D601089569\r
+:103A400087ED91E00E94810D0E9487199093D40127\r
+:103A50008093D30108951F93CF93DF938091D30177\r
+:103A60009091D4010E949319AC019091D6019923B1\r
+:103A700021F02091140130E006C0209115018AE068\r
+:103A8000289F900111244217530708F486C08091A3\r
+:103A9000D801C091D901D091DA011091DB018111D7\r
+:103AA00007C0C11176C0D11174C0111172C075C0A8\r
+:103AB0009F3F19F09F5F9093D601181624F40E943F\r
+:103AC000B11B8093D8018091D80187FF05C00E9467\r
+:103AD000B11B81958093D8011C1624F40E94B11B60\r
+:103AE0008093D9018091D90187FF05C00E94B11B45\r
+:103AF00081958093D9016091D801662339F1C091F5\r
+:103B0000D901CC2319F1772767FD7095872F972F5F\r
+:103B10000E94A42023E333E343E35FE30E940821F0\r
+:103B20000E9471206093D8016C2F772767FD7095F4\r
+:103B3000872F972F0E94A42023E333E343E35FE31F\r
+:103B40000E9408210E9471206093D9011D1624F45F\r
+:103B50000E94FA1B8093DA018091DA0187FF05C089\r
+:103B60000E94FA1B81958093DA01111624F40E94B9\r
+:103B7000FA1B8093DB018091DB0187FF05C00E9467\r
+:103B8000FA1B81958093DB01DF91CF911F910C94FB\r
+:103B9000201D9F3F09F08ECF96CFDF91CF911F91CF\r
+:103BA0000895E7EDF1E085E0DF011D928A95E9F7E0\r
+:103BB0001092D6011092D5010895833081F128F436\r
+:103BC000813059F08230D1F00895853009F449C030\r
+:103BD000B8F1863009F456C0089580911501262F5A\r
+:103BE00030E0280F311D2F3F310524F4680F60931A\r
+:103BF000150108958FEF80931501089580911401A8\r
+:103C0000262F30E0280F311D2F3F310524F4680F97\r
+:103C10006093140108958FEF8093140108958091AB\r
+:103C20001301262F30E0280F311D2F3F310524F4DA\r
+:103C3000680F6093130108958FEF80931301089527\r
+:103C400080911201262F30E0280F311D2F3F3105C2\r
+:103C500024F4680F6093120108958FEF809312018E\r
+:103C6000089580911101262F30E0280F311D2F3F3C\r
+:103C7000310524F4680F6093110108958FEF80934C\r
+:103C80001101089580911001262F30E0280F311D79\r
+:103C90002F3F310524F4680F6093100108958FEFD2\r
+:103CA000809310010895833011F128F4813049F098\r
+:103CB000823091F00895853081F120F18630C1F194\r
+:103CC000089580911501681720F4861B80931501D3\r
+:103CD000089510921501089580911401681720F439\r
+:103CE000861B809314010895109214010895809109\r
+:103CF0001301681720F4861B809313010895109216\r
+:103D00001301089580911201681720F4861B809397\r
+:103D100012010895109212010895809111016817FF\r
+:103D200020F4861B809311010895109211010895CB\r
+:103D300080911001681720F4861B8093100108956C\r
+:103D40001092100108950F931F938D3109F46AC0EA\r
+:103D500008F03FC08E3009F484C0C0F4873009F405\r
+:103D60006DC068F4863009F0B5C08091CD01817FC7\r
+:103D70008E7F8093CD0181E08093DD01ACC08830DF\r
+:103D800009F457C08B3009F46AC0A4C0863109F425\r
+:103D900066C078F4803109F477C0813109F09AC0A7\r
+:103DA0000E94FA1290910D0181E0892780930D0104\r
+:103DB00056C0893109F453C08B3109F08BC0809112\r
+:103DC000CD0181FB222720F991E0922790FB81F918\r
+:103DD00051C0853309F475C048F4873209F471C0C5\r
+:103DE00008F45EC0893209F46CC074C0833430F4C6\r
+:103DF0008A3308F053C0883391F16CC0833409F4DE\r
+:103E000060C0883409F066C00E94FA120FEF13ED0B\r
+:103E100020E3015010402040E1F700C000000E9464\r
+:103E2000E2191DC00E942B200E946A0D0E946306A9\r
+:103E300016C00E94961B0E94A81B11C09091CD0134\r
+:103E4000892F8095817080FB90F929F096609860A9\r
+:103E50009093CD0140C0997F977F9093CD0181E0F1\r
+:103E60003AC08091CD0182FB222720F991E0922770\r
+:103E700090FB82F98093CD01992389F38091CD0144\r
+:103E800081608093CD01EBCF8091CD0183FB222710\r
+:103E900020F991E0922790FB83F9ECCF895301C080\r
+:103EA0008D5141E050E060E070E08A019B0104C068\r
+:103EB000000F111F221F331F8A95D2F7C901B801C5\r
+:103EC00004C061E070E080E090E00E94B6160E94BD\r
+:103ED000FA12C5CF80E01F910F91089580E00895F8\r
+:103EE00080E00895CF93C82F8091DD01813079F073\r
+:103EF00018F08230E9F187C0E0910E01F0910F01D6\r
+:103F00008081813169F0823209F07FC009C0E0917F\r
+:103F10000E01F0910F018081813111F0823261F444\r
+:103F20008C2F0E946E1F811104C08C2F0E94A31E33\r
+:103F30001DC081E090E01AC08C2F0E94701F81117B\r
+:103F400014C0C43179F048F4CB3079F0C03109F0B5\r
+:103F500060C082E08093DD0108C0C93219F0C83327\r
+:103F600021F057C01092DD0154C081E0817053C030\r
+:103F7000C93289F118F5C43171F1A8F4C73009F0DC\r
+:103F800046C08AE08093150194E19093140193E078\r
+:103F9000909313018093120188E08093110188E2CD\r
+:103FA0008093100134C0CE51C63088F5EC2FF0E07C\r
+:103FB000E65DFE4F80818093DC0129C0CE34E9F0BC\r
+:103FC00020F4CB3421F56AE013C0C13579F0C23555\r
+:103FD000F1F461E00DC08091DC01882319F01092AA\r
+:103FE000DC0115C081E08093DD0115C061E006C0F1\r
+:103FF0008091DC010E94DD1D0AC06AE08091DC0135\r
+:104000000E94531E04C01092DD0180E004C081E0D4\r
+:1040100002C080E0ABCFCF910895E1E8F0E080816D\r
+:10402000886080838081816080838FB7F89493E07B\r
+:104030009093890090ED909388008FBF0895EFE6EC\r
+:10404000F0E08081826080830895EFE6F0E0808177\r
+:104050008D7F80830895EFE6F0E0908182E08927EC\r
+:10406000808308951F920F920FB60F9211242F9301\r
+:104070003F934F935F936F937F938F939F93AF93F0\r
+:10408000BF93EF93FF938091DE019091DF01019642\r
+:104090009093DF018093DE01811103C082E00E94D2\r
+:1040A0006306E091DF01E695E695F0E0EA5CFC4FFF\r
+:1040B000E4918091DE018E1303C080E00E946306CC\r
+:1040C000FF91EF91BF91AF919F918F917F916F91F0\r
+:1040D0005F914F913F912F910F900FBE0F901F90C6\r
+:1040E000189504D06894B1118DC0089570D088F0EF\r
+:1040F0009F5790F0B92F9927B751A0F0D1F0660FD4\r
+:10410000771F881F991F1AF0BA95C9F712C0B130EE\r
+:1041100081F077D0B1E0089574C0672F782F882799\r
+:10412000B85F39F0B93FCCF3869577956795B3952D\r
+:10413000D9F73EF490958095709561957F4F8F4F9C\r
+:104140009F4F0895E89409C097FB3EF490958095A1\r
+:10415000709561957F4F8F4F9F4F9923A9F0F92F4D\r
+:1041600096E9BB279395F695879577956795B795CB\r
+:10417000F111F8CFFAF4BB0F11F460FF1BC06F5FB1\r
+:104180007F4F8F4F9F4F16C0882311F096E911C0C3\r
+:10419000772321F09EE8872F762F05C0662371F0E4\r
+:1041A00096E8862F70E060E02AF09A95660F771FF8\r
+:1041B000881FDAF7880F9695879597F9089557FD28\r
+:1041C0009058440F551F59F05F3F71F04795880F85\r
+:1041D00097FB991F61F09F3F79F08795089512161C\r
+:1041E00013061406551FF2CF4695F1DF08C01616C8\r
+:1041F00017061806991FF1CF869571056105089479\r
+:104200000895E894BB2766277727CB0197F908958F\r
+:104210000BD078C069D028F06ED018F0952309F043\r
+:104220005AC05FC01124EECFCADFA0F3959FD1F32F\r
+:10423000950F50E0551F629FF001729FBB27F00D54\r
+:10424000B11D639FAA27F00DB11DAA1F649F6627A9\r
+:10425000B00DA11D661F829F2227B00DA11D621FF8\r
+:10426000739FB00DA11D621F839FA00D611D221FB2\r
+:10427000749F3327A00D611D231F849F600D211D96\r
+:10428000822F762F6A2F11249F5750408AF0E1F039\r
+:1042900088234AF0EE0FFF1FBB1F661F771F881F82\r
+:1042A00091505040A9F79E3F510570F014C0AACF1D\r
+:1042B0005F3FECF3983EDCF3869577956795B7956D\r
+:1042C000F795E7959F5FC1F7FE2B880F911D969597\r
+:1042D000879597F9089597F99F6780E870E060E007\r
+:1042E00008959FEF80EC089500240A94161617068F\r
+:1042F00018060906089500240A94121613061406D7\r
+:1043000005060895092E0394000C11F4882352F039\r
+:10431000BB0F40F4BF2B11F460FF04C06F5F7F4FF1\r
+:104320008F4F9F4F089597FB072E16F4009407D0E8\r
+:1043300077FD09D00E94AD2107FC05D03EF4909591\r
+:1043400081959F4F0895709561957F4F0895EE0F69\r
+:10435000FF1F0590F491E02D0994AA1BBB1B51E1AE\r
+:1043600007C0AA1FBB1FA617B70710F0A61BB70BE5\r
+:10437000881F991F5A95A9F780959095BC01CD018A\r
+:104380000895F999FECF92BD81BDF89A992780B51D\r
+:104390000895A8E1B0E042E050E00C94E421262F1B\r
+:1043A000F999FECF1FBA92BD81BD20BD0FB6F8941A\r
+:1043B000FA9AF99A0FBE019608950E94CF21272FED\r
+:1043C0000C94D021DC01CB01FC01F999FECF06C091\r
+:1043D000F2BDE1BDF89A319600B40D9241505040C3\r
+:0843E000B8F70895F894FFCF2F\r
+:1043E80020026506F306D0069C0668060101BA019C\r
+:1043F80028080A03140A3F4D3639F702AA02740244\r
+:104408003B02CE01E701000219020102030405067E\r
+:044418000708090088\r
+:00000001FF\r
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.png b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.png
new file mode 100644 (file)
index 0000000..4b9433b
Binary files /dev/null and b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.png differ
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/keymap.c b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/keymap.c
new file mode 100644 (file)
index 0000000..dd946c1
--- /dev/null
@@ -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;
+  }
+};
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/readme.md b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/readme.md
new file mode 100644 (file)
index 0000000..0e78c13
--- /dev/null
@@ -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`.
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.hex b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.hex
new file mode 100644 (file)
index 0000000..80ae075
--- /dev/null
@@ -0,0 +1,1139 @@
+:100000000C940F020C9453020C9453020C94530260\r
+:100010000C9453020C9453020C9453020C9453020C\r
+:100020000C9453020C9453020C94070C0C94D90CAE\r
+:100030000C9453020C9453020C9453020C945302EC\r
+:100040000C9453020C94A3210C9453020C9453026D\r
+:100050000C9453020C94321B0C9453020C945302D4\r
+:100060000C9453020C9453020C9453020C945302BC\r
+:100070000C9453020C9453020C9453020C945302AC\r
+:100080000C9453020C9453020C9453020C9453029C\r
+:100090000C9453020C9453020C9453020C9453028C\r
+:1000A0000C9453020C9453020C945302460D680DA9\r
+:1000B000560E680D560EAD0DD00D560E250E380E8F\r
+:1000C0002411241161116111A411E211FB13FB131E\r
+:1000D000FB11FB13FC12FC12CF13FB13FB13E613F3\r
+:1000E00035002B00E000E1003A0000001E00140083\r
+:1000F00004001D003B00E2001F001A0016001B0058\r
+:100100003C00297120000700080006003D002A007D\r
+:100110002100090017001900E300A90022000E00C9\r
+:100120000A0005000000AA003E00310000002F0078\r
+:100130000000A8003F000154000030000000AE00A5\r
+:1001400023000D001C0013000000AB002400180069\r
+:1001500011001000E700AC00250015000C0036006F\r
+:1001600050002C0026000F00120037005100340010\r
+:10017000270033000B0038005200E6002E002D004F\r
+:100180002800E5004F00000001000100010001000F\r
+:100190000100000001000100010001000100010058\r
+:1001A0000100010001000100010001000100080040\r
+:1001B0000700010001000100010015000900010015\r
+:1001C0000100010001001700010001000000010012\r
+:1001D0000100010000000100000001000100010019\r
+:1001E000000001000000010001001C000B001100D4\r
+:1001F00000000100010018000D00010001000100D5\r
+:1002000001000C000E0001000100010001001200BD\r
+:100210000F00010001000100010013003300010084\r
+:1002200001000100010001000100010001000000C7\r
+:1002300016034500720067006F0044006F007800ED\r
+:10024000200045005A0000001603450072006700B8\r
+:100250006F0044006F007800200045005A00000045\r
+:100260000403090409026D00040100A0FA09040056\r
+:10027000000103010100092111010001223F0007D3\r
+:1002800005810308000A09040100010301020009B5\r
+:100290002111010001224D000705820308000A090F\r
+:1002A00004020001030000000921110100012236AF\r
+:1002B000000705830308000A090403000103000086\r
+:1002C00000092111010001223900070584031000F3\r
+:1002D000011201100100000008EDFE0713010001EA\r
+:1002E00002000105010906A101050719E029E7152A\r
+:1002F0000025019508750181020508190129059558\r
+:1003000005750191029501750391010507190029F1\r
+:100310007715002501957875018102C005010980D6\r
+:10032000A101850216010026B7001A01002AB700B4\r
+:10033000751095018100C0050C0901A10185031606\r
+:100340000100269C021A01002A9C02751095018169\r
+:1003500000C005010902A1010901A1000509190157\r
+:100360002905150025019505750181029501750383\r
+:1003700081010501093009311581257F9502750834\r
+:10038000810609381581257F950175088106050CC0\r
+:100390000A38021581257F950175088106C0C005C0\r
+:1003A000010906A101050719E029E71500250195B6\r
+:1003B0000875018102950175088101050819012957\r
+:1003C00005950575019102950175039101050719C0\r
+:1003D0000029FF150025FF950675088100C0000063\r
+:1003E000000000000000000000010204060A0F17D0\r
+:1003F000202C3A4A5D71879DB3C7DAE9F5FCFFFC12\r
+:10040000F5E9DAC7B39D87715D4A3A2C20170F0AC8\r
+:10041000060402010000000000000000000011249A\r
+:100420001FBECFEFDAE0DEBFCDBF04B603FE24C0AF\r
+:100430008091EE019091EF01A091F001B091F10156\r
+:100440008730904BA740B04BB9F41092EE01109258\r
+:10045000EF011092F0011092F10114BE84B7877F72\r
+:1004600084BF88E10FB6F89480936000109260001A\r
+:100470000FBEE0E0FFE3099511E0A0E0B1E0E4ED9C\r
+:10048000F6E402C005900D92A433B107D9F711E04C\r
+:10049000A4E3B1E001C01D92AE3EB107E1F70E94B6\r
+:1004A0004B090C9468230C94000008950895609102\r
+:1004B000B1017091B2018091B3019091B4010E9499\r
+:1004C0005E1A56985E9825982D9826982E9827980B\r
+:1004D0002F98813011F4259A2D9A08950C94570283\r
+:1004E00056985E9825982D9826982E9827982F989C\r
+:1004F0008FEF90E0909389008093880090938B0019\r
+:1005000080938A0090938D0080938C00259A2D9A79\r
+:100510002FEF80E792E0215080409040E1F700C04B\r
+:100520000000269A2E9A2FEF80E792E0215080401B\r
+:100530009040E1F700C00000279A2F9A2FEF80E744\r
+:1005400092E0215080409040E1F700C000002598E3\r
+:100550002D982FEF80E792E0215080409040E1F706\r
+:1005600000C0000026982E982FEF80E792E02150DF\r
+:1005700080409040E1F700C0000027982F985698DF\r
+:100580005E9825982D9826982E9827982F9808954C\r
+:1005900089EA8093800089E08093810024982C98D8\r
+:1005A0003F988AB18F748AB96E98479A8BB1806BE5\r
+:1005B0008BB9769A0E9470020C94560280E2809366\r
+:1005C00000018091340181110EC00E942D0381E051\r
+:1005D000809334012FEF83ED90E3215080409040D1\r
+:1005E000E1F700C0000080E40E9433038093000123\r
+:1005F00081112EC00E945D0380930001811128C0EB\r
+:100600000E945D0380930001811122C08FE30E944C\r
+:100610005D038093000181111BC00E94550380E49B\r
+:100620000E94330380930001811112C08CE00E946C\r
+:100630005D038093000181110BC00E945D038093D4\r
+:100640000001811105C08FE30E945D0380930001CA\r
+:100650000E9455038091000108951092B9008AE02C\r
+:100660008093B800089594EA9093BC009091BC00E8\r
+:1006700097FFFCCF9091B900987F983021F090318E\r
+:1006800011F081E008958093BB0084E88093BC0062\r
+:100690008091BC0087FFFCCF8091B900887F8831B2\r
+:1006A00011F0803471F780E0089584E98093BC00F4\r
+:1006B0008091BC0084FDFCCF08958093BB0084E84A\r
+:1006C0008093BC008091BC0087FFFCCF9091B90063\r
+:1006D000987F81E0983209F480E0089584E880935F\r
+:1006E000BC008091BC0087FFFCCF8091BB000895C7\r
+:1006F00080910001811115C080E40E943303809332\r
+:10070000000181110CC082E10E945D038093000111\r
+:10071000811105C08FEF0E945D03809300010E944C\r
+:10072000550384B1807F84B985B1807F85B98AB152\r
+:10073000837F8AB98BB1837F8BB93E9846980895A1\r
+:100740000E94DE02809300010E94780380B38C70C7\r
+:1007500080BB81B3836F81BBA6E3B1E0E4E4F1E049\r
+:100760008EE08E0F11921D928E13FCCF0C94C80256\r
+:10077000BF92CF92DF92EF92FF920F931F93CF938E\r
+:10078000DF9380910001882379F0809135018F5F9C\r
+:1007900080933501811108C00E94DE028093000120\r
+:1007A000811102C00E94700206E311E0C0E0D0E0B7\r
+:1007B000DD24D39482E0C82EEE24E394F12CC730DC\r
+:1007C000D10500F580910001811164C080E40E9490\r
+:1007D000330380930001811112C082E10E945D0306\r
+:1007E0008093000181110BC0C7010C2E01C0880F3E\r
+:1007F0000A94EAF780950E945D03809300010E94AD\r
+:10080000550348C0CA30A1F028F4C83059F0C930A7\r
+:1008100061F005C0CC3089F070F0CD3089F0209ABD\r
+:10082000289810C0219A29980DC0229A2A980AC0A7\r
+:10083000239A2B9807C0529A01C0539A5B9802C022\r
+:100840003E9A469890EA9A95F1F79FB1799902C03D\r
+:1008500082E001C080E091709D25982B7C9902C0B8\r
+:1008600084E001C080E0892B7D9902C038E001C09E\r
+:1008700030E0832B7E9902C020E101C020E0822B72\r
+:100880009FB19095991F9927991F9295990F907EE6\r
+:10089000892B0FC080910001811149C080E40E9422\r
+:1008A000330380930001882379F1B12C0E94550312\r
+:1008B0008B2DF8019081981719F08083C092010167\r
+:1008C0000E94780321960F5F1F4FCE30D10509F0AB\r
+:1008D00076CF80910101882361F1815080930101DD\r
+:1008E000882339F08FE99FE00197F1F700C00000FD\r
+:1008F00020C0A4E4B1E0E6E3F1E0CF01825F919192\r
+:100900009D938E13FCCF15C083E10E945D038093FD\r
+:1009100000018111CACF81E40E943303809300015A\r
+:100920008111C3CF0E946E03B82EB094BFCF80E078\r
+:10093000C0CF0E946E0281E0DF91CF911F910F9195\r
+:10094000FF90EF90DF90CF90BF900895E82FF0E0F8\r
+:10095000EC5BFE4F808108950895089596E0799F9D\r
+:10096000F001112494E5899FE00DF11D1124E60F9B\r
+:10097000F11DEE0FFF1FE052FF4F859194910895F6\r
+:10098000880F991FFC01E05AF040859194910895D9\r
+:10099000880F991FFC01E052FF4F859194910895B3\r
+:1009A0000F931F93CF93DF93EC018115904350F584\r
+:1009B000C11580E2D80708F0B3C0CB3BD10590F455\r
+:1009C000C83AD10508F05AC0C53AD10508F04BC065\r
+:1009D000C430D10508F0BBC1219709F0B5C101E0D1\r
+:1009E00010E0F5C1CF3FD10511F008F0B0C1C03F14\r
+:1009F000D10508F092C0CE01805E9109089708F4F5\r
+:100A0000A6C1A2C1C11591E5D907A8F4C23020E55D\r
+:100A1000D20708F09EC0C11580E5D80709F485C04B\r
+:100A200008F091C0C11520E4D20708F08DC1DD2780\r
+:100A30008E01106CCCC1C11580E8D80758F4C115DF\r
+:100A400090E7D90708F07CC1C11520E6D20708F469\r
+:100A500022C17AC1C11580E9D80708F075C1DF70DD\r
+:100A60008E01106AB4C1C53AD10509F472C1C63A03\r
+:100A7000D10509F071C102E810E4A9C1C83AD10555\r
+:100A800009F46DC1C93AD10509F46CC1CA3AD1055E\r
+:100A900009F46BC1CB3AD10509F46AC1CC3AD1054E\r
+:100AA00009F469C1CD3AD10509F468C1C03BD1054B\r
+:100AB00009F467C1CE3AD10509F466C1CF3AD10530\r
+:100AC00009F465C1C13BD10509F464C1C23BD1053C\r
+:100AD00009F463C1C33BD10509F462C1C43BD1052C\r
+:100AE00009F461C1C53BD10509F460C1C63BD1051C\r
+:100AF00009F45FC1C73BD10509F45EC1C83BD1050C\r
+:100B000009F45DC1C93BD10509F45CC1CA3BD105FB\r
+:100B100009F45BC100E014E45AC18E01106557C1AD\r
+:100B2000CE019F700E94C80453C10E941F149FEF02\r
+:100B300024E38CE0915020408040E1F700C00000A9\r
+:100B40000E94571B44C18091CD0181608093CD01EB\r
+:100B50003EC10E94001D811102C00E94E61C0E943D\r
+:100B60001D1D90E09093EE018093ED01C23090E561\r
+:100B7000D90721F48091ED01816086C0C43020E561\r
+:100B8000D20721F48091ED0182607EC0C63080E5FD\r
+:100B9000D80721F48091ED01846076C0C83090E5DB\r
+:100BA000D90719F48091ED0127C0CA3020E5D2079A\r
+:100BB00021F48091ED01806167C0CC3080E5D807D9\r
+:100BC00021F48091ED0180625FC0CE3090E5D907BD\r
+:100BD00021F48091ED01806457C0C03120E5D20737\r
+:100BE00021F48091ED0180684FC0C23180E5D807C3\r
+:100BF00029F48091ED018460886046C0C33090E59F\r
+:100C0000D90721F48091ED018E7F3EC0C53020E5EB\r
+:100C1000D20721F48091ED018D7F36C0C73080E589\r
+:100C2000D80721F48091ED018B7F2EC0C93090E56B\r
+:100C3000D90719F48091ED0126C0CB3020E5D20709\r
+:100C400021F48091ED018F7E1FC0CD3080E5D80763\r
+:100C500021F48091ED018F7D17C0CF3090E5D90749\r
+:100C600021F48091ED018F7B0FC0C13120E5D207C7\r
+:100C700021F48091ED018F7707C0C331D04531F465\r
+:100C80008091ED018B7F877F8093ED018091ED0155\r
+:100C90000E94211D9CC08D2F99278F70992781302C\r
+:100CA0009105D9F49E012370332702C0880F991F44\r
+:100CB0002A95E2F79C688E0144E0000F111F4A95C7\r
+:100CC000E1F700271370802B912B53E0CC0FDD1F31\r
+:100CD0005A95E1F7C076DD272FC08230910531F4B7\r
+:100CE000DC2FCC278E01016F106A71C08330910513\r
+:100CF00069F4CE018370992701E010E002C0000F73\r
+:100D0000111F8A95E2F7C8019C680FC0049709F08B\r
+:100D10005EC0CE018370992701E010E002C0000F91\r
+:100D2000111F8A95E2F7C8019A6823E0CC0FDD1FF6\r
+:100D30002A95E1F7C07ED7708C010C2B1D2B47C084\r
+:100D4000DF708E01106243C000E010E040C08E01F1\r
+:100D50003EC001E810E43BC003E810E438C002EEF6\r
+:100D600014E435C009EE14E432C00AEE14E42FC0D6\r
+:100D700005EB14E42CC006EB14E429C007EB14E4E3\r
+:100D800026C00CEC14E423C00DEC14E420C003E8EE\r
+:100D900015E41DC00AE815E41AC002E915E417C0FD\r
+:100DA00004E915E414C001E216E411C003E216E4FC\r
+:100DB0000EC004E216E40BC005E216E408C006E229\r
+:100DC00016E405C007E216E402C00AE216E4C80110\r
+:100DD000DF91CF911F910F91089596E0799FF001D7\r
+:100DE000112494E5899FE00DF11D1124E60FF11DFA\r
+:100DF000EE0FFF1FE052FF4F85919491803E9105C9\r
+:100E0000E0F4803C910558F58133910509F46FC0F9\r
+:100E100048F48932910509F463C08A32910509F4D6\r
+:100E20006DC072C089339105E9F082389105D1F027\r
+:100E30008533910509F44DC067C0833E910581F16A\r
+:100E400038F4803E9105B9F0823E9105D9F05CC03E\r
+:100E5000863E910561F1873E9105A1F155C00E9442\r
+:100E6000C00408952091ED0120FD02C021FF4CC077\r
+:100E700080EE90E049C08091ED0180FFF9CF89E3D9\r
+:100E800090E042C08091ED0182FF0EC08091ED01A3\r
+:100E900084FF03C080E090E037C083EE90E034C070\r
+:100EA0008091ED0182FFF2CF82EE90E02DC0809123\r
+:100EB000ED0183FF0BC08091ED0184FDEBCF87EE48\r
+:100EC00090E022C08091ED0183FFF5CF86EE90E0A7\r
+:100ED0001BC08091ED0185FF07C089E290E014C03E\r
+:100EE0008091ED0185FFF9CF85E390E00DC0809101\r
+:100EF000ED0186FF07C08AE290E006C08091ED0117\r
+:100F000086FFF9CF81E390E00E94D0040895089510\r
+:100F10000C948707809162010895CF93DF9300D0EE\r
+:100F20001F92CDB7DEB79C018091E401843019F5A2\r
+:100F300093E099833B832A839093E9008FEF90910C\r
+:100F4000E800815095FD06C095ED9A95F1F70000F7\r
+:100F50008111F5CF8091E80085FF0DC040E050E0A1\r
+:100F600063E070E0CE0101960E94F7098091E800ED\r
+:100F70008E778093E8000F900F900F90DF91CF91C4\r
+:100F80000895CF93DF9300D01F92CDB7DEB72091A5\r
+:100F9000E401243021F522E029839B838A8383E0C6\r
+:100FA0008093E9008FEF9091E800815095FD06C095\r
+:100FB00095ED9A95F1F700008111F5CF8091E80049\r
+:100FC00085FF0DC040E050E063E070E0CE01019687\r
+:100FD0000E94F7098091E8008E778093E8000F90D7\r
+:100FE0000F900F90DF91CF9108952091E40124306C\r
+:100FF000F1F422E02093E9002FEF3091E800215036\r
+:1010000035FD06C035ED3A95F1F700002111F5CF19\r
+:101010002091E80025FF0BC040E050E065E070E063\r
+:101020000E94F7098091E8008E778093E800089588\r
+:10103000CF93DF93EC019091E401943009F046C026\r
+:1010400080910C018823D9F080910D018823B9F09B\r
+:101050009093E9008FEF9091E800815095FD06C0D4\r
+:1010600095E19A95F1F700008111F5CF8091E800A4\r
+:1010700085FF2CC040E050E060E170E017C081E0E7\r
+:101080008093E9008FEF9091E800815095FD06C0B4\r
+:1010900095ED9A95F1F700008111F5CF8091E80068\r
+:1010A00085FF14C040E050E068E070E0CE010E948F\r
+:1010B000F7098091E8008E778093E80080E1FE01D7\r
+:1010C000A2E5B1E001900D928A95E1F7DF91CF9111\r
+:1010D00008958091E301811109C00E948C0B0E9448\r
+:1010E000E90B8091E20084608093E2000895109201\r
+:1010F000E301089508950C9490210E94ED1A0E9436\r
+:1011000096210E948F0E0C94880742E061EC81E0EA\r
+:101110000E94060B42E061EC82E00E94060B42E076\r
+:1011200061EC83E00E94060B42E161EC84E00C94E8\r
+:10113000060B8091E601833009F455C030F481300C\r
+:1011400071F0823009F48EC008958A3009F47AC0B3\r
+:101150008B3009F460C0893009F09CC020C08091B8\r
+:10116000E501813A09F096C08091E800877F80937D\r
+:10117000E8008091E9019091EA01892B21F460E176\r
+:1011800082E591E003C060E080E090E070E00E94C2\r
+:10119000420A8091E8008B778093E800089580915F\r
+:1011A000E501813209F076C08091E9019091EA0170\r
+:1011B000009719F0039709F06DC08091E800877FD0\r
+:1011C0008093E8008091E80082FD05C08091E401F1\r
+:1011D0008111F8CF5FC08091F1008093620180910E\r
+:1011E000E8008B7753C08091E501813A09F052C045\r
+:1011F0008091E9019091EA01892B09F04BC080911F\r
+:10120000E800877F8093E8008091E80080FFFCCFB2\r
+:1012100080910C0136C08091E5018132D9F5809131\r
+:10122000E9019091EA01892BA9F58091E800877F77\r
+:101230008093E8000E943B0B8091E70180930C01B2\r
+:101240000C941F148091E501813221F58091E80012\r
+:10125000877F8093E8000E943B0B8091E801809398\r
+:10126000630108958091E501813AA1F48091E8003D\r
+:10127000877F8093E8008091E80080FFFCCF809119\r
+:1012800063018093F1008091E8008E778093E800FD\r
+:101290000C943B0B089584B7877F84BF88E10FB619\r
+:1012A000F89480936000109260000FBE90E080E898\r
+:1012B0000FB6F89480936100909361000FBE0E9476\r
+:1012C000DE0E0E948C0B0E94E90B8091E20084608C\r
+:1012D0008093E20078940E946F0E0E94E00E82E0FC\r
+:1012E00091E00E948A0E0E947E218091E401853067\r
+:1012F00069F40E94AE1A8091E2018823B1F30E9442\r
+:10130000D91A882391F30E94E109EFCF0E94E60EDB\r
+:10131000ECCF292F332723303105C9F064F4213075\r
+:10132000310581F02230310509F043C08DE690E0AF\r
+:1013300024E632E042C021323105F1F0223231059B\r
+:1013400041F137C082E190E021ED32E036C09927CB\r
+:101350008130910541F08230910541F0892B49F5AA\r
+:10136000E0E6F2E005C0E8E4F2E002C0E0E3F2E02B\r
+:10137000849190E09F0121C06430D8F4E62FF0E022\r
+:10138000EE0FFF1FEE5DFE4F2081318189E090E07E\r
+:1013900014C0643070F470E0FB01EE0FFF1FE65ED6\r
+:1013A000FE4F20813181FB01EA5EFE4F808190E09B\r
+:1013B00004C080E090E020E030E0FA013183208337\r
+:1013C000089580E189BD82E189BD09B400FEFDCFA9\r
+:1013D0008091D8008F7D8093D8008091E00082605A\r
+:1013E0008093E0008091E00081FDFCCF0895CF92D2\r
+:1013F000DF92EF92FF920F931F93CF93DF93EC0155\r
+:101400008B016A010E945A0B811133C0C114D104AF\r
+:1014100039F0F60180819181081B190BC80FD91F83\r
+:10142000E12CF12C0115110519F18091E80085FDE1\r
+:1014300016C08091E8008E778093E800C114D10433\r
+:1014400049F0F60180819181E80EF91EF182E08277\r
+:1014500085E00FC00E945A0B882321F30AC08991AE\r
+:101460008093F10001501109FFEFEF1AFF0ADACF64\r
+:1014700080E0DF91CF911F910F91FF90EF90DF906F\r
+:10148000CF9008952091EB013091EC01261737079A\r
+:1014900048F06115710539F42091E8002E7720930A\r
+:1014A000E80001C0B90140E061157105A9F1209182\r
+:1014B000E401222309F443C0253009F442C02091FD\r
+:1014C000E80023FD40C02091E80022FD32C02091B9\r
+:1014D000E80020FFE9CF4091F3002091F20030E0D6\r
+:1014E000342BFC01CF016115710559F0283031050D\r
+:1014F00040F481918093F100615071092F5F3F4F5B\r
+:10150000F1CF41E02830310509F040E02091E800BA\r
+:101510002E772093E800C8CF4111C9CF0AC080912F\r
+:10152000E401882361F0853061F08091E80083FD5B\r
+:101530000AC08091E80082FFF2CF80E0089582E047\r
+:10154000089583E0089581E008952091EB013091A2\r
+:10155000EC012617370748F06115710539F4209121\r
+:10156000E8002E772093E80001C0B901FC0120E0DB\r
+:101570006115710591F18091E401882309F440C05F\r
+:10158000853009F43FC08091E80083FD3DC0809123\r
+:10159000E80082FD2FC08091E80080FFE9CF209114\r
+:1015A000F3008091F20090E0922B6115710559F0E3\r
+:1015B0008830910540F424912093F10031966150D8\r
+:1015C00071090196F2CF21E0089709F020E080919F\r
+:1015D000E8008E778093E800CBCF2111CCCF0AC0F2\r
+:1015E0008091E401882361F0853061F08091E8000A\r
+:1015F00083FD0AC08091E80082FFF2CF80E0089569\r
+:1016000082E0089583E0089581E00895982F97304F\r
+:1016100058F59093E900981739F07091EC002091FB\r
+:10162000ED005091F00003C0242F762F50E021FFF1\r
+:1016300019C03091EB003E7F3093EB003091ED000C\r
+:101640003D7F3093ED003091EB0031603093EB0043\r
+:101650007093EC002093ED005093F0002091EE0089\r
+:1016600027FF07C09F5FD3CF8F708093E90081E091\r
+:10167000089580E008958091E50187FF11C0809171\r
+:10168000E80082FD05C08091E4018111F8CF11C00E\r
+:101690008091E8008B770BC08091E401882349F0AA\r
+:1016A0008091E80080FFF8CF8091E8008E778093EA\r
+:1016B000E80008952091E4003091E50095E640911E\r
+:1016C000EC00842F817040FF22C08091E80080FDF3\r
+:1016D0001CC08091E401882391F0853091F08091C5\r
+:1016E000EB0085FD10C04091E4005091E5004217E9\r
+:1016F000530729F39A01915011F784E0089582E08D\r
+:10170000089583E0089581E0089580E00895409170\r
+:10171000E80042FFDECF08950E94FA0B0E94020CFF\r
+:10172000E0EEF0E0808181608083E8EDF0E0808190\r
+:101730008F77808319BCA7EDB0E08C918E7F8C935E\r
+:1017400080818F7E80831092E30108950F931F9311\r
+:10175000CF93DF930E94FA0B0E94020CC8EDD0E0F9\r
+:1017600088818F77888388818068888388818F7D4E\r
+:10177000888319BC1092E4011092E0011092E201FA\r
+:101780001092E10100EE10E0F80180818B7F8083F0\r
+:1017900088818160888342E060E080E00E94060BDF\r
+:1017A000E1EEF0E080818E7F8083E2EEF0E08081E8\r
+:1017B00081608083808188608083F80180818E7F52\r
+:1017C0008083888180618883DF91CF911F910F9101\r
+:1017D0000895E8EDF0E080818F7E8083E7EDF0E012\r
+:1017E00080818160808384E082BF81E08093E30117\r
+:1017F0000C94A60BE8EDF0E080818E7F8083109240\r
+:10180000E20008951092DA001092E10008951F920C\r
+:101810000F920FB60F9211242F933F934F935F9324\r
+:101820006F937F938F939F93AF93BF93EF93FF93A8\r
+:101830008091E10082FF0BC08091E20082FF07C02F\r
+:101840008091E1008B7F8093E1000E946E0E809179\r
+:10185000DA0080FF1FC08091D80080FF1BC08091FC\r
+:10186000DA008E7F8093DA008091D90080FF0DC06E\r
+:1018700080E189BD82E189BD09B400FEFDCF81E030\r
+:101880008093E4010E94690805C019BC1092E4012C\r
+:101890000E9477088091E10080FF19C08091E200EA\r
+:1018A00080FF15C08091E2008E7F8093E2008091DE\r
+:1018B000E20080618093E2008091D8008062809392\r
+:1018C000D80019BC85E08093E4010E947B088091D8\r
+:1018D000E10084FF30C08091E20084FF2CC080E1F1\r
+:1018E00089BD82E189BD09B400FEFDCF8091D80099\r
+:1018F0008F7D8093D8008091E1008F7E8093E100FE\r
+:101900008091E2008F7E8093E2008091E20081600E\r
+:101910008093E2008091E001882311F084E007C009\r
+:101920008091E30087FD02C081E001C083E08093E5\r
+:10193000E4010E947D088091E10083FF29C080912D\r
+:10194000E20083FF25C08091E100877F8093E10062\r
+:1019500082E08093E4011092E0018091E1008E7FAB\r
+:101960008093E1008091E2008E7F8093E20080917D\r
+:10197000E20080618093E20042E060E080E00E944B\r
+:10198000060B8091F00088608093F0000E947A0836\r
+:10199000FF91EF91BF91AF919F918F917F916F9147\r
+:1019A0005F914F913F912F910F900FBE0F901F901D\r
+:1019B00018951F920F920FB60F9211242F933F93F9\r
+:1019C0004F935F936F937F938F939F93AF93BF9347\r
+:1019D000CF93DF93EF93FF93C091E900CF70809195\r
+:1019E000EC00D82FD17080FDD0E81092E9008091F2\r
+:1019F000F000877F8093F00078940E941D0D109274\r
+:101A0000E9008091F00088608093F000CD2BCF70CA\r
+:101A1000C093E900FF91EF91DF91CF91BF91AF911A\r
+:101A20009F918F917F916F915F914F913F912F91F6\r
+:101A30000F900FBE0F901F9018951F93CF93DF93B9\r
+:101A4000CDB7DEB7AA970FB6F894DEBF0FBECDBFF5\r
+:101A5000E5EEF1E088E08E0F9091F10091938E1306\r
+:101A6000FBCF0E9499088091E80083FF1FC18091FD\r
+:101A7000E5019091E601492F50E04A30510508F008\r
+:101A800015C1FA01EA5AFF4F0C941823803881F0EF\r
+:101A9000823809F00BC18091E9018F708093E900D1\r
+:101AA0008091EB0085FB882780F91092E90006C041\r
+:101AB0008091E1019091E201911182609091E800A2\r
+:101AC000977F9093E8008093F1001092F100C8C0D6\r
+:101AD000282F2D7F09F0EAC0882319F0823061F0A9\r
+:101AE000E5C08091E701813009F0E0C0933009F052\r
+:101AF00080E08093E2012BC08091E701811127C033\r
+:101B00008091E9018F7009F4D1C08093E9002091A0\r
+:101B1000EB0020FF1CC0933021F48091EB00806229\r
+:101B200014C09091EB0090619093EB0021E030E0C5\r
+:101B3000A90102C0440F551F8A95E2F74093EA00BD\r
+:101B40001092EA008091EB0088608093EB00109285\r
+:101B5000E9008091E800877F86C08111A7C01091BD\r
+:101B6000E7011F778091E3008078812B8093E30069\r
+:101B70008091E800877F8093E8000E943B0B809172\r
+:101B8000E80080FFFCCF8091E30080688093E30051\r
+:101B9000111102C082E001C083E08093E40186C09D\r
+:101BA0008058823008F082C08091E7019091E8016E\r
+:101BB0008C3D53E0950779F583E08A838AE2898337\r
+:101BC0004FB7F894DE01139620E03EE051E2E32F98\r
+:101BD000F0E050935700E49120FF03C0E295EF70CE\r
+:101BE0003F5FEF708E2F90E0EA3010F0C79601C093\r
+:101BF000C0968D939D932F5F243149F74FBF8091FD\r
+:101C0000E800877F8093E8006AE270E0CE010196E9\r
+:101C10000E94420A14C0AE014F5F5F4F6091E9011C\r
+:101C20000E948909BC01892B09F440C09091E80009\r
+:101C3000977F9093E80089819A810E94A50A8091FC\r
+:101C4000E8008B778093E80031C0803879F5809187\r
+:101C5000E800877F8093E8008091E0018093F100A5\r
+:101C60008091E8008E778093E8000E943B0B1EC0B5\r
+:101C700081111CC09091E7019230C0F48091E8007E\r
+:101C8000877F8093E8009093E0010E943B0B809156\r
+:101C9000E001811106C08091E30087FD02C081E070\r
+:101CA00001C084E08093E4010E9485088091E800EF\r
+:101CB00083FF0AC08091E800877F8093E8008091CD\r
+:101CC000EB0080628093EB00AA960FB6F894DEBF1B\r
+:101CD0000FBECDBFDF91CF911F9108950895CF938F\r
+:101CE0008091E4018823A1F0C091E900CF70909128\r
+:101CF000EC00892F817090FD80E8C82B1092E900DC\r
+:101D00008091E80083FD0E941D0DCF70C093E90013\r
+:101D1000CF91089590936901809368010895E091AF\r
+:101D20006801F0916901309721F00190F081E02D78\r
+:101D3000099480E00895E0916801F091690130977D\r
+:101D400021F00280F381E02D09940895E09168016B\r
+:101D5000F0916901309721F00480F581E02D09941C\r
+:101D6000089520916601309167018217930771F001\r
+:101D70009093670180936601E0916801F091690199\r
+:101D8000309721F00680F781E02D09940895209185\r
+:101D90006401309165018217930771F0909365019A\r
+:101DA00080936401E0916801F0916901309721F01E\r
+:101DB0000084F185E02D0994089508950C94DD0EBA\r
+:101DC0000E94F31A0E94A0030C94B91BCF92DF92D9\r
+:101DD000EF92FF920F931F93CF93DF93CDB7DEB7B0\r
+:101DE0002B970FB6F894DEBF0FBECDBF0E94B8038D\r
+:101DF0008BE6C82E81E0D82E00E010E0E02E802F88\r
+:101E00000E94A604F60141916F01F42EF826B1F468\r
+:101E10000F5F1F4F0E30110589F78FEF89838A837B\r
+:101E20001B820E94FC1A8160782F9D838C834981DC\r
+:101E30005A816B818D810E94890F40C09091CD01A4\r
+:101E400091FF04C08B870E94AC048B8520E030E0BA\r
+:101E50004F2D50E0922FBA01022E02C07595679562\r
+:101E60000A94E2F760FF24C02E83EF8221E030E085\r
+:101E7000690102C0CC0CDD1C9A95E2F790E08C2140\r
+:101E80009D21892B09F420E028870E94FC1A81609B\r
+:101E9000782F9A8789874E815F8168858A850E941D\r
+:101EA000890FF801E559FE4F8081C826C08206C01F\r
+:101EB0002F5F3F4F2630310569F6AACF0E94A01E42\r
+:101EC00010916A010E948F0E1817A1F00E948F0EC8\r
+:101ED00080936A012B960FB6F894DEBF0FBECDBF7C\r
+:101EE000DF91CF911F910F91FF90EF90DF90CF90F6\r
+:101EF0000C9488072B960FB6F894DEBF0FBECDBFAB\r
+:101F0000DF91CF911F910F91FF90EF90DF90CF90D5\r
+:101F10000895CF93DF93CDB7DEB72B970FB6F89424\r
+:101F2000DEBF0FBECDBF4F83588769877A878B8707\r
+:101F3000DE01119686E0FD0111928A95E9F785E0B0\r
+:101F4000FE01379601900D928A95E1F749815A81F9\r
+:101F50006B817C818D819E810E94B9162B960FB674\r
+:101F6000F894DEBF0FBECDBFDF91CF9108950895E5\r
+:101F7000CF93882309F4C2C0C82F823859F40E9435\r
+:101F80008F0E81FDBBC089E30E9462190E942F1A47\r
+:101F900089E30CC0833879F40E948F0E80FDAEC0B7\r
+:101FA00083E50E9462190E942F1A83E50E94A419FA\r
+:101FB000CF910C942F1A843859F40E948F0E82FD11\r
+:101FC0009DC087E40E9462190E942F1A87E4EECF19\r
+:101FD0008CEF8C0F813A48F48C2F0E94E320811102\r
+:101FE0008DC08C2F0E946219E3CF80E28C0F883065\r
+:101FF00048F4C77081E001C0880FCA95EAF70E94D3\r
+:10200000E819D6CF8BE58C0F833078F4C53A29F0E8\r
+:10201000C63A31F083E890E005C081E890E002C064\r
+:1020200082E890E0CF910C94B10E88E58C0F83315B\r
+:1020300008F064C0C83A39F1C93A41F1CA3A49F1E5\r
+:10204000CB3A51F1CC3A59F1CD3A61F1C03B69F14B\r
+:10205000CE3A71F1CF3A79F1C13B81F1C23B89F1BE\r
+:10206000C33B91F1C43B99F1C53BA1F1C63BA9F13A\r
+:10207000C73BB1F1C83BB9F1C93BC1F1CA3BC9F19A\r
+:1020800080E090E038C082EE90E035C089EE90E0CC\r
+:1020900032C08AEE90E02FC085EB90E02CC086EB3A\r
+:1020A00090E029C087EB90E026C08CEC90E023C044\r
+:1020B0008DEC90E020C083E891E01DC08AE891E0BB\r
+:1020C0001AC082E991E017C084E991E014C081E26E\r
+:1020D00092E011C083E292E00EC084E292E00BC075\r
+:1020E00085E292E008C086E292E005C087E292E0D5\r
+:1020F00002C08AE292E0CF910C94C70ECF9108956E\r
+:10210000882309F44BC0823859F40E948F0E81FF56\r
+:1021100045C089E30E9462190E942F1A89E30CC00E\r
+:10212000833871F40E948F0E80FF38C083E50E94CF\r
+:1021300062190E942F1A83E50E94A4190C942F1A89\r
+:10214000843859F40E948F0E82FF28C087E40E94D1\r
+:1021500062190E942F1A87E4EFCF9CEF980F913AF3\r
+:1021600058F390E2980F983050F4877091E001C0D6\r
+:10217000990F8A95EAF7892F0E94EE19DFCF9BE528\r
+:10218000980F933020F480E090E00C94B10E885AC0\r
+:10219000833120F480E090E00C94C70E08958823EA\r
+:1021A00021F00E94E8190C942F1A0895882321F039\r
+:1021B0000E94EE190C942F1A0895BF92CF92DF92CD\r
+:1021C000EF92FF920F931F93CF93DF9300D000D035\r
+:1021D00000D0CDB7DEB725E0FC01DE0111960190FD\r
+:1021E0000D922A95E1F7FC01D080118102812581B1\r
+:1021F00022952F7043815481452B09F4FCC21F3F67\r
+:1022000021F4FFEFDF1609F4F6C27C012E830E9451\r
+:10221000B70FD9821A8369817A81802F0E945E1953\r
+:10222000182FB92E0E9413190E94DA172E8100234D\r
+:1022300019F00E94051A2E81EB2DE295EF70F0E067\r
+:10224000E05AFF4F0C9418238B2D807F9B2D9F709D\r
+:10225000F92E882319F0F29480EFF822002389F0F8\r
+:10226000FF2009F475C280E2810F883020F48F2DA1\r
+:102270000E94E81903C08F2D0E94F8190E942F1A9E\r
+:1022800067C2812F0E948010FF2009F4B4C2105E43\r
+:102290008F2D183018F40E94EE1902C00E94FE190A\r
+:1022A00026960FB6F894DEBF0FBECDBFDF91CF915B\r
+:1022B0001F910F91FF90EF90DF90CF90BF900C9403\r
+:1022C0002F1A3B2D307F8B2D8F70303211F082957D\r
+:1022D000807F112319F0113021F12CC00023B9F0B7\r
+:1022E000222309F4A0C1213009F09DC126960FB622\r
+:1022F000F894DEBF0FBECDBFDF91CF911F910F913C\r
+:10230000FF90EF90DF90CF90BF900C94181A22238B\r
+:1023100019F0213009F46FC28E830E941B1A8E813E\r
+:1023200096C1002321F0223008F065C27CC1211142\r
+:1023300062C28DC1002321F0222309F474C108C2B6\r
+:10234000222309F484C119C22B2D269526952370CA\r
+:1023500030E02115310521F021303105D1F04BC29B\r
+:10236000002321F0812F9B2D937002C080E090E02C\r
+:1023700026960FB6F894DEBF0FBECDBFDF91CF918A\r
+:102380001F910F91FF90EF90DF90CF90BF900C9432\r
+:10239000B10E002321F0812F9B2D937002C080E0AD\r
+:1023A00090E026960FB6F894DEBF0FBECDBFDF914A\r
+:1023B000CF911F910F91FF90EF90DF90CF90BF9042\r
+:1023C0000C94C70E812F002319F00E94A81D02C093\r
+:1023D0000E94101E26960FB6F894DEBF0FBECDBF2A\r
+:1023E000DF91CF911F910F91FF90EF90DF90CF90F1\r
+:1023F000BF900C94951E8B2D837009F07BC001114A\r
+:10240000FAC1812F829586958770880F880F912F4A\r
+:102410009F70C92ED12CE12CF12C082E04C0CC0CBD\r
+:10242000DD1CEE1CFF1C0A94D2F714FF12C04FE013\r
+:1024300050E060E070E004C0440F551F661F771F36\r
+:102440008A95D2F7CB01BA016095709580959095E9\r
+:1024500003C060E070E0CB012B2D269526952370FC\r
+:10246000422F50E042305105D9F04330510569F117\r
+:102470006C297D298E299F294130510551F12696DD\r
+:102480000FB6F894DEBF0FBECDBFDF91CF911F9185\r
+:102490000F91FF90EF90DF90CF90BF900C940118B8\r
+:1024A0006C297D298E299F2926960FB6F894DEBFC8\r
+:1024B0000FBECDBFDF91CF911F910F91FF90EF9095\r
+:1024C000DF90CF90BF900C941D180E940118C70197\r
+:1024D000B60126960FB6F894DEBF0FBECDBFDF91D2\r
+:1024E000CF911F910F91FF90EF90DF90CF90BF9011\r
+:1024F0000C94E517002319F08B2D817001C086958F\r
+:10250000882309F478C1812F829586958770880F7A\r
+:10251000880F912F9F70C92ED12CE12CF12C082E01\r
+:1025200004C0CC0CDD1CEE1CFF1C0A94D2F714FF77\r
+:1025300012C04FE050E060E070E004C0440F551F4F\r
+:10254000661F771F8A95D2F7CB01BA016095709507\r
+:102550008095909503C060E070E0CB012B2D26950F\r
+:1025600026952370422F50E042305105D9F0433078\r
+:10257000510569F16C297D298E299F29413051052A\r
+:1025800051F126960FB6F894DEBF0FBECDBFDF9196\r
+:10259000CF911F910F91FF90EF90DF90CF90BF9060\r
+:1025A0000C94DB186C297D298E299F2926960FB65D\r
+:1025B000F894DEBF0FBECDBFDF91CF911F910F9179\r
+:1025C000FF90EF90DF90CF90BF900C94F7180E948F\r
+:1025D000DB18C701B60126960FB6F894DEBF0FBE12\r
+:1025E000CDBFDF91CF911F910F91FF90EF90DF90C2\r
+:1025F000CF90BF900C94BF18103FD1F118F4103E4B\r
+:1026000050F4A1C0123F09F463C008F44CC0133F5A\r
+:1026100009F473C098C01F708B2D8F710023A1F037\r
+:102620000E945818812F26960FB6F894DEBF0FBE71\r
+:10263000CDBFDF91CF911F910F91FF90EF90DF9071\r
+:10264000CF90BF900C94CF100E947918812F2696BE\r
+:102650000FB6F894DEBF0FBECDBFDF91CF911F91B3\r
+:102660000F91FF90EF90DF90CF90BF900C94D61019\r
+:102670000023A9F02111BFC08B2D8F7126960FB6B4\r
+:10268000F894DEBF0FBECDBFDF91CF911F910F91A8\r
+:10269000FF90EF90DF90CF90BF900C949E18223067\r
+:1026A00008F0A9C0E9CF0023A9F08B2D8F712696E1\r
+:1026B0000FB6F894DEBF0FBECDBFDF91CF911F9153\r
+:1026C0000F91FF90EF90DF90CF90BF900C9458182F\r
+:1026D000002359F38B2D8F7126960FB6F894DEBF29\r
+:1026E0000FBECDBFDF91CF911F910F91FF90EF9063\r
+:1026F000DF90CF90BF900C947918002399F08B2D28\r
+:102700008F7126960FB6F894DEBF0FBECDBFDF9156\r
+:10271000CF911F910F91FF90EF90DF90CF90BF90DE\r
+:102720000C94431826960FB6F894DEBF0FBECDBFAB\r
+:10273000DF91CF911F910F91FF90EF90DF90CF909D\r
+:10274000BF900C9439180023A9F0222309F4ADCFCF\r
+:10275000812F26960FB6F894DEBF0FBECDBFDF9156\r
+:10276000CF911F910F91FF90EF90DF90CF90BF908E\r
+:102770000C94B80F222309F4ADCF812F26960FB603\r
+:10278000F894DEBF0FBECDBFDF91CF911F910F91A7\r
+:10279000FF90EF90DF90CF90BF900C9480104B2D66\r
+:1027A0004F70612FC7010E94550226960FB6F8940C\r
+:1027B000DEBF0FBECDBFDF91CF911F910F91FF9074\r
+:1027C000EF90DF90CF90BF900C945D174B2D4F7022\r
+:1027D000612FC70126960FB6F894DEBF0FBECDBF9E\r
+:1027E000DF91CF911F910F91FF90EF90DF90CF90ED\r
+:1027F000BF900C94AD0426960FB6F894DEBF0FBEC2\r
+:10280000CDBFDF91CF911F910F91FF90EF90DF909F\r
+:10281000CF90BF9008950E94051A0E94151A0E9439\r
+:10282000DA190E942F1A0E94461F0E94951E80E00E\r
+:1028300090E00E94B10E80E090E00C94C70E0E94E0\r
+:10284000F5190C940B140E945319292F22952F70FF\r
+:1028500030E02C3031054CF42A3031056CF4225034\r
+:1028600031092230310588F407C02C30310549F098\r
+:102870002F30310531F009C0803E48F0803F29F407\r
+:1028800006C093FB882780F9089580E0089581E0D1\r
+:102890000895CF93DF9300D000D01F92CDB7DEB75D\r
+:1028A0000F900F900F900F900F90DF91CF910895A0\r
+:1028B000CF93DF9300D000D000D0CDB7DEB72696FF\r
+:1028C0000FB6F894DEBF0FBECDBFDF91CF91089554\r
+:1028D0001F93CF93DF93C091790116E080917A0125\r
+:1028E000C81799F0D0E01C9FF0011D9FF00D112436\r
+:1028F000E558FE4F408151816281738184819581C9\r
+:102900000E9458142196C770E9CFDF91CF911F9193\r
+:1029100008954091AB015091AC016091AD0170916F\r
+:10292000AE018091AF019091B0010C945814809148\r
+:10293000B00182958F7009F054C08091AD01882359\r
+:1029400009F44FC080917901A0917A016091AB01A7\r
+:102950007091AC014091AE015091AF01B6E08A1781\r
+:1029600009F43FC090E041155105C1F17F3F11F4DA\r
+:102970006F3FA1F1B89FF001B99FF00D1124E55808\r
+:10298000FE4F218172132AC02081621327C0228149\r
+:10299000211124C0238134812417350710F42150DC\r
+:1029A0003109241B350B283C3105C0F42091B001BE\r
+:1029B0002F7020612093B00126E0289FF001299F0D\r
+:1029C000F00D1124E058FE4F80818F70806180836C\r
+:1029D0008BEA91E00E94DD100C94681401968770D8\r
+:1029E000BECF0895CF92DF92EF92FF920F931F9385\r
+:1029F000CF93DF93CDB7DEB762970FB6F894DEBF03\r
+:102A00000FBECDBF8C0185E0F801DE011D9601905F\r
+:102A10000D928A95E1F7D8014C9111965C9111972E\r
+:102A200012966C9112971396CD90DC90149730917A\r
+:102A3000AB017091AC018091AE019091AF01009714\r
+:102A400009F46BC17F3F19F43F3F09F466C1E09080\r
+:102A5000AD01EE2009F4C0C02091B001C816D9061E\r
+:102A600028F0F601E81BF90BCF0104C08095909582\r
+:102A70008C0D9D1DFF24F394883C910578F0F12C7A\r
+:102A8000207F09F0C6C07C2DD98AC88A89890E9416\r
+:102A900049148BEA91E00E94DD10B1C0822F807F43\r
+:102AA00009F046C0751314C0341312C0611110C070\r
+:102AB0002F7020612093B0010E9489148BEA91E06D\r
+:102AC0000E94DD108091B001D80115968C932EC024\r
+:102AD000CD2819F15F3F11F44F3FF9F0F62E611147\r
+:102AE0001CC08091790120917A0136E0821709F4A7\r
+:102AF0005AC090E0389FF001399FF00D1124E5583D\r
+:102B0000FE4F7181571306C07081471303C0728155\r
+:102B1000711103C001968770E9CFF62E662309F480\r
+:102B200018C18091B00181608093B001F12C11C176\r
+:102B3000751308C0341306C0611104C08091B00140\r
+:102B4000D801C3C04D875E878D859E856A8B0E94A4\r
+:102B500023146A898823E1F16623D1F12091B00121\r
+:102B6000822F82958F7090E0029774F08091AB0174\r
+:102B70009091AC0198878F831986DB86CA862C8753\r
+:102B8000CE0107960E94DD1086E0F801ABEAB1E0C5\r
+:102B900001900D928A95E1F70E9497140E94891482\r
+:102BA000FF24F394D6C04D875E878D859E850E9455\r
+:102BB0005319292F22952F7030E0223031050CF067\r
+:102BC000BCC09F7009F0B6C0805E883008F4C1C0F8\r
+:102BD000C8010E94DD10E4CFC816D90608F453C01E\r
+:102BE000F601E81BF90BCF01883C910508F450C0B1\r
+:102BF000F12C7C2DD98AC88A89890E944914EBEA74\r
+:102C0000F1E086E0DF011D928A95E9F70E948914C0\r
+:102C1000A0C0751314C0341312C0611110C080918C\r
+:102C2000B001F8018583C8010E94DD1086E0EBEA5F\r
+:102C3000F1E0DF011D928A95E9F7FE2C8AC04D87ED\r
+:102C40005E878D859E856A8B0E9423146A898823FE\r
+:102C500009F4BECF662309F4BBCF2091B001822FC7\r
+:102C600082958F7090E002970CF48ECF8091AB012B\r
+:102C70009091AC019A8389831B82DD82CC822E8362\r
+:102C8000CE0101967FCF809590958C0D9D1DACCF88\r
+:102C9000F62E662309F49CCF75132EC034132CC076\r
+:102CA0002091B00120FD1FC0822F82958F70D9F036\r
+:102CB000D80115962C9315978F3049F08F5F982F78\r
+:102CC0009295907F822F8F70892B15968C93C801D7\r
+:102CD0000E94DD1086E0F801ABEAB1E001900D92B0\r
+:102CE0008A95E1F793CF86E0F801ABEAB1E0019075\r
+:102CF0000D928A95E1F72DC04D875E878D859E8563\r
+:102D00000E942314811140CF8091B0018160809393\r
+:102D1000B001C8010E94DD101CC0662309F458CF21\r
+:102D20004D875E878D859E850E942314882309F434\r
+:102D30004FCF2ACF811148CF0CC0243031050CF081\r
+:102D400047CF9F7009F440CFF8019581907F09F03B\r
+:102D50003BCF8F2D62960FB6F894DEBF0FBECDBF6E\r
+:102D6000DF91CF911F910F91FF90EF90DF90CF9067\r
+:102D700008951F93CF93DF93CDB7DEB72C970FB68F\r
+:102D8000F894DEBF0FBECDBF4F83588769877A871F\r
+:102D90008B879C87CE0107960E94F214882369F0E6\r
+:102DA0008F8198852A853B85232BF1F19F3F09F080\r
+:102DB00063C08F3F09F060C037C086E0FE013796E0\r
+:102DC000DE01119601900D928A95E1F76F81788569\r
+:102DD000EA85FB85309741F17F3F11F46F3F21F188\r
+:102DE00020917A0130E0C9010196877099274091BE\r
+:102DF000790150E08417950709F447C069837A8305\r
+:102E0000FD83EC8396E0929FD001939FB00D112437\r
+:102E1000A558BE4FFE01319601900D929A95E1F7AB\r
+:102E200080937A010E94681416E080917901909154\r
+:102E30007A018917C1F1189FC001112485589E4F4E\r
+:102E40000E94F214882379F1E09179011E9FF0012C\r
+:102E50001124E558FE4F4081518162817381848144\r
+:102E600095810E9458148091790190E001968770B5\r
+:102E7000992780937901D9CF4F81588569857A85C3\r
+:102E80008B859C850E945814CFCF0E941F141092EE\r
+:102E90007A0110927901EBEAF1E086E0DF011D9200\r
+:102EA0008A95E9F7C1CF2C960FB6F894DEBF0FBE16\r
+:102EB000CDBFDF91CF911F910895EF92FF920F93B5\r
+:102EC0001F93CF93DF938C01892B09F46CC0F12CF5\r
+:102ED000EE24E394E8012196F8018491843740F4CC\r
+:102EE000843008F051C0813081F0823019F15BC02C\r
+:102EF000853709F444C0A8F19CE7980F903708F093\r
+:102F000052C08F770E94801041C00E5F1F4FFE019C\r
+:102F1000C49180E28C0F883048F4C7708E2D01C0B8\r
+:102F2000880FCA95EAF70E94081A14C08C2F0E94D5\r
+:102F3000B80F2DC00E5F1F4FFE01C49180E28C0FB1\r
+:102F4000883058F4C7708E2D01C0880FCA95EAF7F3\r
+:102F50000E940E1A0E942F1A1AC08C2F0E948010F5\r
+:102F600016C00E5F1F4FFE01C491CC2381F08FE984\r
+:102F70009FE00197F1F700C00000C150F6CF0E5F4F\r
+:102F80001F4FFE01F49003C00E94B80F8E018F2DD9\r
+:102F9000882309F49FCFEFE9FFE03197F1F700C0F4\r
+:102FA00000008150F5CFDF91CF911F910F91FF90DD\r
+:102FB000EF90089508956093B5017093B6018093E2\r
+:102FC000B7019093B8010C940B140F931F930091C9\r
+:102FD000B5011091B6012091B7013091B801DC0123\r
+:102FE000CB01802B912BA22BB32B8093B501909317\r
+:102FF000B601A093B701B093B8011F910F910C9443\r
+:103000000B140F931F930091B5011091B6012091FD\r
+:10301000B7013091B801DC01CB0180239123A223B9\r
+:10302000B3238093B5019093B601A093B701B093F9\r
+:10303000B8011F910F910C940B140F931F930091E3\r
+:10304000B5011091B6012091B7013091B801DC01B2\r
+:10305000CB0180279127A227B3278093B5019093B6\r
+:10306000B601A093B701B093B8011F910F910C94D2\r
+:103070000B141092B1011092B2011092B301109290\r
+:10308000B4010C940B1441E050E060E070E004C027\r
+:10309000440F551F661F771F8A95D2F74093B101E1\r
+:1030A0005093B2016093B3017093B4010C940B146C\r
+:1030B00041E050E060E070E004C0440F551F661F1F\r
+:1030C000771F8A95D2F78091B1019091B201A091BA\r
+:1030D000B301B091B401482B592B6A2B7B2B409341\r
+:1030E000B1015093B2016093B3017093B4010C9499\r
+:1030F0000B1441E050E060E070E004C0440F551F45\r
+:10310000661F771F8A95D2F7409550956095709508\r
+:103110008091B1019091B201A091B301B091B4013D\r
+:10312000482359236A237B234093B1015093B20172\r
+:103130006093B3017093B4010C940B1441E050E020\r
+:1031400060E070E004C0440F551F661F771F8A952A\r
+:10315000D2F78091B1019091B201A091B301B091E9\r
+:10316000B401482759276A277B274093B101509320\r
+:10317000B2016093B3017093B4010C940B140F93DC\r
+:103180001F930091B1011091B2012091B3013091D0\r
+:10319000B401DC01CB01802B912BA22BB32B8093AC\r
+:1031A000B1019093B201A093B301B093B4011F9108\r
+:1031B0000F910C940B140F931F930091B101109178\r
+:1031C000B2012091B3013091B401DC01CB01802325\r
+:1031D0009123A223B3238093B1019093B201A093D2\r
+:1031E000B301B093B4011F910F910C940B140F9382\r
+:1031F0001F930091B1011091B2012091B301309160\r
+:10320000B401DC01CB0180279127A227B32780934B\r
+:10321000B1019093B201A093B301B093B4011F9197\r
+:103220000F910C940B140895CF92DF92EF92FF92BE\r
+:103230000F931F93CF93DF938C01C090B501D09073\r
+:10324000B601E090B701F090B8018091B101909182\r
+:10325000B201A091B301B091B401C82AD92AEA2AD7\r
+:10326000FB2ACFE1D0E0D701C6010C2E04C0B695F1\r
+:10327000A795979587950A94D2F780FF06C0B80165\r
+:103280008C2F0E94ED06019721F4219760F780E0D2\r
+:1032900001C08C2FDF91CF911F910F91FF90EF9084\r
+:1032A000DF90CF900895CF93DF93EC010E94141923\r
+:1032B000BE010E94ED06DF91CF910895CB010E94DF\r
+:1032C0005319089590910C01992321F090910D01CB\r
+:1032D000911109C020910E0130910F01F901329630\r
+:1032E0009FEF40E01FC0982F9695969596959F303A\r
+:1032F00050F5E0910E01F0910F01E90FF11D87707B\r
+:1033000021E030E0A90102C0440F551F8A95E2F781\r
+:10331000CA019181892B818308959F3F39F04F5FC6\r
+:103320004E3041F051915813F8CF0DC05111F7CFE5\r
+:10333000942FF5CF9F3F39F0F901E90FF11D97FD6B\r
+:10334000FA9582830895089590910C01992321F0B4\r
+:1033500090910D01911109C020910E0130910F0142\r
+:10336000F9013296205F3F4F1FC0982F9695969592\r
+:1033700096959F30F0F4E0910E01F0910F01E90F66\r
+:10338000F11D877021E030E0A90102C0440F551FF4\r
+:103390008A95E2F7CA0180959181892381830895F6\r
+:1033A0003196E217F30729F090819813F9CF108234\r
+:1033B000F7CF089581E090E0E0910E01F0910F01C8\r
+:1033C000E80FF91F1082019680319105A9F7089541\r
+:1033D0009091CC01892B8093CC0108958095909198\r
+:1033E000CC0189238093CC0108951092CC010895DB\r
+:1033F0009091CB01892B8093CB010895809590917A\r
+:10340000CB0189238093CB0108951092CB010895BD\r
+:103410009091CA01892B8093CA010895809590915B\r
+:10342000CA0189238093CA0108951092CA010895A0\r
+:103430008093B90108951092B901089580910E0109\r
+:1034400090910F01FC0131969C01205F3F4F80E07D\r
+:10345000919191118F5FE217F307D1F70895E091F1\r
+:103460000E01F0910F018091CC018083E0910E015B\r
+:10347000F0910F0190818091CB01892B8083E091A5\r
+:103480000E01F0910F0190818091CA01892B8083F8\r
+:103490008091B901882361F0E0910E01F0910F0154\r
+:1034A0009081892B80830E941E1A81111092B9018C\r
+:1034B00080910E0190910F010C949B0ECF92DF92A0\r
+:1034C000EF92FF926C01EE24FF24C114D104E104B9\r
+:1034D000F10421F0C701B60120E101C020E0C72EB0\r
+:1034E000D82EE92EFF24C114D104E104F10419F00F\r
+:1034F000285FC701B6016B017C0154E0F694E794A4\r
+:10350000D794C7945A95D1F7C114D104E104F104BA\r
+:1035100019F02C5FC701B6016B017C0142E0F69403\r
+:10352000E794D794C7944A95D1F7C114D104E10424\r
+:10353000F10419F02E5FC701B601DC01CB01B6958D\r
+:10354000A79597958795892B8A2B8B2B09F02F5F51\r
+:10355000822FFF90EF90DF90CF9008958091E4014B\r
+:10356000843021F11092CE0120E488E190E00FB682\r
+:10357000F894A895809360000FBE2093600080E0CF\r
+:103580000E94880783B7817F846083BF83B781608F\r
+:1035900083BF7894889583B78E7F83BF88E10FB609\r
+:1035A000F89480936000109260000FBE0895089513\r
+:1035B0000895CF930E94D71A0E94B8030E94D81A88\r
+:1035C000C0E08C2F0E94A604811104C0CF5FCE30D2\r
+:1035D000C1F701C081E0CF9108950E941F140E949D\r
+:1035E0008F0E0C94880782E084BD93E095BD9AEF1E\r
+:1035F00097BD80936E0008952FB7F8948091CF0106\r
+:103600009091D001A091D101B091D2012FBF089526\r
+:10361000CF92DF92EF92FF920F931F932FB7F89400\r
+:103620004091CF015091D0016091D1017091D201B0\r
+:103630002FBF6A017B01EE24FF248C0120E030E0E3\r
+:10364000C016D106E206F30610F4415051099A0162\r
+:10365000281B390BC9011F910F91FF90EF90DF904C\r
+:10366000CF9008951F920F920FB60F9211248F934F\r
+:103670009F93AF93BF938091CF019091D001A09180\r
+:10368000D101B091D2010196A11DB11D8093CF014E\r
+:103690009093D001A093D101B093D201BF91AF918B\r
+:1036A0009F918F910F900FBE0F901F9018950E94C1\r
+:1036B0008C0BF8942FEF87EA91E6215080409040E0\r
+:1036C000E1F700C0000087E090EBDC018093EE01A1\r
+:1036D0009093EF01A093F001B093F1019CE088E199\r
+:1036E0000FB6F894A895809360000FBE9093600089\r
+:1036F000FFCFEF92FF920F931F93CF93DF93D82FBB\r
+:10370000C0E08C2F0E94A60400E010E0E82EF12C0F\r
+:10371000C701002E02C0959587950A94E2F780FDB7\r
+:1037200006C00F5F1F4F0630110591F709C0602FCB\r
+:103730007C2F80E00E94AE04D813F3CF81E004C058\r
+:10374000CF5FCE30F1F680E0DF91CF911F910F91E6\r
+:10375000FF90EF900895CF93C82F8CE20E94791BC1\r
+:10376000882321F08C2FCF910C94791B80E0CF918E\r
+:103770000895CF930E94001D811102C00E94E61C93\r
+:10378000C5E6C15049F00E94B8038FE39CE9019758\r
+:10379000F1F700C00000F5CF89E20E94AB1B811158\r
+:1037A00013C18AE20E94AB1B81110E94E61C85E0D6\r
+:1037B0000E94AB1B81110E94571B0E940B1D80931E\r
+:1037C000CD0187E00E94AB1B8823A9F18BE10E9409\r
+:1037D000AB1B882351F08091CD0181FB222720F97A\r
+:1037E00091E0922790FB81F90EC08EE00E94AB1B06\r
+:1037F000882361F08091CD0182FB222720F991E09E\r
+:10380000922790FB82F98093CD0115C080E10E9440\r
+:10381000AB1B9091CD01882341F093FB222720F927\r
+:1038200081E0822780FB93F904C0892F809580FB7B\r
+:1038300090F99093CD018091CD010E940F1D0E94BF\r
+:103840001D1D8093ED0180EE0E94AB1B882341F08B\r
+:103850008091ED01982F909590FB80F98093ED0178\r
+:1038600089E30E94AB1B882359F08091ED0181FB15\r
+:10387000222720F991E0922790FB81F98093ED01B6\r
+:1038800082EE0E94AB1B882359F08091ED0182FBF0\r
+:10389000222720F991E0922790FB82F98093ED0195\r
+:1038A00086EE0E94AB1B882359F08091ED0183FBCB\r
+:1038B000222720F991E0922790FB83F98093ED0174\r
+:1038C00083EE0E94AB1B882359F08091ED0184FBAD\r
+:1038D000222720F991E0922790FB84F98093ED0153\r
+:1038E00085E30E94AB1B882359F08091ED0185FB95\r
+:1038F000222720F991E0922790FB85F98093ED0132\r
+:1039000081E30E94AB1B882359F08091ED0186FB77\r
+:10391000222720F991E0922790FB86F98093ED0110\r
+:1039200081E10E94AB1B882359F08091ED0187FB58\r
+:10393000222720F991E0922790FB87F98093ED01EF\r
+:103940008091ED010E94211D8091ED0187FB882768\r
+:1039500080F980930D0187E20E94AB1BC82F8EE196\r
+:103960000E94AB1B8111C2608FE10E94AB1B8111D1\r
+:10397000C46080E20E94AB1B8111C86081E20E949A\r
+:10398000AB1B8111C06182E20E94AB1B8111C0623E\r
+:1039900083E20E94AB1B8111C06484E20E94AB1BD6\r
+:1039A000882311F0C06802C0CC2329F08C2F0E941C\r
+:1039B000181D6C2F03C00E94141D682F70E080E05A\r
+:1039C00090E0CF910C94DB17CF9108956DEE7EEFD0\r
+:1039D00080E090E00E94522360E082E090E00E944C\r
+:1039E000402360E083E090E00E94402360E084E0B8\r
+:1039F00090E00E94402360E085E090E00C9440233A\r
+:103A000080E090E00E943A2321E08D3E9E4F09F035\r
+:103A100020E0822F089582E090E00C943223682FFA\r
+:103A200082E090E00C94402383E090E00C943223F9\r
+:103A3000682F83E090E00C94402384E090E00C94A5\r
+:103A40003223682F84E090E00C9440238091D501CC\r
+:103A500080FF0BC06091130185E0689FB0011124C5\r
+:103A600075956795759567952BC081FF09C0609125\r
+:103A7000130185E0689FB00111247595679520C0FA\r
+:103A800082FF07C06091130185E0689FB001112497\r
+:103A900017C09091D6019923D1F060911201961729\r
+:103AA00088F72091130185E0289F90011124929FAF\r
+:103AB000A001939F500D112470E0CA010E940423BD\r
+:103AC0006038710540F46115710539F002C065E098\r
+:103AD00070E0862F08958FE7089581E00895809122\r
+:103AE000D50180FF08C06091110170E07595679560\r
+:103AF0007595679521C081FF06C06091110170E046\r
+:103B00007595679519C082FF04C06091110170E03E\r
+:103B100010C09091D6019923C1F0609110019617C1\r
+:103B2000A0F780911101899FC001112470E00E94CB\r
+:103B300004236038710528F46115710521F0862F82\r
+:103B400008958FE7089581E0089561E070E0F4CF73\r
+:103B5000803F21F40E94261D819504C0813F29F4F5\r
+:103B60000E94261D8093D9010895823F21F40E946E\r
+:103B7000261D819504C0833F29F40E94261D809351\r
+:103B8000D8010895893F19F40E946F1D05C08A3F2E\r
+:103B900031F40E946F1D81958093DA0108958B3F67\r
+:103BA00021F40E946F1D819504C08C3F29F40E946E\r
+:103BB0006F1D8093DB010895843F21F48091D7012C\r
+:103BC000816017C0853F21F48091D701826011C0C8\r
+:103BD000863F21F48091D70184600BC0873F21F498\r
+:103BE0008091D701886005C0883F31F48091D7016A\r
+:103BF00080618093D70108958D3F21F48091D50194\r
+:103C000081600BC08E3F21F48091D501826005C098\r
+:103C10008F3F29F48091D50184608093D501089568\r
+:103C2000803F39F48091D90187FF6CC01092D9018F\r
+:103C300069C0813F29F48091D9011816BCF362C094\r
+:103C40009091D801823F29F497FF5CC01092D8016F\r
+:103C500059C0833F19F41916CCF354C0893F41F47D\r
+:103C60008091DA0118160CF04DC01092DA014AC0AA\r
+:103C70008A3F29F48091DA0187FF44C0F6CF8B3F59\r
+:103C800039F48091DB0187FF3DC01092DB013AC01F\r
+:103C90008C3F29F48091DB011816BCF333C0843FBC\r
+:103CA00021F48091D7018E7F17C0853F21F4809148\r
+:103CB000D7018D7F11C0863F21F48091D7018B7F82\r
+:103CC0000BC0873F21F48091D701877F05C0883FD3\r
+:103CD00031F48091D7018F7E8093D70113C08D3F3F\r
+:103CE00021F48091D5018E7F0BC08E3F21F480910D\r
+:103CF000D5018D7F05C08F3F29F48091D5018B7F41\r
+:103D00008093D5018091D80181110EC08091D90195\r
+:103D100081110AC08091DA01811106C08091DB0116\r
+:103D2000811102C01092D601089587ED91E00E94A2\r
+:103D3000A60E0E94FC1A9093D4018093D30108959B\r
+:103D40001F93CF93DF938091D3019091D4010E9470\r
+:103D5000081BAC019091D601992321F02091140108\r
+:103D600030E006C0209115018AE0289F90011124BF\r
+:103D70004217530708F486C08091D801C091D90139\r
+:103D8000D091DA011091DB01811107C0C11176C019\r
+:103D9000D11174C0111172C075C09F3F19F09F5F9F\r
+:103DA0009093D601181624F40E94261D8093D80102\r
+:103DB0008091D80187FF05C00E94261D81958093C0\r
+:103DC000D8011C1624F40E94261D8093D9018091ED\r
+:103DD000D90187FF05C00E94261D81958093D901D6\r
+:103DE0006091D801662339F1C091D901CC2319F132\r
+:103DF000772767FD7095872F972F0E94152223E361\r
+:103E000033E343E35FE30E9479220E94E22160935F\r
+:103E1000D8016C2F772767FD7095872F972F0E9409\r
+:103E2000152223E333E343E35FE30E9479220E94F8\r
+:103E3000E2216093D9011D1624F40E946F1D809326\r
+:103E4000DA018091DA0187FF05C00E946F1D81951C\r
+:103E50008093DA01111624F40E946F1D8093DB0118\r
+:103E60008091DB0187FF05C00E946F1D81958093C3\r
+:103E7000DB01DF91CF911F910C94951E9F3F09F0BC\r
+:103E80008ECF96CFDF91CF911F910895E7EDF1E0AE\r
+:103E900085E0DF011D928A95E9F71092D601109214\r
+:103EA000D5010895833081F128F4813059F08230B2\r
+:103EB000D1F00895853009F449C0B8F1863009F48D\r
+:103EC00056C0089580911501262F30E0280F311D2E\r
+:103ED0002F3F310524F4680F6093150108958FEF8B\r
+:103EE00080931501089580911401262F30E0280F4A\r
+:103EF000311D2F3F310524F4680F6093140108959C\r
+:103F00008FEF80931401089580911301262F30E0E4\r
+:103F1000280F311D2F3F310524F4680F60931301E2\r
+:103F200008958FEF80931301089580911201262F39\r
+:103F300030E0280F311D2F3F310524F4680F6093C6\r
+:103F4000120108958FEF809312010895809111015D\r
+:103F5000262F30E0280F311D2F3F310524F4680F44\r
+:103F60006093110108958FEF80931101089580915E\r
+:103F70001001262F30E0280F311D2F3F310524F48A\r
+:103F8000680F6093100108958FEF809310010895DA\r
+:103F9000833011F128F4813049F0823091F0089596\r
+:103FA000853081F120F18630C1F1089580911501AD\r
+:103FB000681720F4861B809315010895109215014F\r
+:103FC000089580911401681720F4861B80931401D2\r
+:103FD000089510921401089580911301681720F438\r
+:103FE000861B809313010895109213010895809108\r
+:103FF0001201681720F4861B809312010895109215\r
+:104000001201089580911101681720F4861B809396\r
+:1040100011010895109211010895809110016817FF\r
+:1040200020F4861B809310010895109210010895CA\r
+:104030000F931F938D3109F46BC008F03FC08E3091\r
+:1040400009F47FC0C0F4873009F469C068F4863091\r
+:1040500009F0B1C08091CD01817F8E7F8093CD0129\r
+:1040600081E08093DD01A8C0883009F4A2C08B30C4\r
+:1040700009F49FC0A0C0863109F49BC078F4803158\r
+:1040800009F472C0813109F096C00E941F1490910A\r
+:104090000D0181E0892780930D018BC0893109F4DE\r
+:1040A00088C08B3109F087C08091CD0181FB222728\r
+:1040B00020F991E0922790FB81F94CC0853309F4F7\r
+:1040C00070C048F4873209F46CC008F459C08932D2\r
+:1040D00009F467C070C0833438F48A3308F04EC0E6\r
+:1040E000883309F466C067C0833409F45AC0883441\r
+:1040F00009F061C00E941F140FEF13ED20E301507F\r
+:1041000010402040E1F700C000000E94571B51C042\r
+:104110000E949C210E948F0E0E9488074AC09091A5\r
+:10412000CD01892F8095817080FB90F929F09660F0\r
+:1041300098609093CD0140C0997F977F9093CD0177\r
+:1041400038C08091CD0182FB222720F991E092278F\r
+:1041500090FB82F98093CD01992359F18091CD0193\r
+:1041600081608093CD0125C08091CD0183FB222702\r
+:1041700020F991E0922790FB83F9ECCF895301C09D\r
+:104180008D5141E050E060E070E08A019B0104C085\r
+:10419000000F111F221F331F8A95D2F7C901B801E2\r
+:1041A00004C061E070E080E090E00E94DB170E94B4\r
+:1041B0001F1481E001C080E01F910F91089580E0FD\r
+:1041C000089580E00895CF93C82F8091DD0181305C\r
+:1041D00079F018F08230E9F187C0E0910E01F0919A\r
+:1041E0000F018081813169F0823209F07FC009C0FE\r
+:1041F000E0910E01F0910F018081813111F0823246\r
+:1042000061F48C2F0E94DF20811104C08C2F0E944A\r
+:1042100018201DC081E090E01AC08C2F0E94E12080\r
+:10422000811114C0C43179F048F4CB3079F0C03139\r
+:1042300009F060C082E08093DD0108C0C93219F046\r
+:10424000C83321F057C01092DD0154C081E0817065\r
+:1042500053C0C93289F118F5C43171F1A8F4C730DF\r
+:1042600009F046C08AE08093150194E1909314010F\r
+:1042700093E0909313018093120188E080931101E1\r
+:1042800088E28093100134C0CE51C63088F5EC2FFF\r
+:10429000F0E0E65DFE4F80818093DC0129C0CE34E2\r
+:1042A000E9F020F4CB3421F56AE013C0C13579F090\r
+:1042B000C235F1F461E00DC08091DC01882319F072\r
+:1042C0001092DC0115C081E08093DD0115C061E032\r
+:1042D00006C08091DC010E94521F0AC06AE08091F2\r
+:1042E000DC010E94C81F04C01092DD0180E004C000\r
+:1042F00081E002C080E0ABCFCF910895E1E8F0E02B\r
+:104300008081886080838081816080838FB7F8940A\r
+:1043100093E09093890090ED909388008FBF08956B\r
+:10432000EFE6F0E08081826080830895EFE6F0E0C0\r
+:1043300080818D7F80830895EFE6F0E0908182E0B8\r
+:104340008927808308951F920F920FB60F92112430\r
+:104350002F933F934F935F936F937F938F939F938D\r
+:10436000AF93BF93EF93FF938091DE019091DF01B4\r
+:1043700001969093DF018093DE01811103C082E0FA\r
+:104380000E948807E091DF01E695E695F0E0E252B1\r
+:10439000FC4FE4918091DE018E1303C080E00E9407\r
+:1043A0008807FF91EF91BF91AF919F918F917F917E\r
+:1043B0006F915F914F913F912F910F900FBE0F9092\r
+:1043C0001F90189504D06894B1118DC0089570D0D5\r
+:1043D00088F09F5790F0B92F9927B751A0F0D1F0EE\r
+:1043E000660F771F881F991F1AF0BA95C9F712C078\r
+:1043F000B13081F077D0B1E0089574C0672F782F85\r
+:104400008827B85F39F0B93FCCF3869577956795E3\r
+:10441000B395D9F73EF490958095709561957F4F4F\r
+:104420008F4F9F4F0895E89409C097FB3EF49095F5\r
+:104430008095709561957F4F8F4F9F4F9923A9F07D\r
+:10444000F92F96E9BB279395F6958795779567950C\r
+:10445000B795F111F8CFFAF4BB0F11F460FF1BC050\r
+:104460006F5F7F4F8F4F9F4F16C0882311F096E9E3\r
+:1044700011C0772321F09EE8872F762F05C0662391\r
+:1044800071F096E8862F70E060E02AF09A95660F4A\r
+:10449000771F881FDAF7880F9695879597F9089503\r
+:1044A00057FD9058440F551F59F05F3F71F04795E5\r
+:1044B000880F97FB991F61F09F3F79F087950895CA\r
+:1044C000121613061406551FF2CF4695F1DF08C0E9\r
+:1044D000161617061806991FF1CF86957105610506\r
+:1044E00008940895E894BB2766277727CB0197F9AE\r
+:1044F00008950BD078C069D028F06ED018F09523BD\r
+:1045000009F05AC05FC01124EECFCADFA0F3959F17\r
+:10451000D1F3950F50E0551F629FF001729FBB27AA\r
+:10452000F00DB11D639FAA27F00DB11DAA1F649F56\r
+:104530006627B00DA11D661F829F2227B00DA11D09\r
+:10454000621F739FB00DA11D621F839FA00D611D8F\r
+:10455000221F749F3327A00D611D231F849F600DB0\r
+:10456000211D822F762F6A2F11249F5750408AF0E9\r
+:10457000E1F088234AF0EE0FFF1FBB1F661F771F75\r
+:10458000881F91505040A9F79E3F510570F014C00C\r
+:10459000AACF5F3FECF3983EDCF38695779567955D\r
+:1045A000B795F795E7959F5FC1F7FE2B880F911D93\r
+:1045B0009695879597F9089597F99F6780E870E039\r
+:1045C00060E008959FEF80EC089500240A94161689\r
+:1045D000170618060906089500240A9412161306F1\r
+:1045E000140605060895092E0394000C11F488237F\r
+:1045F00052F0BB0F40F4BF2B11F460FF04C06F5F9B\r
+:104600007F4F8F4F9F4F089597FB072E16F400940E\r
+:1046100007D077FD09D00E941E2307FC05D03EF489\r
+:10462000909581959F4F0895709561957F4F08955E\r
+:10463000EE0FFF1F0590F491E02D0994AA1BBB1B00\r
+:1046400051E107C0AA1FBB1FA617B70710F0A61B92\r
+:10465000B70B881F991F5A95A9F780959095BC01B3\r
+:10466000CD010895F999FECF92BD81BDF89A9927A1\r
+:1046700080B50895A8E1B0E042E050E00C945A23E0\r
+:10468000262FF999FECF92BD81BDF89A019700B40B\r
+:10469000021639F01FBA20BD0FB6F894FA9AF99AAB\r
+:1046A0000FBE08950196272F0E9441230C944023AA\r
+:1046B000DC01CB01FC01F999FECF06C0F2BDE1BDE2\r
+:1046C000F89A319600B40D9241505040B8F70895D1\r
+:0446D000F894FFCF8C\r
+:1046D40020028A071808F507C1078D070101BA01EE\r
+:1046E40028080A03140A3F4D36399F0352031C035A\r
+:1046F400E30276028F02A802C10201020304050646\r
+:044704000708090099\r
+:00000001FF\r
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.png b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.png
new file mode 100644 (file)
index 0000000..34762ec
Binary files /dev/null and b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.png differ
diff --git a/keyboard/ergodox_ez/keymaps/sneako/README.md b/keyboard/ergodox_ez/keymaps/sneako/README.md
new file mode 100644 (file)
index 0000000..8dd110e
--- /dev/null
@@ -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.
diff --git a/keyboard/ergodox_ez/keymaps/sneako/keymap.c b/keyboard/ergodox_ez/keymaps/sneako/keymap.c
new file mode 100644 (file)
index 0000000..0c68631
--- /dev/null
@@ -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;
+    }
+
+};
diff --git a/keyboard/ergodox_ez/keymaps/sneako/sneako.hex b/keyboard/ergodox_ez/keymaps/sneako/sneako.hex
new file mode 100644 (file)
index 0000000..1db1728
--- /dev/null
@@ -0,0 +1,1152 @@
+:100000000C9465020C94A9020C94A9020C94A90208\r
+:100010000C94A9020C94A9020C94A9020C94A902B4\r
+:100020000C94A9020C94A9020C94720C0C94440D2B\r
+:100030000C94A9020C94A9020C94A9020C94A90294\r
+:100040000C94A9020C940E220C94A9020C94A902FF\r
+:100050000C94A9020C949D1B0C94A9020C94A90267\r
+:100060000C94A9020C94A9020C94A9020C94A90264\r
+:100070000C94A9020C94A9020C94A9020C94A90254\r
+:100080000C94A9020C94A9020C94A9020C94A90244\r
+:100090000C94A9020C94A9020C94A9020C94A90234\r
+:1000A0000C94A9020C94A9020C94A902B10DD30DD1\r
+:1000B000C10ED30DC10E180E3B0EC10E900EA30E35\r
+:1000C0008F118F11CC11CC110F124D1266146614C2\r
+:1000D00066126614671367133A1466146614511493\r
+:1000E0000000F0A12E004C002971E10035810000D4\r
+:1000F0001E00140004001D0034004D001F001A00F3\r
+:1001000016001B00E1042A0020000800070006007A\r
+:1001100050002C0021001500090019004F004A0072\r
+:10012000220017000A000500000065745000015409\r
+:100130000000007F0000E3004F0001540000007742\r
+:100140000000E20023001C000B00110000002971D8\r
+:10015000240018000D00100052004B0025000C0078\r
+:100160000E00360051002800260012000F00370054\r
+:100170002F002B00270013003382380030004E0080\r
+:100180002D0031003478E500C100000001000100BD\r
+:1001900001000100010000003A001E0220022202BC\r
+:1001A000010001003B001F022102230201000100A7\r
+:1001B0003C002F0226022F00010001003D0030020A\r
+:1001C00027023000010001003E00310235003502F7\r
+:1001D000000001000100010000000100000001001A\r
+:1001E0000100010000000100000001003F0052007A\r
+:1001F00051002402000001004000240021001E00E4\r
+:10020000010001004100250022001F00370001000D\r
+:1002100042002600230020002700010043002502A1\r
+:100220002E0231002E0001004400450001000100B3\r
+:1002300001000000010001000100010001000000B8\r
+:1002400001000100010001000100010001000100A6\r
+:10025000F2000100010001000100F000F1000100C6\r
+:10026000F400010001000100F3000100F5000100AD\r
+:100270000100010001000100000001000100010077\r
+:100280000000010000000100010001000000010069\r
+:100290000000010001000100010001000000010058\r
+:1002A0000100010001000100A9000100010001009E\r
+:1002B0000100AC00AA00B600010001000100AB0083\r
+:1002C000A80001000100010001000100010001007F\r
+:1002D00001000100AE00010001000000160345000E\r
+:1002E000720067006F0044006F0078002000450036\r
+:1002F0005A00000016034500720067006F004400BA\r
+:100300006F007800200045005A0000000403090433\r
+:1003100009026D00040100A0FA09040000010301B4\r
+:100320000100092111010001223F00070581030896\r
+:10033000000A090401000103010200092111010062\r
+:1003400001224D000705820308000A09040200018A\r
+:100350000300000009211101000122360007058376\r
+:100360000308000A09040300010300000009211129\r
+:100370000100012239000705840310000112011059\r
+:100380000100000008EDFE07130100010200010555\r
+:10039000010906A101050719E029E71500250195C6\r
+:1003A0000875018102050819012905950575019156\r
+:1003B000029501750391010507190029771500259C\r
+:1003C00001957875018102C005010980A1018502AE\r
+:1003D00016010026B7001A01002AB7007510950112\r
+:1003E0008100C0050C0901A1018503160100269CAE\r
+:1003F000021A01002A9C02751095018100C00501B6\r
+:100400000902A1010901A100050919012905150029\r
+:10041000250195057501810295017503810105018D\r
+:10042000093009311581257F950275088106093843\r
+:100430001581257F950175088106050C0A3802157E\r
+:1004400081257F950175088106C0C005010906A1B7\r
+:1004500001050719E029E7150025019508750181B7\r
+:100460000295017508810105081901290595057591\r
+:100470000191029501750391010507190029FF15E6\r
+:100480000025FF950675088100C0000000000000EF\r
+:100490000000000000010204060A0F17202C3A4A4F\r
+:1004A0005D71879DB3C7DAE9F5FCFFFCF5E9DAC7B2\r
+:1004B000B39D87715D4A3A2C20170F0A060402018A\r
+:1004C0000000000000000000000011241FBECFEF5C\r
+:1004D000DAE0DEBFCDBF04B603FE24C08091EE019A\r
+:1004E0009091EF01A091F001B091F1018730904B14\r
+:1004F000A740B04BB9F41092EE011092EF011092A8\r
+:10050000F0011092F10114BE84B7877F84BF88E1A7\r
+:100510000FB6F89480936000109260000FBEE0E088\r
+:10052000FFE3099511E0A0E0B1E0EAEAF7E402C0D8\r
+:1005300005900D92A433B107D9F711E0A4E3B1E01F\r
+:1005400001C01D92AE3EB107E1F70E94B6090C94BE\r
+:10055000D3230C94000061110BC0FC01828188231D\r
+:1005600021F085EE0E94231003C085EE0E94EB105F\r
+:1005700080E090E0089508956091B1017091B2011A\r
+:100580008091B3019091B4010E94C91A56985E9867\r
+:1005900025982D9826982E9827982F98813019F015\r
+:1005A000823021F00895259A2D9A0895269A2E9A40\r
+:1005B00008950C94BC0256985E9825982D9826981C\r
+:1005C0002E9827982F988FEF90E090938900809332\r
+:1005D000880090938B0080938A0090938D00809385\r
+:1005E0008C00259A2D9A2FEF80E792E021508040D1\r
+:1005F0009040E1F700C00000269A2E9A2FEF80E786\r
+:1006000092E0215080409040E1F700C00000279A1E\r
+:100610002F9A2FEF80E792E0215080409040E1F741\r
+:1006200000C0000025982D982FEF80E792E0215020\r
+:1006300080409040E1F700C0000026982E982FEFF0\r
+:1006400080E792E0215080409040E1F700C0000038\r
+:1006500027982F9856985E9825982D9826982E982A\r
+:1006600027982F98089589EA8093800089E08093E5\r
+:10067000810024982C983F988AB18F748AB96E981B\r
+:10068000479A8BB1806B8BB9769A0E94DB020C94EF\r
+:10069000BB0280E2809300018091340181110EC081\r
+:1006A0000E94980381E0809334012FEF83ED90E363\r
+:1006B000215080409040E1F700C0000080E40E949B\r
+:1006C0009E038093000181112EC00E94C803809375\r
+:1006D0000001811128C00E94C8038093000181118C\r
+:1006E00022C08FE30E94C8038093000181111BC0C8\r
+:1006F0000E94C00380E40E949E0380930001811148\r
+:1007000012C08CE00E94C8038093000181110BC0CD\r
+:100710000E94C80380930001811105C08FE30E94ED\r
+:10072000C803809300010E94C003809100010895D6\r
+:100730001092B9008AE08093B800089594EA9093EB\r
+:10074000BC009091BC0097FFFCCF9091B900987FBE\r
+:10075000983021F0903111F081E008958093BB0032\r
+:1007600084E88093BC008091BC0087FFFCCF80911F\r
+:10077000B900887F883111F0803471F780E00895E6\r
+:1007800084E98093BC008091BC0084FDFCCF089577\r
+:100790008093BB0084E88093BC008091BC0087FFFD\r
+:1007A000FCCF9091B900987F81E0983209F480E005\r
+:1007B000089584E88093BC008091BC0087FFFCCF43\r
+:1007C0008091BB00089580910001811115C080E4E3\r
+:1007D0000E949E038093000181110CC082E10E945F\r
+:1007E000C80380930001811105C08FEF0E94C803E8\r
+:1007F000809300010E94C00384B1807F84B985B1D9\r
+:10080000807F85B98AB1837F8AB98BB1837F8BB9A9\r
+:100810003E98469808950E944903809300010E94E3\r
+:10082000E30380B38C7080BB81B3836F81BBA6E38D\r
+:10083000B1E0E4E4F1E08EE08E0F11921D928E1390\r
+:10084000FCCF0C943303BF92CF92DF92EF92FF92D2\r
+:100850000F931F93CF93DF9380910001882379F04A\r
+:10086000809135018F5F80933501811108C00E940E\r
+:10087000490380930001811102C00E94DB0206E35C\r
+:1008800011E0C0E0D0E0DD24D39482E0C82EEE2455\r
+:10089000E394F12CC730D10500F58091000181115E\r
+:1008A00064C080E40E949E0380930001811112C005\r
+:1008B00082E10E94C8038093000181110BC0C7012F\r
+:1008C0000C2E01C0880F0A94EAF780950E94C80395\r
+:1008D000809300010E94C00348C0CA30A1F028F4F0\r
+:1008E000C83059F0C93061F005C0CC3089F070F0E3\r
+:1008F000CD3089F0209A289810C0219A29980DC0EF\r
+:10090000229A2A980AC0239A2B9807C0529A01C0AB\r
+:10091000539A5B9802C03E9A469890EA9A95F1F7EE\r
+:100920009FB1799902C082E001C080E091709D255D\r
+:10093000982B7C9902C084E001C080E0892B7D99CE\r
+:1009400002C038E001C030E0832B7E9902C020E174\r
+:1009500001C020E0822B9FB19095991F9927991F84\r
+:100960009295990F907E892B0FC080910001811183\r
+:1009700049C080E40E949E0380930001882379F19E\r
+:10098000B12C0E94C0038B2DF8019081981719F0AB\r
+:100990008083C09201010E94E30321960F5F1F4FE5\r
+:1009A000CE30D10509F076CF80910101882361F125\r
+:1009B000815080930101882339F08FE99FE00197EE\r
+:1009C000F1F700C0000020C0A4E4B1E0E6E3F1E0EC\r
+:1009D000CF01825F91919D938E13FCCF15C083E16F\r
+:1009E0000E94C803809300018111CACF81E40E9454\r
+:1009F0009E03809300018111C3CF0E94D903B82EBA\r
+:100A0000B094BFCF80E0C0CF0E94D90281E0DF91D7\r
+:100A1000CF911F910F91FF90EF90DF90CF90BF90FB\r
+:100A20000895E82FF0E0EC5BFE4F80810895089573\r
+:100A3000089596E0799FF001112494E5899FE00DD7\r
+:100A4000F11D1124E60FF11DEE0FFF1FEC51FF4FBA\r
+:100A5000859194910895880F991FFC01E05AF04008\r
+:100A6000859194910895880F991FFC01E052FF4FE2\r
+:100A70008591949108950F931F93CF93DF93EC0189\r
+:100A80008115904350F5C11580E2D80708F0B3C036\r
+:100A9000CB3BD10590F4C83AD10508F05AC0C53A0D\r
+:100AA000D10508F04BC0C430D10508F0BBC1219777\r
+:100AB00009F0B5C101E010E0F5C1CF3FD10511F05B\r
+:100AC00008F0B0C1C03FD10508F092C0CE01805EF1\r
+:100AD0009109089708F4A6C1A2C1C11591E5D907EB\r
+:100AE000A8F4C23020E5D20708F09EC0C11580E509\r
+:100AF000D80709F485C008F091C0C11520E4D207D9\r
+:100B000008F08DC1DD278E01106CCCC1C11580E8C5\r
+:100B1000D80758F4C11590E7D90708F07CC1C11572\r
+:100B200020E6D20708F422C17AC1C11580E9D807AE\r
+:100B300008F075C1DF708E01106AB4C1C53AD105E5\r
+:100B400009F472C1C63AD10509F071C102E810E496\r
+:100B5000A9C1C83AD10509F46DC1C93AD10509F452\r
+:100B60006CC1CA3AD10509F46BC1CB3AD10509F47D\r
+:100B70006AC1CC3AD10509F469C1CD3AD10509F46D\r
+:100B800068C1C03BD10509F467C1CE3AD10509F46B\r
+:100B900066C1CF3AD10509F465C1C13BD10509F45D\r
+:100BA00064C1C23BD10509F463C1C33BD10509F45B\r
+:100BB00062C1C43BD10509F461C1C53BD10509F44B\r
+:100BC00060C1C63BD10509F45FC1C73BD10509F43B\r
+:100BD0005EC1C83BD10509F45DC1C93BD10509F42B\r
+:100BE0005CC1CA3BD10509F45BC100E014E45AC101\r
+:100BF0008E01106557C1CE019F700E94330553C10D\r
+:100C00000E948A149FEF24E38CE0915020408040A2\r
+:100C1000E1F700C000000E94C21B44C18091CD01D9\r
+:100C200081608093CD013EC10E946B1D811102C085\r
+:100C30000E94511D0E94881D90E09093EE018093C8\r
+:100C4000ED01C23090E5D90721F48091ED0181607A\r
+:100C500086C0C43020E5D20721F48091ED01826086\r
+:100C60007EC0C63080E5D80721F48091ED01846014\r
+:100C700076C0C83090E5D90719F48091ED0127C0FE\r
+:100C8000CA3020E5D20721F48091ED01806167C070\r
+:100C9000CC3080E5D80721F48091ED0180625FC0FF\r
+:100CA000CE3090E5D90721F48091ED01806457C0E2\r
+:100CB000C03120E5D20721F48091ED0180684FC05A\r
+:100CC000C23180E5D80729F48091ED018460886005\r
+:100CD00046C0C33090E5D90721F48091ED018E7FA5\r
+:100CE0003EC0C53020E5D20721F48091ED018D7F13\r
+:100CF00036C0C73080E5D80721F48091ED018B7FA5\r
+:100D00002EC0C93090E5D90719F48091ED0126C0B5\r
+:100D1000CB3020E5D20721F48091ED018F7E1FC0FA\r
+:100D2000CD3080E5D80721F48091ED018F7D17C08B\r
+:100D3000CF3090E5D90721F48091ED018F7B0FC072\r
+:100D4000C13120E5D20721F48091ED018F7707C0F2\r
+:100D5000C331D04531F48091ED018B7F877F809343\r
+:100D6000ED018091ED010E948C1D9CC08D2F992773\r
+:100D70008F70992781309105D9F49E012370332714\r
+:100D800002C0880F991F2A95E2F79C688E0144E003\r
+:100D9000000F111F4A95E1F700271370802B912B4C\r
+:100DA00053E0CC0FDD1F5A95E1F7C076DD272FC049\r
+:100DB0008230910531F4DC2FCC278E01016F106A4F\r
+:100DC00071C08330910569F4CE018370992701E0E9\r
+:100DD00010E002C0000F111F8A95E2F7C8019C685D\r
+:100DE0000FC0049709F05EC0CE018370992701E01F\r
+:100DF00010E002C0000F111F8A95E2F7C8019A683F\r
+:100E000023E0CC0FDD1F2A95E1F7C07ED7708C015F\r
+:100E10000C2B1D2B47C0DF708E01106243C000E019\r
+:100E200010E040C08E013EC001E810E43BC003E882\r
+:100E300010E438C002EE14E435C009EE14E432C008\r
+:100E40000AEE14E42FC005EB14E42CC006EB14E406\r
+:100E500029C007EB14E426C00CEC14E423C00DEC0D\r
+:100E600014E420C003E815E41DC00AE815E41AC024\r
+:100E700002E915E417C004E915E414C001E216E420\r
+:100E800011C003E216E40EC004E216E40BC005E252\r
+:100E900016E408C006E216E405C007E216E402C044\r
+:100EA0000AE216E4C801DF91CF911F910F910895D6\r
+:100EB00096E0799FF001112494E5899FE00DF11DE2\r
+:100EC0001124E60FF11DEE0FFF1FEC51FF4F85912E\r
+:100ED0009491803E9105E0F4803C910558F5813372\r
+:100EE000910509F46FC048F48932910509F463C093\r
+:100EF0008A32910509F46DC072C089339105E9F019\r
+:100F000082389105D1F08533910509F44DC067C051\r
+:100F1000833E910581F138F4803E9105B9F0823E1F\r
+:100F20009105D9F05CC0863E910561F1873E91053F\r
+:100F3000A1F155C00E942B0508952091ED0120FDDF\r
+:100F400002C021FF4CC080EE90E049C08091ED01CD\r
+:100F500080FFF9CF89E390E042C08091ED0182FFEC\r
+:100F60000EC08091ED0184FF03C080E090E037C0A7\r
+:100F700083EE90E034C08091ED0182FFF2CF82EEEB\r
+:100F800090E02DC08091ED0183FF0BC08091ED01B9\r
+:100F900084FDEBCF87EE90E022C08091ED0183FFCE\r
+:100FA000F5CF86EE90E01BC08091ED0185FF07C074\r
+:100FB00089E290E014C08091ED0185FFF9CF85E3CF\r
+:100FC00090E00DC08091ED0186FF07C08AE290E0BD\r
+:100FD00006C08091ED0186FFF9CF81E390E00E9489\r
+:100FE0003B05089508950C94F207809162010895DD\r
+:100FF000CF93DF9300D01F92CDB7DEB79C018091D5\r
+:10100000E401843019F593E099833B832A8390931C\r
+:10101000E9008FEF9091E800815095FD06C095EDB5\r
+:101020009A95F1F700008111F5CF8091E80085FFD6\r
+:101030000DC040E050E063E070E0CE0101960E94F8\r
+:10104000620A8091E8008E778093E8000F900F90FD\r
+:101050000F90DF91CF910895CF93DF9300D01F922F\r
+:10106000CDB7DEB72091E401243021F522E02983B9\r
+:101070009B838A8383E08093E9008FEF9091E8005F\r
+:10108000815095FD06C095ED9A95F1F7000081110C\r
+:10109000F5CF8091E80085FF0DC040E050E063E0AF\r
+:1010A00070E0CE0101960E94620A8091E8008E777E\r
+:1010B0008093E8000F900F900F90DF91CF910895EB\r
+:1010C0002091E4012430F1F422E02093E9002FEF95\r
+:1010D0003091E800215035FD06C035ED3A95F1F725\r
+:1010E00000002111F5CF2091E80025FF0BC040E062\r
+:1010F00050E065E070E00E94620A8091E8008E771F\r
+:101100008093E8000895CF93DF93EC019091E40180\r
+:10111000943009F046C080910C018823D9F0809169\r
+:101120000D018823B9F09093E9008FEF9091E800CA\r
+:10113000815095FD06C095E19A95F1F70000811167\r
+:10114000F5CF8091E80085FF2CC040E050E060E1E1\r
+:1011500070E017C081E08093E9008FEF9091E80084\r
+:10116000815095FD06C095ED9A95F1F7000081112B\r
+:10117000F5CF8091E80085FF14C040E050E068E0C2\r
+:1011800070E0CE010E94620A8091E8008E77809321\r
+:10119000E80080E1FE01A2E5B1E001900D928A95A0\r
+:1011A000E1F7DF91CF9108958091E301811109C0AA\r
+:1011B0000E94F70B0E94540C8091E200846080939F\r
+:1011C000E20008951092E301089508950C94FB2124\r
+:1011D0000E94581B0E9401220E94FA0E0C94F307F1\r
+:1011E00042E061EC81E00E94710B42E061EC82E040\r
+:1011F0000E94710B42E061EC83E00E94710B42E1BE\r
+:1012000061EC84E00C94710B8091E601833009F469\r
+:1012100055C030F4813071F0823009F48EC00895E9\r
+:101220008A3009F47AC08B3009F460C0893009F043\r
+:101230009CC020C08091E501813A09F096C0809160\r
+:10124000E800877F8093E8008091E9019091EA01AE\r
+:10125000892B21F460E182E591E003C060E080E049\r
+:1012600090E070E00E94AD0A8091E8008B77809357\r
+:10127000E80008958091E501813209F076C08091FF\r
+:10128000E9019091EA01009719F0039709F06DC008\r
+:101290008091E800877F8093E8008091E80082FDDC\r
+:1012A00005C08091E4018111F8CF5FC08091F10009\r
+:1012B000809362018091E8008B7753C08091E501B3\r
+:1012C000813A09F052C08091E9019091EA01892B9D\r
+:1012D00009F04BC08091E800877F8093E8008091FF\r
+:1012E000E80080FFFCCF80910C0136C08091E501C1\r
+:1012F0008132D9F58091E9019091EA01892BA9F514\r
+:101300008091E800877F8093E8000E94A60B80917F\r
+:10131000E70180930C010C948A148091E5018132DD\r
+:1013200021F58091E800877F8093E8000E94A60B5A\r
+:101330008091E8018093630108958091E501813AED\r
+:10134000A1F48091E800877F8093E8008091E80015\r
+:1013500080FFFCCF809163018093F1008091E800D1\r
+:101360008E778093E8000C94A60B089584B7877F4E\r
+:1013700084BF88E10FB6F8948093600010926000FB\r
+:101380000FBE90E080E80FB6F894809361009093D0\r
+:1013900061000FBE0E94490F0E94F70B0E94540C7F\r
+:1013A0008091E20084608093E20078940E94DA0EDB\r
+:1013B0000E944B0F82E091E00E94F50E0E94E9210D\r
+:1013C0008091E401853069F40E94191B8091E2014B\r
+:1013D0008823B1F30E94441B882391F30E944C0A96\r
+:1013E000EFCF0E94510FECCF292F33272330310547\r
+:1013F000C9F064F42130310581F02230310509F063\r
+:1014000043C08DE690E020E133E042C02132310557\r
+:10141000F1F02232310541F137C082E190E02DE751\r
+:1014200033E036C099278130910541F08230910533\r
+:1014300041F0892B49F5ECE0F3E005C0E4EFF2E080\r
+:1014400002C0ECEDF2E0849190E09F0121C0643095\r
+:10145000D8F4E62FF0E0EE0FFF1FEE5DFE4F208187\r
+:10146000318189E090E014C0643070F470E0FB01D9\r
+:10147000EE0FFF1FE65EFE4F20813181FB01EA5E29\r
+:10148000FE4F808190E004C080E090E020E030E0FA\r
+:10149000FA0131832083089580E189BD82E189BD0D\r
+:1014A00009B400FEFDCF8091D8008F7D8093D800D5\r
+:1014B0008091E00082608093E0008091E00081FDF7\r
+:1014C000FCCF0895CF92DF92EF92FF920F931F937C\r
+:1014D000CF93DF93EC018B016A010E94C50B811150\r
+:1014E00033C0C114D10439F0F60180819181081B09\r
+:1014F000190BC80FD91FE12CF12C0115110519F199\r
+:101500008091E80085FD16C08091E8008E77809379\r
+:10151000E800C114D10449F0F60180819181E80E00\r
+:10152000F91EF182E08285E00FC00E94C50B88237E\r
+:1015300021F30AC089918093F10001501109FFEF56\r
+:10154000EF1AFF0ADACF80E0DF91CF911F910F9160\r
+:10155000FF90EF90DF90CF9008952091EB013091B4\r
+:10156000EC012617370748F06115710539F4209111\r
+:10157000E8002E772093E80001C0B90140E0611532\r
+:101580007105A9F12091E401222309F443C025301B\r
+:1015900009F442C02091E80023FD40C02091E800FA\r
+:1015A00022FD32C02091E80020FFE9CF4091F300F6\r
+:1015B0002091F20030E0342BFC01CF016115710560\r
+:1015C00059F02830310540F481918093F100615049\r
+:1015D00071092F5F3F4FF1CF41E02830310509F00D\r
+:1015E00040E02091E8002E772093E800C8CF411119\r
+:1015F000C9CF0AC08091E401882361F0853061F091\r
+:101600008091E80083FD0AC08091E80082FFF2CF5C\r
+:1016100080E0089582E0089583E0089581E00895D0\r
+:101620002091EB013091EC012617370748F0611546\r
+:10163000710539F42091E8002E772093E80001C06D\r
+:10164000B901FC0120E06115710591F18091E4017F\r
+:10165000882309F440C0853009F43FC08091E80038\r
+:1016600083FD3DC08091E80082FD2FC08091E8009D\r
+:1016700080FFE9CF2091F3008091F20090E0922B5F\r
+:101680006115710559F08830910540F4249120933B\r
+:10169000F1003196615071090196F2CF21E008976F\r
+:1016A00009F020E08091E8008E778093E800CBCFAE\r
+:1016B0002111CCCF0AC08091E401882361F08530EC\r
+:1016C00061F08091E80083FD0AC08091E80082FF0C\r
+:1016D000F2CF80E0089582E0089583E0089581E0EC\r
+:1016E0000895982F973058F59093E900981739F09E\r
+:1016F0007091EC002091ED005091F00003C0242F78\r
+:10170000762F50E021FF19C03091EB003E7F3093DF\r
+:10171000EB003091ED003D7F3093ED003091EB0018\r
+:1017200031603093EB007093EC002093ED00509308\r
+:10173000F0002091EE0027FF07C09F5FD3CF8F708E\r
+:101740008093E90081E0089580E008958091E501AB\r
+:1017500087FF11C08091E80082FD05C08091E401FF\r
+:101760008111F8CF11C08091E8008B770BC0809178\r
+:10177000E401882349F08091E80080FFF8CF809150\r
+:10178000E8008E778093E80008952091E40030917E\r
+:10179000E50095E64091EC00842F817040FF22C067\r
+:1017A0008091E80080FD1CC08091E401882391F0C5\r
+:1017B000853091F08091EB0085FD10C04091E400F0\r
+:1017C0005091E5004217530729F39A01915011F700\r
+:1017D00084E0089582E0089583E0089581E008950B\r
+:1017E00080E008954091E80042FFDECF08950E9416\r
+:1017F000650C0E946D0CE0EEF0E0808181608083DA\r
+:10180000E8EDF0E080818F77808319BCA7EDB0E030\r
+:101810008C918E7F8C9380818F7E80831092E301E8\r
+:1018200008950F931F93CF93DF930E94650C0E943E\r
+:101830006D0CC8EDD0E088818F77888388818068BF\r
+:10184000888388818F7D888319BC1092E40110926F\r
+:10185000E0011092E2011092E10100EE10E0F801C7\r
+:1018600080818B7F808388818160888342E060E013\r
+:1018700080E00E94710BE1EEF0E080818E7F80833A\r
+:10188000E2EEF0E0808181608083808188608083E7\r
+:10189000F80180818E7F8083888180618883DF91D9\r
+:1018A000CF911F910F910895E8EDF0E080818F7E38\r
+:1018B0008083E7EDF0E080818160808384E082BFF7\r
+:1018C00081E08093E3010C94110CE8EDF0E080815D\r
+:1018D0008E7F80831092E20008951092DA001092B9\r
+:1018E000E10008951F920F920FB60F9211242F93CB\r
+:1018F0003F934F935F936F937F938F939F93AF9398\r
+:10190000BF93EF93FF938091E10082FF0BC0809122\r
+:10191000E20082FF07C08091E1008B7F8093E100AD\r
+:101920000E94D90E8091DA0080FF1FC08091D800FC\r
+:1019300080FF1BC08091DA008E7F8093DA00809157\r
+:10194000D90080FF0DC080E189BD82E189BD09B465\r
+:1019500000FEFDCF81E08093E4010E94D40805C021\r
+:1019600019BC1092E4010E94E2088091E10080FF1E\r
+:1019700019C08091E20080FF15C08091E2008E7F47\r
+:101980008093E2008091E20080618093E200809188\r
+:10199000D80080628093D80019BC85E08093E40170\r
+:1019A0000E94E6088091E10084FF30C08091E2004F\r
+:1019B00084FF2CC080E189BD82E189BD09B400FEAD\r
+:1019C000FDCF8091D8008F7D8093D8008091E10079\r
+:1019D0008F7E8093E1008091E2008F7E8093E20011\r
+:1019E0008091E20081608093E2008091E001882391\r
+:1019F00011F084E007C08091E30087FD02C081E020\r
+:101A000001C083E08093E4010E94E8088091E10036\r
+:101A100083FF29C08091E20083FF25C08091E1000F\r
+:101A2000877F8093E10082E08093E4011092E001DF\r
+:101A30008091E1008E7F8093E1008091E2008E7FB3\r
+:101A40008093E2008091E20080618093E20042E0B6\r
+:101A500060E080E00E94710B8091F00088608093CC\r
+:101A6000F0000E94E508FF91EF91BF91AF919F9127\r
+:101A70008F917F916F915F914F913F912F910F9037\r
+:101A80000FBE0F901F9018951F920F920FB60F92D6\r
+:101A900011242F933F934F935F936F937F938F9373\r
+:101AA0009F93AF93BF93CF93DF93EF93FF93C09137\r
+:101AB000E900CF708091EC00D82FD17080FDD0E884\r
+:101AC0001092E9008091F000877F8093F000789475\r
+:101AD0000E94880D1092E9008091F0008860809348\r
+:101AE000F000CD2BCF70C093E900FF91EF91DF9113\r
+:101AF000CF91BF91AF919F918F917F916F915F91A6\r
+:101B00004F913F912F910F900FBE0F901F901895FE\r
+:101B10001F93CF93DF93CDB7DEB7AA970FB6F89494\r
+:101B2000DEBF0FBECDBFE5EEF1E088E08E0F9091F5\r
+:101B3000F10091938E13FBCF0E9404098091E8007D\r
+:101B400083FF1FC18091E5019091E601492F50E08C\r
+:101B50004A30510508F015C1FA01EA5AFF4F0C94BA\r
+:101B60008323803881F0823809F00BC18091E9012C\r
+:101B70008F708093E9008091EB0085FB882780F9C6\r
+:101B80001092E90006C08091E1019091E20191116B\r
+:101B900082609091E800977F9093E8008093F10035\r
+:101BA0001092F100C8C0282F2D7F09F0EAC08823C9\r
+:101BB00019F0823061F0E5C08091E701813009F0D1\r
+:101BC000E0C0933009F080E08093E2012BC0809167\r
+:101BD000E701811127C08091E9018F7009F4D1C01C\r
+:101BE0008093E9002091EB0020FF1CC0933021F48A\r
+:101BF0008091EB00806214C09091EB009061909313\r
+:101C0000EB0021E030E0A90102C0440F551F8A9586\r
+:101C1000E2F74093EA001092EA008091EB008860BE\r
+:101C20008093EB001092E9008091E800877F86C0E6\r
+:101C30008111A7C01091E7011F778091E3008078A0\r
+:101C4000812B8093E3008091E800877F8093E800F8\r
+:101C50000E94A60B8091E80080FFFCCF8091E300FA\r
+:101C600080688093E300111102C082E001C083E02C\r
+:101C70008093E40186C08058823008F082C0809151\r
+:101C8000E7019091E8018C3D53E0950779F583E0F9\r
+:101C90008A838AE289834FB7F894DE01139620E0A5\r
+:101CA0003EE051E2E32FF0E050935700E49120FF33\r
+:101CB00003C0E295EF703F5FEF708E2F90E0EA3047\r
+:101CC00010F0C79601C0C0968D939D932F5F24316D\r
+:101CD00049F74FBF8091E800877F8093E8006AE270\r
+:101CE00070E0CE0101960E94AD0A14C0AE014F5FB4\r
+:101CF0005F4F6091E9010E94F409BC01892B09F44E\r
+:101D000040C09091E800977F9093E80089819A8184\r
+:101D10000E94100B8091E8008B778093E80031C01F\r
+:101D2000803879F58091E800877F8093E800809182\r
+:101D3000E0018093F1008091E8008E778093E800C5\r
+:101D40000E94A60B1EC081111CC09091E701923029\r
+:101D5000C0F48091E800877F8093E8009093E001D1\r
+:101D60000E94A60B8091E001811106C08091E300E2\r
+:101D700087FD02C081E001C084E08093E4010E94FD\r
+:101D8000F0088091E80083FF0AC08091E800877F17\r
+:101D90008093E8008091EB0080628093EB00AA962C\r
+:101DA0000FB6F894DEBF0FBECDBFDF91CF911F916C\r
+:101DB00008950895CF938091E4018823A1F0C09104\r
+:101DC000E900CF709091EC00892F817090FD80E840\r
+:101DD000C82B1092E9008091E80083FD0E94880DD5\r
+:101DE000CF70C093E900CF910895909369018093DB\r
+:101DF00068010895E0916801F0916901309721F040\r
+:101E00000190F081E02D099480E00895E09168014F\r
+:101E1000F0916901309721F00280F381E02D09945F\r
+:101E20000895E0916801F0916901309721F00480F4\r
+:101E3000F581E02D099408952091660130916701A4\r
+:101E40008217930771F09093670180936601E09188\r
+:101E50006801F0916901309721F00680F781E02D4B\r
+:101E600009940895209164013091650182179307C8\r
+:101E700071F09093650180936401E0916801F091A5\r
+:101E80006901309721F00084F185E02D09940895CF\r
+:101E900008950C94480F0E945E1B0E940B040C9442\r
+:101EA000241CCF92DF92EF92FF920F931F93CF9358\r
+:101EB000DF93CDB7DEB72B970FB6F894DEBF0FBE1A\r
+:101EC000CDBF0E9423048BE6C82E81E0D82E00E00F\r
+:101ED00010E0E02E802F0E941105F60141916F0164\r
+:101EE000F42EF826B1F40F5F1F4F0E30110589F75D\r
+:101EF0008FEF89838A831B820E94671B8160782F02\r
+:101F00009D838C8349815A816B818D810E94F40F5E\r
+:101F100040C09091CD0191FF04C08B870E941705AE\r
+:101F20008B8520E030E04F2D50E0922FBA01022E39\r
+:101F300002C0759567950A94E2F760FF24C02E836E\r
+:101F4000EF8221E030E0690102C0CC0CDD1C9A95E3\r
+:101F5000E2F790E08C219D21892B09F420E028876D\r
+:101F60000E94671B8160782F9A8789874E815F81E5\r
+:101F700068858A850E94F40FF801E559FE4F80813B\r
+:101F8000C826C08206C02F5F3F4F2630310569F654\r
+:101F9000AACF0E940B1F10916A010E94FA0E181717\r
+:101FA000A1F00E94FA0E80936A012B960FB6F89466\r
+:101FB000DEBF0FBECDBFDF91CF911F910F91FF907C\r
+:101FC000EF90DF90CF900C94F3072B960FB6F89418\r
+:101FD000DEBF0FBECDBFDF91CF911F910F91FF905C\r
+:101FE000EF90DF90CF900895CF93DF93CDB7DEB71A\r
+:101FF0002B970FB6F894DEBF0FBECDBF4F83588727\r
+:1020000069877A878B87DE01119686E0FD01119240\r
+:102010008A95E9F785E0FE01379601900D928A9541\r
+:10202000E1F749815A816B817C818D819E810E947B\r
+:1020300024172B960FB6F894DEBF0FBECDBFDF91ED\r
+:10204000CF9108950895CF93882309F4C2C0C82F73\r
+:10205000823859F40E94FA0E81FDBBC089E30E94C8\r
+:10206000CD190E949A1A89E30CC0833879F40E9432\r
+:10207000FA0E80FDAEC083E50E94CD190E949A1A27\r
+:1020800083E50E940F1ACF910C949A1A843859F460\r
+:102090000E94FA0E82FD9DC087E40E94CD190E9425\r
+:1020A0009A1A87E4EECF8CEF8C0F813A48F48C2F8C\r
+:1020B0000E944E2181118DC08C2F0E94CD19E3CF3B\r
+:1020C00080E28C0F883048F4C77081E001C0880F2F\r
+:1020D000CA95EAF70E94531AD6CF8BE58C0F83304E\r
+:1020E00078F4C53A29F0C63A31F083E890E005C0AB\r
+:1020F00081E890E002C082E890E0CF910C941C0F40\r
+:1021000088E58C0F833108F064C0C83A39F1C93AC8\r
+:1021100041F1CA3A49F1CB3A51F1CC3A59F1CD3AB1\r
+:1021200061F1C03B69F1CE3A71F1CF3A79F1C13B2F\r
+:1021300081F1C23B89F1C33B91F1C43B99F1C53BAD\r
+:10214000A1F1C63BA9F1C73BB1F1C83BB9F1C93B0D\r
+:10215000C1F1CA3BC9F180E090E038C082EE90E066\r
+:1021600035C089EE90E032C08AEE90E02FC085EB5A\r
+:1021700090E02CC086EB90E029C087EB90E026C071\r
+:102180008CEC90E023C08DEC90E020C083E891E0DF\r
+:102190001DC08AE891E01AC082E991E017C084E985\r
+:1021A00091E014C081E292E011C083E292E00EC09F\r
+:1021B00084E292E00BC085E292E008C086E292E001\r
+:1021C00005C087E292E002C08AE292E0CF910C94CF\r
+:1021D000320FCF910895882309F44BC0823859F407\r
+:1021E0000E94FA0E81FF45C089E30E94CD190E942A\r
+:1021F0009A1A89E30CC0833871F40E94FA0E80FFAA\r
+:1022000038C083E50E94CD190E949A1A83E50E9486\r
+:102210000F1A0C949A1A843859F40E94FA0E82FF0D\r
+:1022200028C087E40E94CD190E949A1A87E4EFCF54\r
+:102230009CEF980F913A58F390E2980F983050F431\r
+:10224000877091E001C0990F8A95EAF7892F0E9463\r
+:10225000591ADFCF9BE5980F933020F480E090E08F\r
+:102260000C941C0F885A833120F480E090E00C9489\r
+:10227000320F0895882321F00E94531A0C949A1A61\r
+:102280000895882321F00E94591A0C949A1A0895EF\r
+:10229000BF92CF92DF92EF92FF920F931F93CF9353\r
+:1022A000DF9300D000D000D0CDB7DEB725E0FC0131\r
+:1022B000DE01119601900D922A95E1F7FC01D08084\r
+:1022C00011810281258122952F7043815481452BF4\r
+:1022D00009F4FCC21F3F21F4FFEFDF1609F4F6C238\r
+:1022E0007C012E830E942210D9821A8369817A810F\r
+:1022F000802F0E94C919182FB92E0E947E190E94A2\r
+:1023000045182E81002319F00E94701A2E81EB2DA2\r
+:10231000E295EF70F0E0E05AFF4F0C9483238B2D91\r
+:10232000807F9B2D9F70F92E882319F0F29480EF07\r
+:10233000F822002389F0FF2009F475C280E2810FA2\r
+:10234000883020F48F2D0E94531A03C08F2D0E94D5\r
+:10235000631A0E949A1A67C2812F0E94EB10FF2015\r
+:1023600009F4B4C2105E8F2D183018F40E94591A67\r
+:1023700002C00E94691A26960FB6F894DEBF0FBEFF\r
+:10238000CDBFDF91CF911F910F91FF90EF90DF9024\r
+:10239000CF90BF900C949A1A3B2D307F8B2D8F706D\r
+:1023A000303211F08295807F112319F0113021F124\r
+:1023B0002CC00023B9F0222309F4A0C1213009F078\r
+:1023C0009DC126960FB6F894DEBF0FBECDBFDF913C\r
+:1023D000CF911F910F91FF90EF90DF90CF90BF9022\r
+:1023E0000C94831A222319F0213009F46FC28E83D2\r
+:1023F0000E94861A8E8196C1002321F0223008F0B7\r
+:1024000065C27CC1211162C28DC1002321F022234B\r
+:1024100009F474C108C2222309F484C119C22B2D06\r
+:1024200026952695237030E02115310521F02130C5\r
+:102430003105D1F04BC2002321F0812F9B2D9370E9\r
+:1024400002C080E090E026960FB6F894DEBF0FBE83\r
+:10245000CDBFDF91CF911F910F91FF90EF90DF9053\r
+:10246000CF90BF900C941C0F002321F0812F9B2D47\r
+:10247000937002C080E090E026960FB6F894DEBF1D\r
+:102480000FBECDBFDF91CF911F910F91FF90EF90C5\r
+:10249000DF90CF90BF900C94320F812F002319F062\r
+:1024A0000E94131E02C00E947B1E26960FB6F8944F\r
+:1024B000DEBF0FBECDBFDF91CF911F910F91FF9077\r
+:1024C000EF90DF90CF90BF900C94001F8B2D837006\r
+:1024D00009F07BC00111FAC1812F82958695877022\r
+:1024E000880F880F912F9F70C92ED12CE12CF12CD1\r
+:1024F000082E04C0CC0CDD1CEE1CFF1C0A94D2F785\r
+:1025000014FF12C04FE050E060E070E004C0440FE0\r
+:10251000551F661F771F8A95D2F7CB01BA016095C8\r
+:1025200070958095909503C060E070E0CB012B2DF5\r
+:10253000269526952370422F50E042305105D9F060\r
+:102540004330510569F16C297D298E299F2941303D\r
+:10255000510551F126960FB6F894DEBF0FBECDBFE0\r
+:10256000DF91CF911F910F91FF90EF90DF90CF906F\r
+:10257000BF900C946C186C297D298E299F29269672\r
+:102580000FB6F894DEBF0FBECDBFDF91CF911F9184\r
+:102590000F91FF90EF90DF90CF90BF900C94881830\r
+:1025A0000E946C18C701B60126960FB6F894DEBFDC\r
+:1025B0000FBECDBFDF91CF911F910F91FF90EF9094\r
+:1025C000DF90CF90BF900C945018002319F08B2D02\r
+:1025D000817001C08695882309F478C1812F829586\r
+:1025E00086958770880F880F912F9F70C92ED12CE8\r
+:1025F000E12CF12C082E04C0CC0CDD1CEE1CFF1CC1\r
+:102600000A94D2F714FF12C04FE050E060E070E08F\r
+:1026100004C0440F551F661F771F8A95D2F7CB0160\r
+:10262000BA01609570958095909503C060E070E068\r
+:10263000CB012B2D269526952370422F50E042305A\r
+:102640005105D9F04330510569F16C297D298E2956\r
+:102650009F294130510551F126960FB6F894DEBFFF\r
+:102660000FBECDBFDF91CF911F910F91FF90EF90E3\r
+:10267000DF90CF90BF900C9446196C297D298E294C\r
+:102680009F2926960FB6F894DEBF0FBECDBFDF910F\r
+:10269000CF911F910F91FF90EF90DF90CF90BF905F\r
+:1026A0000C9462190E944619C701B60126960FB60E\r
+:1026B000F894DEBF0FBECDBFDF91CF911F910F9178\r
+:1026C000FF90EF90DF90CF90BF900C942A19103FAD\r
+:1026D000D1F118F4103E50F4A1C0123F09F463C0C8\r
+:1026E00008F44CC0133F09F473C098C01F708B2DC1\r
+:1026F0008F710023A1F00E94C318812F26960FB678\r
+:10270000F894DEBF0FBECDBFDF91CF911F910F9127\r
+:10271000FF90EF90DF90CF90BF900C943A110E9401\r
+:10272000E418812F26960FB6F894DEBF0FBECDBFFA\r
+:10273000DF91CF911F910F91FF90EF90DF90CF909D\r
+:10274000BF900C9441110023A9F02111BFC08B2D23\r
+:102750008F7126960FB6F894DEBF0FBECDBFDF9106\r
+:10276000CF911F910F91FF90EF90DF90CF90BF908E\r
+:102770000C940919223008F0A9C0E9CF0023A9F070\r
+:102780008B2D8F7126960FB6F894DEBF0FBECDBF8E\r
+:10279000DF91CF911F910F91FF90EF90DF90CF903D\r
+:1027A000BF900C94C318002359F38B2D8F7126967C\r
+:1027B0000FB6F894DEBF0FBECDBFDF91CF911F9152\r
+:1027C0000F91FF90EF90DF90CF90BF900C94E418A2\r
+:1027D000002399F08B2D8F7126960FB6F894DEBFEB\r
+:1027E0000FBECDBFDF91CF911F910F91FF90EF9062\r
+:1027F000DF90CF90BF900C94AE1826960FB6F89449\r
+:10280000DEBF0FBECDBFDF91CF911F910F91FF9023\r
+:10281000EF90DF90CF90BF900C94A4180023A9F004\r
+:10282000222309F4ADCF812F26960FB6F894DEBF90\r
+:102830000FBECDBFDF91CF911F910F91FF90EF9011\r
+:10284000DF90CF90BF900C942310222309F4ADCFDA\r
+:10285000812F26960FB6F894DEBF0FBECDBFDF9155\r
+:10286000CF911F910F91FF90EF90DF90CF90BF908D\r
+:102870000C94EB104B2D4F70612FC7010E94AB02DF\r
+:1028800026960FB6F894DEBF0FBECDBFDF91CF9175\r
+:102890001F910F91FF90EF90DF90CF90BF900C941D\r
+:1028A000C8174B2D4F70612FC70126960FB6F894AD\r
+:1028B000DEBF0FBECDBFDF91CF911F910F91FF9073\r
+:1028C000EF90DF90CF90BF900C94180526960FB62E\r
+:1028D000F894DEBF0FBECDBFDF91CF911F910F9156\r
+:1028E000FF90EF90DF90CF90BF9008950E94701AF4\r
+:1028F0000E94801A0E94451A0E949A1A0E94B11FD3\r
+:102900000E94001F80E090E00E941C0F80E090E099\r
+:102910000C94320F0E94601A0C9476140E94BE1917\r
+:10292000292F22952F7030E02C3031054CF42A30BD\r
+:1029300031056CF4225031092230310588F407C08A\r
+:102940002C30310549F02F30310531F009C0803E7F\r
+:1029500048F0803F29F406C093FB882780F908954A\r
+:1029600080E0089581E00895CF93DF9300D000D0F8\r
+:102970001F92CDB7DEB70F900F900F900F900F9072\r
+:10298000DF91CF910895CF93DF9300D000D000D096\r
+:10299000CDB7DEB726960FB6F894DEBF0FBECDBF1B\r
+:1029A000DF91CF9108951F93CF93DF93C091790169\r
+:1029B00016E080917A01C81799F0D0E01C9FF001D1\r
+:1029C0001D9FF00D1124E558FE4F40815181628119\r
+:1029D0007381848195810E94C3142196C770E9CFC9\r
+:1029E000DF91CF911F9108954091AB015091AC01BF\r
+:1029F0006091AD017091AE018091AF019091B001F5\r
+:102A00000C94C3148091B00182958F7009F054C06A\r
+:102A10008091AD01882309F44FC080917901A09184\r
+:102A20007A016091AB017091AC014091AE0150917F\r
+:102A3000AF01B6E08A1709F43FC090E04115510597\r
+:102A4000C1F17F3F11F46F3FA1F1B89FF001B99F31\r
+:102A5000F00D1124E558FE4F218172132AC0208108\r
+:102A6000621327C02281211124C0238134812417BD\r
+:102A7000350710F421503109241B350B283C310552\r
+:102A8000C0F42091B0012F7020612093B00126E0A6\r
+:102A9000289FF001299FF00D1124E058FE4F8081FE\r
+:102AA0008F70806180838BEA91E00E9448110C94C2\r
+:102AB000D31401968770BECF0895CF92DF92EF9224\r
+:102AC000FF920F931F93CF93DF93CDB7DEB762973B\r
+:102AD0000FB6F894DEBF0FBECDBF8C0185E0F801C4\r
+:102AE000DE011D9601900D928A95E1F7D8014C9177\r
+:102AF00011965C91119712966C9112971396CD9046\r
+:102B0000DC9014973091AB017091AC018091AE01D3\r
+:102B10009091AF01009709F46BC17F3F19F43F3FDB\r
+:102B200009F466C1E090AD01EE2009F4C0C0209127\r
+:102B3000B001C816D90628F0F601E81BF90BCF0141\r
+:102B400004C0809590958C0D9D1DFF24F394883CC6\r
+:102B5000910578F0F12C207F09F0C6C07C2DD98A30\r
+:102B6000C88A89890E94B4148BEA91E00E944811B6\r
+:102B7000B1C0822F807F09F046C0751314C0341392\r
+:102B800012C0611110C02F7020612093B0010E940B\r
+:102B9000F4148BEA91E00E9448118091B001D801B1\r
+:102BA00015968C932EC0CD2819F15F3F11F44F3F3D\r
+:102BB000F9F0F62E61111CC08091790120917A0103\r
+:102BC00036E0821709F45AC090E0389FF001399F2F\r
+:102BD000F00D1124E558FE4F7181571306C0708126\r
+:102BE000471303C07281711103C001968770E9CF4A\r
+:102BF000F62E662309F418C18091B001816080939C\r
+:102C0000B001F12C11C1751308C0341306C0611155\r
+:102C100004C08091B001D801C3C04D875E878D8507\r
+:102C20009E856A8B0E948E146A898823E1F166234F\r
+:102C3000D1F12091B001822F82958F7090E00297A0\r
+:102C400074F08091AB019091AC0198878F831986C5\r
+:102C5000DB86CA862C87CE0107960E94481186E043\r
+:102C6000F801ABEAB1E001900D928A95E1F70E947C\r
+:102C700002150E94F414FF24F394D6C04D875E879A\r
+:102C80008D859E850E94BE19292F22952F7030E0D8\r
+:102C9000223031050CF0BCC09F7009F0B6C0805ED8\r
+:102CA000883008F4C1C0C8010E944811E4CFC8169A\r
+:102CB000D90608F453C0F601E81BF90BCF01883C94\r
+:102CC000910508F450C0F12C7C2DD98AC88A8989D5\r
+:102CD0000E94B414EBEAF1E086E0DF011D928A95D0\r
+:102CE000E9F70E94F414A0C0751314C0341312C085\r
+:102CF000611110C08091B001F8018583C8010E9464\r
+:102D0000481186E0EBEAF1E0DF011D928A95E9F7D0\r
+:102D1000FE2C8AC04D875E878D859E856A8B0E94BA\r
+:102D20008E146A89882309F4BECF662309F4BBCFC9\r
+:102D30002091B001822F82958F7090E002970CF461\r
+:102D40008ECF8091AB019091AC019A8389831B82D5\r
+:102D5000DD82CC822E83CE0101967FCF8095909527\r
+:102D60008C0D9D1DACCFF62E662309F49CCF7513F8\r
+:102D70002EC034132CC02091B00120FD1FC0822F23\r
+:102D800082958F70D9F0D80115962C9315978F30B6\r
+:102D900049F08F5F982F9295907F822F8F70892BAB\r
+:102DA00015968C93C8010E94481186E0F801ABEAA1\r
+:102DB000B1E001900D928A95E1F793CF86E0F8019A\r
+:102DC000ABEAB1E001900D928A95E1F72DC04D87F5\r
+:102DD0005E878D859E850E948E14811140CF8091E3\r
+:102DE000B00181608093B001C8010E9448111CC0ED\r
+:102DF000662309F458CF4D875E878D859E850E9496\r
+:102E00008E14882309F44FCF2ACF811148CF0CC0EC\r
+:102E1000243031050CF047CF9F7009F440CFF80102\r
+:102E20009581907F09F03BCF8F2D62960FB6F89475\r
+:102E3000DEBF0FBECDBFDF91CF911F910F91FF90ED\r
+:102E4000EF90DF90CF9008951F93CF93DF93CDB78E\r
+:102E5000DEB72C970FB6F894DEBF0FBECDBF4F8301\r
+:102E6000588769877A878B879C87CE0107960E944F\r
+:102E70005D15882369F08F8198852A853B85232BF2\r
+:102E8000F1F19F3F09F063C08F3F09F060C037C088\r
+:102E900086E0FE013796DE01119601900D928A952B\r
+:102EA000E1F76F817885EA85FB85309741F17F3FB7\r
+:102EB00011F46F3F21F120917A0130E0C9010196B0\r
+:102EC000877099274091790150E08417950709F49C\r
+:102ED00047C069837A83FD83EC8396E0929FD0019B\r
+:102EE000939FB00D1124A558BE4FFE01319601905D\r
+:102EF0000D929A95E1F780937A010E94D31416E01F\r
+:102F00008091790190917A018917C1F1189FC001D0\r
+:102F1000112485589E4F0E945D15882379F1E09118\r
+:102F200079011E9FF0011124E558FE4F4081518127\r
+:102F300062817381848195810E94C314809179019B\r
+:102F400090E001968770992780937901D9CF4F81BE\r
+:102F5000588569857A858B859C850E94C314CFCF5F\r
+:102F60000E948A1410927A0110927901EBEAF1E042\r
+:102F700086E0DF011D928A95E9F7C1CF2C960FB646\r
+:102F8000F894DEBF0FBECDBFDF91CF911F910895A2\r
+:102F9000EF92FF920F931F93CF93DF938C01892BB6\r
+:102FA00009F46CC0F12CEE24E394E8012196F801B9\r
+:102FB0008491843740F4843008F051C0813081F02E\r
+:102FC000823019F15BC0853709F444C0A8F19CE751\r
+:102FD000980F903708F052C08F770E94EB1041C0D5\r
+:102FE0000E5F1F4FFE01C49180E28C0F883048F4C1\r
+:102FF000C7708E2D01C0880FCA95EAF70E94731A18\r
+:1030000014C08C2F0E9423102DC00E5F1F4FFE0195\r
+:10301000C49180E28C0F883058F4C7708E2D01C0A7\r
+:10302000880FCA95EAF70E94791A0E949A1A1AC064\r
+:103030008C2F0E94EB1016C00E5F1F4FFE01C49133\r
+:10304000CC2381F08FE99FE00197F1F700C00000E9\r
+:10305000C150F6CF0E5F1F4FFE01F49003C00E94D7\r
+:1030600023108E018F2D882309F49FCFEFE9FFE015\r
+:103070003197F1F700C000008150F5CFDF91CF917B\r
+:103080001F910F91FF90EF90089508956093B501FF\r
+:103090007093B6018093B7019093B8010C947614A5\r
+:1030A0000F931F930091B5011091B6012091B701C4\r
+:1030B0003091B801DC01CB01802B912BA22BB32BDB\r
+:1030C0008093B5019093B601A093B701B093B80176\r
+:1030D0001F910F910C9476140F931F930091B501DB\r
+:1030E0001091B6012091B7013091B801DC01CB01FC\r
+:1030F00080239123A223B3238093B5019093B6013B\r
+:10310000A093B701B093B8011F910F910C9476145E\r
+:103110000F931F930091B5011091B6012091B70153\r
+:103120003091B801DC01CB0180279127A227B3277A\r
+:103130008093B5019093B601A093B701B093B80105\r
+:103140001F910F910C9476141092B1011092B2015C\r
+:103150001092B3011092B4010C94761441E050E047\r
+:1031600060E070E004C0440F551F661F771F8A950A\r
+:10317000D2F74093B1015093B2016093B3017093C1\r
+:10318000B4010C94761441E050E060E070E004C0BB\r
+:10319000440F551F661F771F8A95D2F78091B101A2\r
+:1031A0009091B201A091B301B091B401482B592B79\r
+:1031B0006A2B7B2B4093B1015093B2016093B30112\r
+:1031C0007093B4010C94761441E050E060E070E03C\r
+:1031D00004C0440F551F661F771F8A95D2F740958C\r
+:1031E0005095609570958091B1019091B201A09138\r
+:1031F000B301B091B401482359236A237B23409340\r
+:10320000B1015093B2016093B3017093B4010C9477\r
+:10321000761441E050E060E070E004C0440F551FB8\r
+:10322000661F771F8A95D2F78091B1019091B20104\r
+:10323000A091B301B091B401482759276A277B2791\r
+:103240004093B1015093B2016093B3017093B40104\r
+:103250000C9476140F931F930091B1011091B20159\r
+:103260002091B3013091B401DC01CB01802B912B73\r
+:10327000A22BB32B8093B1019093B201A093B30121\r
+:10328000B093B4011F910F910C9476140F931F9378\r
+:103290000091B1011091B2012091B3013091B401BC\r
+:1032A000DC01CB0180239123A223B3238093B101BE\r
+:1032B0009093B201A093B301B093B4011F910F9109\r
+:1032C0000C9476140F931F930091B1011091B201E9\r
+:1032D0002091B3013091B401DC01CB01802791270B\r
+:1032E000A227B3278093B1019093B201A093B301B9\r
+:1032F000B093B4011F910F910C9476140895CF925E\r
+:10330000DF92EF92FF920F931F93CF93DF938C0185\r
+:10331000C090B501D090B601E090B701F090B8012F\r
+:103320008091B1019091B201A091B301B091B4012B\r
+:10333000C82AD92AEA2AFB2ACFE1D0E0D701C60160\r
+:103340000C2E04C0B695A795979587950A94D2F749\r
+:1033500080FF06C0B8018C2F0E945807019721F406\r
+:10336000219760F780E001C08C2FDF91CF911F91F2\r
+:103370000F91FF90EF90DF90CF900895CF93DF9360\r
+:10338000EC010E947F19BE010E945807DF91CF9186\r
+:103390000895CB010E94BE19089590910C019923C4\r
+:1033A00021F090910D01911109C020910E013091F1\r
+:1033B0000F01F90132969FEF40E01FC0982F9695BC\r
+:1033C000969596959F3050F5E0910E01F0910F0182\r
+:1033D000E90FF11D877021E030E0A90102C0440F20\r
+:1033E000551F8A95E2F7CA019181892B818308953F\r
+:1033F0009F3F39F04F5F4E3041F051915813F8CF55\r
+:103400000DC05111F7CF942FF5CF9F3F39F0F9013F\r
+:10341000E90FF11D97FDFA95828308950895909123\r
+:103420000C01992321F090910D01911109C0209177\r
+:103430000E0130910F01F9013296205F3F4F1FC0FE\r
+:10344000982F9695969596959F30F0F4E0910E0101\r
+:10345000F0910F01E90FF11D877021E030E0A90123\r
+:1034600002C0440F551F8A95E2F7CA0180959181E9\r
+:103470008923818308953196E217F30729F090811B\r
+:103480009813F9CF1082F7CF089581E090E0E09192\r
+:103490000E01F0910F01E80FF91F108201968031A3\r
+:1034A0009105A9F708959091CC01892B8093CC01C7\r
+:1034B000089580959091CC0189238093CC01089543\r
+:1034C0001092CC0108959091CB01892B8093CB0170\r
+:1034D000089580959091CB0189238093CB01089525\r
+:1034E0001092CB0108959091CA01892B8093CA0153\r
+:1034F000089580959091CA0189238093CA01089507\r
+:103500001092CA0108958093B90108951092B901EB\r
+:10351000089580910E0190910F01FC0131969C015C\r
+:10352000205F3F4F80E0919191118F5FE217F30789\r
+:10353000D1F70895E0910E01F0910F018091CC0137\r
+:103540008083E0910E01F0910F0190818091CB0179\r
+:10355000892B8083E0910E01F0910F019081809181\r
+:10356000CA01892B80838091B901882361F0E091A1\r
+:103570000E01F0910F019081892B80830E94891A9E\r
+:1035800081111092B90180910E0190910F010C945C\r
+:10359000060FCF92DF92EF92FF926C01EE24FF2490\r
+:1035A000C114D104E104F10421F0C701B60120E106\r
+:1035B00001C020E0C72ED82EE92EFF24C114D1046B\r
+:1035C000E104F10419F0285FC701B6016B017C0129\r
+:1035D00054E0F694E794D794C7945A95D1F7C11460\r
+:1035E000D104E104F10419F02C5FC701B6016B01AD\r
+:1035F0007C0142E0F694E794D794C7944A95D1F7BA\r
+:10360000C114D104E104F10419F02E5FC701B60121\r
+:10361000DC01CB01B695A79597958795892B8A2BC9\r
+:103620008B2B09F02F5F822FFF90EF90DF90CF90D0\r
+:1036300008958091E401843021F11092CE0120E4BC\r
+:1036400088E190E00FB6F894A895809360000FBED3\r
+:103650002093600080E00E94F30783B7817F84603D\r
+:1036600083BF83B7816083BF7894889583B78E7F4B\r
+:1036700083BF88E10FB6F8948093600010926000D9\r
+:103680000FBE089508950895CF930E94421B0E9493\r
+:1036900023040E94431BC0E08C2F0E94110581115E\r
+:1036A00004C0CF5FCE30C1F701C081E0CF91089553\r
+:1036B0000E948A140E94FA0E0C94F30782E084BDE3\r
+:1036C00093E095BD9AEF97BD80936E0008952FB754\r
+:1036D000F8948091CF019091D001A091D101B09147\r
+:1036E000D2012FBF0895CF92DF92EF92FF920F93F6\r
+:1036F0001F932FB7F8944091CF015091D001609162\r
+:10370000D1017091D2012FBF6A017B01EE24FF2409\r
+:103710008C0120E030E0C016D106E206F30610F47A\r
+:10372000415051099A01281B390BC9011F910F9172\r
+:10373000FF90EF90DF90CF9008951F920F920FB6F9\r
+:103740000F9211248F939F93AF93BF938091CF01DA\r
+:103750009091D001A091D101B091D2010196A11D0B\r
+:10376000B11D8093CF019093D001A093D101B0936C\r
+:10377000D201BF91AF919F918F910F900FBE0F908B\r
+:103780001F9018950E94F70BF8942FEF87EA91E6A7\r
+:10379000215080409040E1F700C0000087E090EBAE\r
+:1037A000DC018093EE019093EF01A093F001B093C0\r
+:1037B000F1019CE088E10FB6F894A8958093600031\r
+:1037C0000FBE90936000FFCFEF92FF920F931F9375\r
+:1037D000CF93DF93D82FC0E08C2F0E94110500E01B\r
+:1037E00010E0E82EF12CC701002E02C095958795B8\r
+:1037F0000A94E2F780FD06C00F5F1F4F06301105E7\r
+:1038000091F709C0602F7C2F80E00E941905D81322\r
+:10381000F3CF81E004C0CF5FCE30F1F680E0DF91DE\r
+:10382000CF911F910F91FF90EF900895CF93C82FE4\r
+:103830008CE20E94E41B882321F08C2FCF910C9402\r
+:10384000E41B80E0CF910895CF930E946B1D8111FE\r
+:1038500002C00E94511DC5E6C15049F00E942304D8\r
+:103860008FE39CE90197F1F700C00000F5CF89E2F2\r
+:103870000E94161C811113C18AE20E94161C81113C\r
+:103880000E94511D85E00E94161C81110E94C21BDE\r
+:103890000E94761D8093CD0187E00E94161C88232C\r
+:1038A000A9F18BE10E94161C882351F08091CD0173\r
+:1038B00081FB222720F991E0922790FB81F90EC02D\r
+:1038C0008EE00E94161C882361F08091CD0182FB5E\r
+:1038D000222720F991E0922790FB82F98093CD0175\r
+:1038E00015C080E10E94161C9091CD01882341F003\r
+:1038F00093FB222720F981E0822780FB93F904C003\r
+:10390000892F809580FB90F99093CD018091CD0116\r
+:103910000E947A1D0E94881D8093ED0180EE0E9416\r
+:10392000161C882341F08091ED01982F909590FB13\r
+:1039300080F98093ED0189E30E94161C882359F0D9\r
+:103940008091ED0181FB222720F991E0922790FBE5\r
+:1039500081F98093ED0182EE0E94161C882359F0B4\r
+:103960008091ED0182FB222720F991E0922790FBC4\r
+:1039700082F98093ED0186EE0E94161C882359F08F\r
+:103980008091ED0183FB222720F991E0922790FBA3\r
+:1039900083F98093ED0183EE0E94161C882359F071\r
+:1039A0008091ED0184FB222720F991E0922790FB82\r
+:1039B00084F98093ED0185E30E94161C882359F059\r
+:1039C0008091ED0185FB222720F991E0922790FB61\r
+:1039D00085F98093ED0181E30E94161C882359F03C\r
+:1039E0008091ED0186FB222720F991E0922790FB40\r
+:1039F00086F98093ED0181E10E94161C882359F01D\r
+:103A00008091ED0187FB222720F991E0922790FB1E\r
+:103A100087F98093ED018091ED010E948C1D8091CA\r
+:103A2000ED0187FB882780F980930D0187E20E94D2\r
+:103A3000161CC82F8EE10E94161C8111C2608FE1F6\r
+:103A40000E94161C8111C46080E20E94161C811124\r
+:103A5000C86081E20E94161C8111C06182E20E944E\r
+:103A6000161C8111C06283E20E94161C8111C06481\r
+:103A700084E20E94161C882311F0C06802C0CC2387\r
+:103A800029F08C2F0E94831D6C2F03C00E947F1D84\r
+:103A9000682F70E080E090E0CF910C944618CF91B1\r
+:103AA00008956DEE7EEF80E090E00E94BD2360E01F\r
+:103AB00082E090E00E94AB2360E083E090E00E940F\r
+:103AC000AB2360E084E090E00E94AB2360E085E0FF\r
+:103AD00090E00C94AB2380E090E00E94A52321E0CD\r
+:103AE0008D3E9E4F09F020E0822F089582E090E005\r
+:103AF0000C949D23682F82E090E00C94AB2383E02C\r
+:103B000090E00C949D23682F83E090E00C94AB230D\r
+:103B100084E090E00C949D23682F84E090E00C9466\r
+:103B2000AB238091D50180FF0BC06091130185E02C\r
+:103B3000689FB001112475956795759567952BC0A1\r
+:103B400081FF09C06091130185E0689FB0011124D5\r
+:103B50007595679520C082FF07C06091130185E0CD\r
+:103B6000689FB001112417C09091D6019923D1F01C\r
+:103B700060911201961788F72091130185E0289F24\r
+:103B800090011124929FA001939F500D112470E089\r
+:103B9000CA010E946F236038710540F461157105F8\r
+:103BA00039F002C065E070E0862F08958FE7089530\r
+:103BB00081E008958091D50180FF08C060911101D6\r
+:103BC00070E0759567957595679521C081FF06C072\r
+:103BD0006091110170E07595679519C082FF04C06E\r
+:103BE0006091110170E010C09091D6019923C1F04D\r
+:103BF000609110019617A0F780911101899FC00173\r
+:103C0000112470E00E946F236038710528F461155B\r
+:103C1000710521F0862F08958FE7089581E00895BA\r
+:103C200061E070E0F4CF803F21F40E94911D819506\r
+:103C300004C0813F29F40E94911D8093D901089509\r
+:103C4000823F21F40E94911D819504C0833F29F495\r
+:103C50000E94911D8093D8010895893F19F40E9414\r
+:103C6000DA1D05C08A3F31F40E94DA1D81958093E8\r
+:103C7000DA0108958B3F21F40E94DA1D819504C07A\r
+:103C80008C3F29F40E94DA1D8093DB010895843F64\r
+:103C900021F48091D701816017C0853F21F4809184\r
+:103CA000D701826011C0863F21F48091D7018460E2\r
+:103CB0000BC0873F21F48091D701886005C0883F01\r
+:103CC00031F48091D70180618093D70108958D3FB1\r
+:103CD00021F48091D50181600BC08E3F21F4809149\r
+:103CE000D501826005C08F3F29F48091D5018460A1\r
+:103CF0008093D5010895803F39F48091D90187FFE1\r
+:103D00006CC01092D90169C0813F29F48091D9011A\r
+:103D10001816BCF362C09091D801823F29F497FF36\r
+:103D20005CC01092D80159C0833F19F41916CCF326\r
+:103D300054C0893F41F48091DA0118160CF04DC04F\r
+:103D40001092DA014AC08A3F29F48091DA0187FF94\r
+:103D500044C0F6CF8B3F39F48091DB0187FF3DC033\r
+:103D60001092DB013AC08C3F29F48091DB011816D8\r
+:103D7000BCF333C0843F21F48091D7018E7F17C0FC\r
+:103D8000853F21F48091D7018D7F11C0863F21F4BA\r
+:103D90008091D7018B7F0BC0873F21F48091D701A1\r
+:103DA000877F05C0883F31F48091D7018F7E809353\r
+:103DB000D70113C08D3F21F48091D5018E7F0BC0B8\r
+:103DC0008E3F21F48091D5018D7F05C08F3F29F46E\r
+:103DD0008091D5018B7F8093D5018091D80181118D\r
+:103DE0000EC08091D90181110AC08091DA01811140\r
+:103DF00006C08091DB01811102C01092D6010895A6\r
+:103E000087ED91E00E94110F0E94671B9093D401EF\r
+:103E10008093D30108951F93CF93DF938091D301B3\r
+:103E20009091D4010E94731BAC019091D60199230B\r
+:103E300021F02091140130E006C0209115018AE0A4\r
+:103E4000289F900111244217530708F486C08091DF\r
+:103E5000D801C091D901D091DA011091DB01811113\r
+:103E600007C0C11176C0D11174C0111172C075C0E4\r
+:103E70009F3F19F09F5F9093D601181624F40E947B\r
+:103E8000911D8093D8018091D80187FF05C00E94C1\r
+:103E9000911D81958093D8011C1624F40E94911DD8\r
+:103EA0008093D9018091D90187FF05C00E94911D9F\r
+:103EB00081958093D9016091D801662339F1C09131\r
+:103EC000D901CC2319F1772767FD7095872F972F9C\r
+:103ED0000E94802223E333E343E35FE30E94E42272\r
+:103EE0000E944D226093D8016C2F772767FD709553\r
+:103EF000872F972F0E94802223E333E343E35FE37E\r
+:103F00000E94E4220E944D226093D9011D1624F4E0\r
+:103F10000E94DA1D8093DA018091DA0187FF05C0E3\r
+:103F20000E94DA1D81958093DA01111624F40E9413\r
+:103F3000DA1D8093DB018091DB0187FF05C00E94C1\r
+:103F4000DA1D81958093DB01DF91CF911F910C9455\r
+:103F5000001F9F3F09F08ECF96CFDF91CF911F9129\r
+:103F60000895E7EDF1E085E0DF011D928A95E9F71C\r
+:103F70001092D6011092D5010895833081F128F472\r
+:103F8000813059F08230D1F00895853009F449C06C\r
+:103F9000B8F1863009F456C0089580911501262F96\r
+:103FA00030E0280F311D2F3F310524F4680F609356\r
+:103FB000150108958FEF80931501089580911401E4\r
+:103FC000262F30E0280F311D2F3F310524F4680FD4\r
+:103FD0006093140108958FEF8093140108958091E8\r
+:103FE0001301262F30E0280F311D2F3F310524F417\r
+:103FF000680F6093130108958FEF80931301089564\r
+:1040000080911201262F30E0280F311D2F3F3105FE\r
+:1040100024F4680F6093120108958FEF80931201CA\r
+:10402000089580911101262F30E0280F311D2F3F78\r
+:10403000310524F4680F6093110108958FEF809388\r
+:104040001101089580911001262F30E0280F311DB5\r
+:104050002F3F310524F4680F6093100108958FEF0E\r
+:10406000809310010895833011F128F4813049F0D4\r
+:10407000823091F00895853081F120F18630C1F1D0\r
+:10408000089580911501681720F4861B809315010F\r
+:10409000089510921501089580911401681720F475\r
+:1040A000861B809314010895109214010895809145\r
+:1040B0001301681720F4861B809313010895109252\r
+:1040C0001301089580911201681720F4861B8093D4\r
+:1040D000120108951092120108958091110168173C\r
+:1040E00020F4861B80931101089510921101089508\r
+:1040F00080911001681720F4861B809310010895A9\r
+:104100001092100108950F931F938D3109F46BC025\r
+:1041100008F03FC08E3009F47FC0C0F4873009F446\r
+:1041200069C068F4863009F0B1C08091CD01817F0B\r
+:104130008E7F8093CD0181E08093DD01A8C088301F\r
+:1041400009F4A2C08B3009F49FC0A0C0863109F4E5\r
+:104150009BC078F4803109F472C0813109F096C0B7\r
+:104160000E948A1490910D0181E0892780930D01AE\r
+:104170008BC0893109F488C08B3109F087C08091E8\r
+:10418000CD0181FB222720F991E0922790FB81F954\r
+:104190004CC0853309F470C048F4873209F46CC010\r
+:1041A00008F459C0893209F467C070C0833438F408\r
+:1041B0008A3308F04EC0883309F466C067C0833480\r
+:1041C00009F45AC0883409F061C00E948A140FEFC4\r
+:1041D00013ED20E3015010402040E1F700C0000043\r
+:1041E0000E94C21B51C00E9407220E94FA0E0E9428\r
+:1041F000F3074AC09091CD01892F8095817080FB93\r
+:1042000090F929F0966098609093CD0140C0997F15\r
+:10421000977F9093CD0138C08091CD0182FB2227FA\r
+:1042200020F991E0922790FB82F98093CD019923A8\r
+:1042300059F18091CD0181608093CD0125C080919D\r
+:10424000CD0183FB222720F991E0922790FB83F98F\r
+:10425000ECCF895301C08D5141E050E060E070E047\r
+:104260008A019B0104C0000F111F221F331F8A9572\r
+:10427000D2F7C901B80104C061E070E080E090E0CD\r
+:104280000E9446180E948A1481E001C080E01F91BC\r
+:104290000F91089580E0089580E00895CF93C82F8E\r
+:1042A0008091DD01813079F018F08230E9F187C02A\r
+:1042B000E0910E01F0910F018081813169F082322D\r
+:1042C00009F07FC009C0E0910E01F0910F018081DB\r
+:1042D000813111F0823261F48C2F0E944A218111C8\r
+:1042E00004C08C2F0E9483201DC081E090E01AC082\r
+:1042F0008C2F0E944C21811114C0C43179F048F4F4\r
+:10430000CB3079F0C03109F060C082E08093DD01EC\r
+:1043100008C0C93219F0C83321F057C01092DD012E\r
+:1043200054C081E0817053C0C93289F118F5C4319D\r
+:1043300071F1A8F4C73009F046C08AE080931501F6\r
+:1043400094E19093140193E09093130180931201F0\r
+:1043500088E08093110188E28093100134C0CE512F\r
+:10436000C63088F5EC2FF0E0E65DFE4F808180934B\r
+:10437000DC0129C0CE34E9F020F4CB3421F56AE029\r
+:1043800013C0C13579F0C235F1F461E00DC0809100\r
+:10439000DC01882319F01092DC0115C081E08093C4\r
+:1043A000DD0115C061E006C08091DC010E94BD1FE7\r
+:1043B0000AC06AE08091DC010E94332004C01092A0\r
+:1043C000DD0180E004C081E002C080E0ABCFCF918E\r
+:1043D0000895E1E8F0E080818860808380818160D9\r
+:1043E00080838FB7F89493E09093890090ED909339\r
+:1043F00088008FBF0895EFE6F0E0808182608083BF\r
+:104400000895EFE6F0E080818D7F80830895EFE6E8\r
+:10441000F0E0908182E08927808308951F920F92B7\r
+:104420000FB60F9211242F933F934F935F936F9387\r
+:104430007F938F939F93AF93BF93EF93FF9380915D\r
+:10444000DE019091DF0101969093DF018093DE0100\r
+:10445000811103C082E00E94F307E091DF01E6953D\r
+:10446000E695F0E0E657FB4FE4918091DE018E1374\r
+:1044700003C080E00E94F307FF91EF91BF91AF91DD\r
+:104480009F918F917F916F915F914F913F912F916C\r
+:104490000F900FBE0F901F90189504D06894B11123\r
+:1044A0008DC0089570D088F09F5790F0B92F99274C\r
+:1044B000B751A0F0D1F0660F771F881F991F1AF02F\r
+:1044C000BA95C9F712C0B13081F077D0B1E0089544\r
+:1044D00074C0672F782F8827B85F39F0B93FCCF3C5\r
+:1044E000869577956795B395D9F73EF49095809525\r
+:1044F000709561957F4F8F4F9F4F0895E89409C045\r
+:1045000097FB3EF490958095709561957F4F8F4F06\r
+:104510009F4F9923A9F0F92F96E9BB279395F6951C\r
+:10452000879577956795B795F111F8CFFAF4BB0F9A\r
+:1045300011F460FF1BC06F5F7F4F8F4F9F4F16C0FE\r
+:10454000882311F096E911C0772321F09EE8872F88\r
+:10455000762F05C0662371F096E8862F70E060E044\r
+:104560002AF09A95660F771F881FDAF7880F9695BD\r
+:10457000879597F9089557FD9058440F551F59F0A6\r
+:104580005F3F71F04795880F97FB991F61F09F3F40\r
+:1045900079F087950895121613061406551FF2CF69\r
+:1045A0004695F1DF08C0161617061806991FF1CFB9\r
+:1045B00086957105610508940895E894BB276627E0\r
+:1045C0007727CB0197F908950BD078C069D028F0F0\r
+:1045D0006ED018F0952309F05AC05FC01124EECFB9\r
+:1045E000CADFA0F3959FD1F3950F50E0551F629F4E\r
+:1045F000F001729FBB27F00DB11D639FAA27F00D3C\r
+:10460000B11DAA1F649F6627B00DA11D661F829F62\r
+:104610002227B00DA11D621F739FB00DA11D621F47\r
+:10462000839FA00D611D221F749F3327A00D611D64\r
+:10463000231F849F600D211D822F762F6A2F112446\r
+:104640009F5750408AF0E1F088234AF0EE0FFF1F99\r
+:10465000BB1F661F771F881F91505040A9F79E3FD0\r
+:10466000510570F014C0AACF5F3FECF3983EDCF325\r
+:10467000869577956795B795F795E7959F5FC1F70D\r
+:10468000FE2B880F911D9695879597F9089597F9B8\r
+:104690009F6780E870E060E008959FEF80EC0895E8\r
+:1046A00000240A9416161706180609060895002411\r
+:1046B0000A9412161306140605060895092E03948B\r
+:1046C000000C11F4882352F0BB0F40F4BF2B11F4FF\r
+:1046D00060FF04C06F5F7F4F8F4F9F4F089597FB20\r
+:1046E000072E16F4009407D077FD09D00E94892385\r
+:1046F00007FC05D03EF4909581959F4F08957095E5\r
+:1047000061957F4F0895EE0FFF1F0590F491E02D06\r
+:104710000994AA1BBB1B51E107C0AA1FBB1FA61708\r
+:10472000B70710F0A61BB70B881F991F5A95A9F75A\r
+:1047300080959095BC01CD010895F999FECF92BD69\r
+:1047400081BDF89A992780B50895A8E1B0E042E0CC\r
+:1047500050E00C94C523262FF999FECF92BD81BD60\r
+:10476000F89A019700B4021639F01FBA20BD0FB6AF\r
+:10477000F894FA9AF99A0FBE08950196272F0E948D\r
+:10478000AC230C94AB23DC01CB01FC01F999FECFE7\r
+:1047900006C0F2BDE1BDF89A319600B40D924150C9\r
+:0A47A0005040B8F70895F894FFCFD9\r
+:1047AA002002F507830860082C08F8070101BA01FE\r
+:1047BA0028080A03140A3F4D36394B04FE03C8037E\r
+:1047CA008F0322033B0354036D030102030405060E\r
+:0447DA0007080900C3\r
+:00000001FF\r
index 75d264bdbeedf7377573a763179893dedaf9f3da..dec9f92f145847c56bf922dc9db2e5c9fb460303 100644 (file)
@@ -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();
 };
index 7d64f09773f97c5c32539dc2157a590d8833a8bf..d435cc795c5a402a4e88aa518d61bf51c1119167 100644 (file)
@@ -73,7 +73,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 /* disable debug print */
-//#define NO_DEBUG
+#define NO_DEBUG
 
 /* disable print */
 //#define NO_PRINT
index 27850b21540c2133789edaef80d70bb8f88b1848..830b00a4c464215f2044f2d79229d651217e297a 100644 (file)
@@ -96,7 +96,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
  [LAYER_QWERTY]       = { /* QWERTY */
   { KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC   },
-  { KC_BSPC, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT  },
+  { KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT  },
   { KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT   },
   { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC,  KC_SPC,  M_LOWER, KC_UP,   KC_DOWN, KC_LEFT, KC_RGHT  },
  },
@@ -115,7 +115,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
  [LAYER_COLEMAK]      = { /* COLEMAK */
   { KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_ESC   },
-  { KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT  },
+  { KC_BSPC, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT  },
   { KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT   },
   { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC,  KC_SPC,  M_LOWER, KC_UP,   KC_DOWN, KC_LEFT, KC_RGHT  },
  },
index 4b9e34c53fa25738d252135beb610e6bf9552237..b3f1b9e51c89d6c7a9d81636a7b59351f3ea1b7b 100644 (file)
@@ -4,6 +4,7 @@ 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 # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no  # Enable keyboard backlight functionality
 MIDI_ENABLE      = no  # MIDI controls
 AUDIO_ENABLE     = no  # Audio output on port C6
 UNICODE_ENABLE   = no  # Unicode
@@ -13,4 +14,4 @@ RGBLIGHT_ENABLE  = no  # Enable WS2812 RGB underlight.  Do not enable this with
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 SLEEP_LED_ENABLE = no  # Breathing sleep LED during USB suspend
 
-CONFIG_H = keymaps/$(KEYMAP)/config.h
+CONFIG_H = keymaps/$(KEYMAP)/config.h
\ No newline at end of file
index e85370d958381cd311972b43077aaacf42552d67..3a7f0f556701c3f1b25dcf6a15a2b802c90091d0 100644 (file)
@@ -1,6 +1,6 @@
 #include <stdio.h>
 #include <string.h>
-#include <math.h>
+//#include <math.h>
 #include <avr/pgmspace.h>
 #include <avr/interrupt.h>
 #include <avr/io.h>
 
 #include "eeconfig.h"
 
-#ifdef VIBRATO_ENABLE
-    #include "vibrato_lut.h"
-#endif
+#define CPU_PRESCALER 8
 
-#define PI 3.14159265
+// -----------------------------------------------------------------------------
+// Timer Abstractions
+// -----------------------------------------------------------------------------
 
-#define CPU_PRESCALER 8
+// TIMSK3 - Timer/Counter #3 Interrupt Mask Register
+// Turn on/off 3A interputs, stopping/enabling the ISR calls
+#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A)
+#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A)
 
-#ifdef PWM_AUDIO
-    #include "wave.h"
-    #define SAMPLE_DIVIDER 39
-    #define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048)
-    // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap
+// TCCR3A: Timer/Counter #3 Control Register
+// Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6
+#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1);
+#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0));
 
-    float places[8] = {0, 0, 0, 0, 0, 0, 0, 0};
-    uint16_t place_int = 0;
-    bool repeat = true;
-#endif
+// Fast PWM Mode Controls
+#define TIMER_3_PERIOD     ICR3
+#define TIMER_3_DUTY_CYCLE OCR3A
+
+// -----------------------------------------------------------------------------
 
-void delay_us(int count) {
-  while(count--) {
-    _delay_us(1);
-  }
-}
 
 int voices = 0;
 int voice_place = 0;
@@ -45,26 +43,23 @@ float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 bool sliding = false;
 
-int max = 0xFF;
-float sum = 0;
 float place = 0;
 
 uint8_t * sample;
 uint16_t sample_length = 0;
-// float freq = 0;
-
-bool notes = false;
-bool note = false;
-float note_frequency = 0;
-float note_length = 0;
-float note_tempo = TEMPO_DEFAULT;
-float note_timbre = TIMBRE_DEFAULT;
+
+bool     playing_notes = false;
+bool     playing_note = false;
+float    note_frequency = 0;
+float    note_length = 0;
+uint8_t  note_tempo = TEMPO_DEFAULT;
+float    note_timbre = TIMBRE_DEFAULT;
 uint16_t note_position = 0;
 float (* notes_pointer)[][2];
 uint16_t notes_count;
-bool notes_repeat;
-float notes_rest;
-bool note_resting = false;
+bool     notes_repeat;
+float    notes_rest;
+bool     note_resting = false;
 
 uint8_t current_note = 0;
 uint8_t rest_counter = 0;
@@ -77,175 +72,65 @@ float vibrato_rate = 0.125;
 
 float polyphony_rate = 0;
 
-bool inited = false;
+static bool audio_initialized = false;
 
 audio_config_t audio_config;
 
 uint16_t envelope_index = 0;
 
-void audio_toggle(void) {
-    audio_config.enable ^= 1;
-    eeconfig_update_audio(audio_config.raw);
-}
-
-void audio_on(void) {
-    audio_config.enable = 1;
-    eeconfig_update_audio(audio_config.raw);
-}
-
-void audio_off(void) {
-    audio_config.enable = 0;
-    eeconfig_update_audio(audio_config.raw);
-}
-
-#ifdef VIBRATO_ENABLE
-// Vibrato rate functions
-
-void set_vibrato_rate(float rate) {
-    vibrato_rate = rate;
-}
-
-void increase_vibrato_rate(float change) {
-    vibrato_rate *= change;
-}
-
-void decrease_vibrato_rate(float change) {
-    vibrato_rate /= change;
-}
-
-#ifdef VIBRATO_STRENGTH_ENABLE
-
-void set_vibrato_strength(float strength) {
-    vibrato_strength = strength;
-}
-
-void increase_vibrato_strength(float change) {
-    vibrato_strength *= change;
-}
-
-void decrease_vibrato_strength(float change) {
-    vibrato_strength /= change;
-}
-
-#endif
-
-#endif
-
-// Polyphony functions
-
-void set_polyphony_rate(float rate) {
-    polyphony_rate = rate;
-}
-
-void enable_polyphony() {
-    polyphony_rate = 5;
-}
-
-void disable_polyphony() {
-    polyphony_rate = 0;
-}
-
-void increase_polyphony_rate(float change) {
-    polyphony_rate *= change;
-}
-
-void decrease_polyphony_rate(float change) {
-    polyphony_rate /= change;
-}
-
-// Timbre function
-
-void set_timbre(float timbre) {
-    note_timbre = timbre;
-}
-
-// Tempo functions
-
-void set_tempo(float tempo) {
-    note_tempo = tempo;
-}
-
-void decrease_tempo(uint8_t tempo_change) {
-    note_tempo += (float) tempo_change;
-}
-
-void increase_tempo(uint8_t tempo_change) {
-    if (note_tempo - (float) tempo_change < 10) {
-        note_tempo = 10;
-    } else {
-        note_tempo -= (float) tempo_change;
-    }
-}
-
-void audio_init() {
+void audio_init()
+{
 
-    /* check signature */
-    if (!eeconfig_is_enabled()) {
+    // Check EEPROM
+    if (!eeconfig_is_enabled())
+    {
         eeconfig_init();
     }
     audio_config.raw = eeconfig_read_audio();
 
-    #ifdef PWM_AUDIO
-        PLLFRQ = _BV(PDIV2);
-        PLLCSR = _BV(PLLE);
-        while(!(PLLCSR & _BV(PLOCK)));
-        PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */
+       // Set port PC6 (OC3A and /OC4A) as output
+    DDRC |= _BV(PORTC6);
 
-        /* Init a fast PWM on Timer4 */
-        TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */
-        TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */
-        OCR4A = 0;
+    DISABLE_AUDIO_COUNTER_3_ISR;
 
-        /* Enable the OC4A output */
-        DDRC |= _BV(PORTC6);
+       // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers
+       // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6
+       // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A)
+       // Clock Select (CS3n) = 0b010 = Clock / 8
+    TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
+    TCCR3B = (1 << WGM33)  | (1 << WGM32)  | (0 << CS32)  | (1 << CS31) | (0 << CS30);
 
-        TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
-
-        TCCR3A = 0x0; // Options not needed
-        TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC
-        OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback
-    #else
-        DDRC |= _BV(PORTC6);
-
-        TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
-
-        TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
-        TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
-    #endif
-
-    inited = true;
+    audio_initialized = true;
 }
 
-void stop_all_notes() {
-    if (!inited) {
+void stop_all_notes()
+{
+    if (!audio_initialized) {
         audio_init();
     }
     voices = 0;
-    #ifdef PWM_AUDIO
-        TIMSK3 &= ~_BV(OCIE3A);
-    #else
-        TIMSK3 &= ~_BV(OCIE3A);
-        TCCR3A &= ~_BV(COM3A1);
-    #endif
-    notes = false;
-    note = false;
+
+    DISABLE_AUDIO_COUNTER_3_ISR;
+    DISABLE_AUDIO_COUNTER_3_OUTPUT;
+
+    playing_notes = false;
+    playing_note = false;
     frequency = 0;
     volume = 0;
 
-    for (int i = 0; i < 8; i++) {
+    for (uint8_t i = 0; i < 8; i++)
+    {
         frequencies[i] = 0;
         volumes[i] = 0;
     }
 }
 
-void stop_note(float freq) {
-    if (note) {
-        if (!inited) {
+void stop_note(float freq)
+{
+    if (playing_note) {
+        if (!audio_initialized) {
             audio_init();
         }
-        #ifdef PWM_AUDIO
-            freq = freq / SAMPLE_RATE;
-        #endif
         for (int i = 7; i >= 0; i--) {
             if (frequencies[i] == freq) {
                 frequencies[i] = 0;
@@ -266,15 +151,11 @@ void stop_note(float freq) {
             voice_place = 0;
         }
         if (voices == 0) {
-            #ifdef PWM_AUDIO
-                TIMSK3 &= ~_BV(OCIE3A);
-            #else
-                TIMSK3 &= ~_BV(OCIE3A);
-                TCCR3A &= ~_BV(COM3A1);
-            #endif
+            DISABLE_AUDIO_COUNTER_3_ISR;
+            DISABLE_AUDIO_COUNTER_3_OUTPUT;
             frequency = 0;
             volume = 0;
-            note = false;
+            playing_note = false;
         }
     }
 }
@@ -289,9 +170,9 @@ float mod(float a, int b)
 
 float vibrato(float average_freq) {
     #ifdef VIBRATO_STRENGTH_ENABLE
-        float vibrated_freq = average_freq * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength);
+        float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
     #else
-        float vibrated_freq = average_freq * VIBRATO_LUT[(int)vibrato_counter];
+        float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
     #endif
     vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH);
     return vibrated_freq;
@@ -299,295 +180,295 @@ 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) {
+void audio_toggle(void) {
+    audio_config.enable ^= 1;
+    eeconfig_update_audio(audio_config.raw);
+}
 
-    if (!inited) {
-        audio_init();
-    }
+void audio_on(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_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 +478,8 @@ void play_startup_tone()
 {
 }
 
-
-
 __attribute__ ((weak))
 void play_goodbye_tone()
 {
-
 }
 //------------------------------------------------------------------------------
index 89769507e1bf48175ea0905100060bcd28aa423f..3d706587abc7a146628d05b309e1aec51007cd28 100644 (file)
@@ -56,7 +56,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);
@@ -83,7 +83,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
\ No newline at end of file
diff --git a/quantum/audio/audio_pwm.c b/quantum/audio/audio_pwm.c
new file mode 100644 (file)
index 0000000..328a253
--- /dev/null
@@ -0,0 +1,643 @@
+#include <stdio.h>
+#include <string.h>
+//#include <math.h>
+#include <avr/pgmspace.h>
+#include <avr/interrupt.h>
+#include <avr/io.h>
+#include "print.h"
+#include "audio.h"
+#include "keymap_common.h"
+
+#include "eeconfig.h"
+
+#define PI 3.14159265
+
+#define CPU_PRESCALER 8
+
+
+// Timer Abstractions
+
+// TIMSK3 - Timer/Counter #3 Interrupt Mask Register
+// Turn on/off 3A interputs, stopping/enabling the ISR calls
+#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A)
+#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A)
+
+
+// TCCR3A: Timer/Counter #3 Control Register
+// Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6
+#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1);
+#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0));
+
+
+#define NOTE_PERIOD ICR3
+#define NOTE_DUTY_CYCLE OCR3A
+
+
+#ifdef PWM_AUDIO
+    #include "wave.h"
+    #define SAMPLE_DIVIDER 39
+    #define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048)
+    // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap
+
+    float places[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+    uint16_t place_int = 0;
+    bool repeat = true;
+#endif
+
+void delay_us(int count) {
+  while(count--) {
+    _delay_us(1);
+  }
+}
+
+int voices = 0;
+int voice_place = 0;
+float frequency = 0;
+int volume = 0;
+long position = 0;
+
+float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+bool sliding = false;
+
+float place = 0;
+
+uint8_t * sample;
+uint16_t sample_length = 0;
+// float freq = 0;
+
+bool     playing_notes = false;
+bool     playing_note = false;
+float    note_frequency = 0;
+float    note_length = 0;
+uint8_t  note_tempo = TEMPO_DEFAULT;
+float    note_timbre = TIMBRE_DEFAULT;
+uint16_t note_position = 0;
+float (* notes_pointer)[][2];
+uint16_t notes_count;
+bool     notes_repeat;
+float    notes_rest;
+bool     note_resting = false;
+
+uint8_t current_note = 0;
+uint8_t rest_counter = 0;
+
+#ifdef VIBRATO_ENABLE
+float vibrato_counter = 0;
+float vibrato_strength = .5;
+float vibrato_rate = 0.125;
+#endif
+
+float polyphony_rate = 0;
+
+static bool audio_initialized = false;
+
+audio_config_t audio_config;
+
+uint16_t envelope_index = 0;
+
+void audio_init() {
+
+    // Check EEPROM
+    if (!eeconfig_is_enabled())
+    {
+        eeconfig_init();
+    }
+    audio_config.raw = eeconfig_read_audio();
+
+    #ifdef PWM_AUDIO
+
+        PLLFRQ = _BV(PDIV2);
+        PLLCSR = _BV(PLLE);
+        while(!(PLLCSR & _BV(PLOCK)));
+        PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */
+
+        /* Init a fast PWM on Timer4 */
+        TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */
+        TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */
+        OCR4A = 0;
+
+        /* Enable the OC4A output */
+        DDRC |= _BV(PORTC6);
+
+        DISABLE_AUDIO_COUNTER_3_ISR; // Turn off 3A interputs
+
+        TCCR3A = 0x0; // Options not needed
+        TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC
+        OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback
+
+    #else
+
+       // Set port PC6 (OC3A and /OC4A) as output
+        DDRC |= _BV(PORTC6);
+
+        DISABLE_AUDIO_COUNTER_3_ISR;
+
+               // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers
+               // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6
+               // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A)
+               // Clock Select (CS3n) = 0b010 = Clock / 8
+        TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
+        TCCR3B = (1 << WGM33)  | (1 << WGM32)  | (0 << CS32)  | (1 << CS31) | (0 << CS30);
+
+    #endif
+
+    audio_initialized = true;
+}
+
+void stop_all_notes() {
+    if (!audio_initialized) {
+        audio_init();
+    }
+    voices = 0;
+    #ifdef PWM_AUDIO
+           DISABLE_AUDIO_COUNTER_3_ISR;
+    #else
+        DISABLE_AUDIO_COUNTER_3_ISR;
+        DISABLE_AUDIO_COUNTER_3_OUTPUT;
+    #endif
+
+    playing_notes = false;
+    playing_note = false;
+    frequency = 0;
+    volume = 0;
+
+    for (uint8_t i = 0; i < 8; i++)
+    {
+        frequencies[i] = 0;
+        volumes[i] = 0;
+    }
+}
+
+void stop_note(float freq)
+{
+    if (playing_note) {
+        if (!audio_initialized) {
+            audio_init();
+        }
+        #ifdef PWM_AUDIO
+            freq = freq / SAMPLE_RATE;
+        #endif
+        for (int i = 7; i >= 0; i--) {
+            if (frequencies[i] == freq) {
+                frequencies[i] = 0;
+                volumes[i] = 0;
+                for (int j = i; (j < 7); j++) {
+                    frequencies[j] = frequencies[j+1];
+                    frequencies[j+1] = 0;
+                    volumes[j] = volumes[j+1];
+                    volumes[j+1] = 0;
+                }
+                break;
+            }
+        }
+        voices--;
+        if (voices < 0)
+            voices = 0;
+        if (voice_place >= voices) {
+            voice_place = 0;
+        }
+        if (voices == 0) {
+            #ifdef PWM_AUDIO
+                DISABLE_AUDIO_COUNTER_3_ISR;
+            #else
+                DISABLE_AUDIO_COUNTER_3_ISR;
+                DISABLE_AUDIO_COUNTER_3_OUTPUT;
+            #endif
+            frequency = 0;
+            volume = 0;
+            playing_note = false;
+        }
+    }
+}
+
+#ifdef VIBRATO_ENABLE
+
+float mod(float a, int b)
+{
+    float r = fmod(a, b);
+    return r < 0 ? r + b : r;
+}
+
+float vibrato(float average_freq) {
+    #ifdef VIBRATO_STRENGTH_ENABLE
+        float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
+    #else
+        float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
+    #endif
+    vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH);
+    return vibrated_freq;
+}
+
+#endif
+
+ISR(TIMER3_COMPA_vect)
+{
+    if (playing_note) {
+        #ifdef PWM_AUDIO
+            if (voices == 1) {
+                // SINE
+                OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2;
+
+                // SQUARE
+                // if (((int)place) >= 1024){
+                //     OCR4A = 0xFF >> 2;
+                // } else {
+                //     OCR4A = 0x00;
+                // }
+
+                // SAWTOOTH
+                // OCR4A = (int)place / 4;
+
+                // TRIANGLE
+                // if (((int)place) >= 1024) {
+                //     OCR4A = (int)place / 2;
+                // } else {
+                //     OCR4A = 2048 - (int)place / 2;
+                // }
+
+                place += frequency;
+
+                if (place >= SINE_LENGTH)
+                    place -= SINE_LENGTH;
+
+            } else {
+                int sum = 0;
+                for (int i = 0; i < voices; i++) {
+                    // SINE
+                    sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2;
+
+                    // SQUARE
+                    // if (((int)places[i]) >= 1024){
+                    //     sum += 0xFF >> 2;
+                    // } else {
+                    //     sum += 0x00;
+                    // }
+
+                    places[i] += frequencies[i];
+
+                    if (places[i] >= SINE_LENGTH)
+                        places[i] -= SINE_LENGTH;
+                }
+                OCR4A = sum;
+            }
+        #else
+            if (voices > 0) {
+                float freq;
+                if (polyphony_rate > 0) {
+                    if (voices > 1) {
+                        voice_place %= voices;
+                        if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) {
+                            voice_place = (voice_place + 1) % voices;
+                            place = 0.0;
+                        }
+                    }
+                    #ifdef VIBRATO_ENABLE
+                    if (vibrato_strength > 0) {
+                        freq = vibrato(frequencies[voice_place]);
+                    } else {
+                    #else
+                    {
+                    #endif
+                        freq = frequencies[voice_place];
+                    }
+                } else {
+                    if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) {
+                        frequency = frequency * pow(2, 440/frequency/12/2);
+                    } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) {
+                        frequency = frequency * pow(2, -440/frequency/12/2);
+                    } else {
+                        frequency = frequencies[voices - 1];
+                    }
+
+
+                    #ifdef VIBRATO_ENABLE
+                    if (vibrato_strength > 0) {
+                        freq = vibrato(frequency);
+                    } else {
+                    #else
+                    {
+                    #endif
+                        freq = frequency;
+                    }
+                }
+
+                if (envelope_index < 65535) {
+                    envelope_index++;
+                }
+                freq = voice_envelope(freq);
+
+                if (freq < 30.517578125)
+                    freq = 30.52;
+                NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period
+                NOTE_DUTY_CYCLE = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
+            }
+        #endif
+    }
+
+    // SAMPLE
+    // OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]);
+
+    // place_int++;
+
+    // if (place_int >= sample_length)
+    //     if (repeat)
+    //         place_int -= sample_length;
+    //     else
+    //         DISABLE_AUDIO_COUNTER_3_ISR;
+
+
+    if (playing_notes) {
+        #ifdef PWM_AUDIO
+            OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0;
+
+            place += note_frequency;
+            if (place >= SINE_LENGTH)
+                place -= SINE_LENGTH;
+        #else
+            if (note_frequency > 0) {
+                float freq;
+
+                #ifdef VIBRATO_ENABLE
+                if (vibrato_strength > 0) {
+                    freq = vibrato(note_frequency);
+                } else {
+                #else
+                {
+                #endif
+                    freq = note_frequency;
+                }
+
+                if (envelope_index < 65535) {
+                    envelope_index++;
+                }
+                freq = voice_envelope(freq);
+
+                NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period
+                NOTE_DUTY_CYCLE = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
+            } else {
+                NOTE_PERIOD = 0;
+                NOTE_DUTY_CYCLE = 0;
+            }
+        #endif
+
+
+        note_position++;
+        bool end_of_note = false;
+        if (NOTE_PERIOD > 0)
+            end_of_note = (note_position >= (note_length / NOTE_PERIOD * 0xFFFF));
+        else
+            end_of_note = (note_position >= (note_length * 0x7FF));
+        if (end_of_note) {
+            current_note++;
+            if (current_note >= notes_count) {
+                if (notes_repeat) {
+                    current_note = 0;
+                } else {
+                    #ifdef PWM_AUDIO
+                        DISABLE_AUDIO_COUNTER_3_ISR;
+                    #else
+                        DISABLE_AUDIO_COUNTER_3_ISR;
+                        DISABLE_AUDIO_COUNTER_3_OUTPUT;
+                    #endif
+                    playing_notes = false;
+                    return;
+                }
+            }
+            if (!note_resting && (notes_rest > 0)) {
+                note_resting = true;
+                note_frequency = 0;
+                note_length = notes_rest;
+                current_note--;
+            } else {
+                note_resting = false;
+                #ifdef PWM_AUDIO
+                    note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
+                    note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100);
+                #else
+                    envelope_index = 0;
+                    note_frequency = (*notes_pointer)[current_note][0];
+                    note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
+                #endif
+            }
+            note_position = 0;
+        }
+
+    }
+
+    if (!audio_config.enable) {
+        playing_notes = false;
+        playing_note = false;
+    }
+}
+
+void play_note(float freq, int vol) {
+
+    if (!audio_initialized) {
+        audio_init();
+    }
+
+       if (audio_config.enable && voices < 8) {
+           DISABLE_AUDIO_COUNTER_3_ISR;
+
+           // Cancel notes if notes are playing
+           if (playing_notes)
+               stop_all_notes();
+
+           playing_note = true;
+
+           envelope_index = 0;
+
+           #ifdef PWM_AUDIO
+               freq = freq / SAMPLE_RATE;
+           #endif
+           if (freq > 0) {
+               frequencies[voices] = freq;
+               volumes[voices] = vol;
+               voices++;
+           }
+
+           #ifdef PWM_AUDIO
+               ENABLE_AUDIO_COUNTER_3_ISR;
+           #else
+               ENABLE_AUDIO_COUNTER_3_ISR;
+               ENABLE_AUDIO_COUNTER_3_OUTPUT;
+           #endif
+       }
+
+}
+
+void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest)
+{
+
+    if (!audio_initialized) {
+        audio_init();
+    }
+
+       if (audio_config.enable) {
+
+           DISABLE_AUDIO_COUNTER_3_ISR;
+
+               // Cancel note if a note is playing
+           if (playing_note)
+               stop_all_notes();
+
+           playing_notes = true;
+
+           notes_pointer = np;
+           notes_count = n_count;
+           notes_repeat = n_repeat;
+           notes_rest = n_rest;
+
+           place = 0;
+           current_note = 0;
+
+           #ifdef PWM_AUDIO
+               note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
+               note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100);
+           #else
+               note_frequency = (*notes_pointer)[current_note][0];
+               note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
+           #endif
+           note_position = 0;
+
+
+           #ifdef PWM_AUDIO
+               ENABLE_AUDIO_COUNTER_3_ISR;
+           #else
+               ENABLE_AUDIO_COUNTER_3_ISR;
+               ENABLE_AUDIO_COUNTER_3_OUTPUT;
+           #endif
+       }
+
+}
+
+#ifdef PWM_AUDIO
+void play_sample(uint8_t * s, uint16_t l, bool r) {
+    if (!audio_initialized) {
+        audio_init();
+    }
+
+    if (audio_config.enable) {
+        DISABLE_AUDIO_COUNTER_3_ISR;
+        stop_all_notes();
+        place_int = 0;
+        sample = s;
+        sample_length = l;
+        repeat = r;
+
+        ENABLE_AUDIO_COUNTER_3_ISR;
+    }
+}
+#endif
+
+
+void audio_toggle(void) {
+    audio_config.enable ^= 1;
+    eeconfig_update_audio(audio_config.raw);
+}
+
+void audio_on(void) {
+    audio_config.enable = 1;
+    eeconfig_update_audio(audio_config.raw);
+}
+
+void audio_off(void) {
+    audio_config.enable = 0;
+    eeconfig_update_audio(audio_config.raw);
+}
+
+#ifdef VIBRATO_ENABLE
+
+// Vibrato rate functions
+
+void set_vibrato_rate(float rate) {
+    vibrato_rate = rate;
+}
+
+void increase_vibrato_rate(float change) {
+    vibrato_rate *= change;
+}
+
+void decrease_vibrato_rate(float change) {
+    vibrato_rate /= change;
+}
+
+#ifdef VIBRATO_STRENGTH_ENABLE
+
+void set_vibrato_strength(float strength) {
+    vibrato_strength = strength;
+}
+
+void increase_vibrato_strength(float change) {
+    vibrato_strength *= change;
+}
+
+void decrease_vibrato_strength(float change) {
+    vibrato_strength /= change;
+}
+
+#endif  /* VIBRATO_STRENGTH_ENABLE */
+
+#endif /* VIBRATO_ENABLE */
+
+// Polyphony functions
+
+void set_polyphony_rate(float rate) {
+    polyphony_rate = rate;
+}
+
+void enable_polyphony() {
+    polyphony_rate = 5;
+}
+
+void disable_polyphony() {
+    polyphony_rate = 0;
+}
+
+void increase_polyphony_rate(float change) {
+    polyphony_rate *= change;
+}
+
+void decrease_polyphony_rate(float change) {
+    polyphony_rate /= change;
+}
+
+// Timbre function
+
+void set_timbre(float timbre) {
+    note_timbre = timbre;
+}
+
+// Tempo functions
+
+void set_tempo(uint8_t tempo) {
+    note_tempo = tempo;
+}
+
+void decrease_tempo(uint8_t tempo_change) {
+    note_tempo += tempo_change;
+}
+
+void increase_tempo(uint8_t tempo_change) {
+    if (note_tempo - tempo_change < 10) {
+        note_tempo = 10;
+    } else {
+        note_tempo -= tempo_change;
+    }
+}
+
+
+//------------------------------------------------------------------------------
+// Override these functions in your keymap file to play different tunes on
+// startup and bootloader jump
+__attribute__ ((weak))
+void play_startup_tone()
+{
+}
+
+__attribute__ ((weak))
+void play_goodbye_tone()
+{
+}
+//------------------------------------------------------------------------------
diff --git a/quantum/audio/frequency_lut.h b/quantum/audio/frequency_lut.h
deleted file mode 100644 (file)
index e62da5b..0000000
+++ /dev/null
@@ -1,357 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <avr/pgmspace.h>
-
-#define FREQUENCY_LUT_LENGTH 349
-
-const uint16_t FREQUENCY_LUT[FREQUENCY_LUT_LENGTH] = {
-0x8E0B,
-0x8C02,
-0x8A00,
-0x8805,
-0x8612,
-0x8426,
-0x8241,
-0x8063,
-0x7E8C,
-0x7CBB,
-0x7AF2,
-0x792E,
-0x7772,
-0x75BB,
-0x740B,
-0x7261,
-0x70BD,
-0x6F20,
-0x6D88,
-0x6BF6,
-0x6A69,
-0x68E3,
-0x6762,
-0x65E6,
-0x6470,
-0x6300,
-0x6194,
-0x602E,
-0x5ECD,
-0x5D71,
-0x5C1A,
-0x5AC8,
-0x597B,
-0x5833,
-0x56EF,
-0x55B0,
-0x5475,
-0x533F,
-0x520E,
-0x50E1,
-0x4FB8,
-0x4E93,
-0x4D73,
-0x4C57,
-0x4B3E,
-0x4A2A,
-0x491A,
-0x480E,
-0x4705,
-0x4601,
-0x4500,
-0x4402,
-0x4309,
-0x4213,
-0x4120,
-0x4031,
-0x3F46,
-0x3E5D,
-0x3D79,
-0x3C97,
-0x3BB9,
-0x3ADD,
-0x3A05,
-0x3930,
-0x385E,
-0x3790,
-0x36C4,
-0x35FB,
-0x3534,
-0x3471,
-0x33B1,
-0x32F3,
-0x3238,
-0x3180,
-0x30CA,
-0x3017,
-0x2F66,
-0x2EB8,
-0x2E0D,
-0x2D64,
-0x2CBD,
-0x2C19,
-0x2B77,
-0x2AD8,
-0x2A3A,
-0x299F,
-0x2907,
-0x2870,
-0x27DC,
-0x2749,
-0x26B9,
-0x262B,
-0x259F,
-0x2515,
-0x248D,
-0x2407,
-0x2382,
-0x2300,
-0x2280,
-0x2201,
-0x2184,
-0x2109,
-0x2090,
-0x2018,
-0x1FA3,
-0x1F2E,
-0x1EBC,
-0x1E4B,
-0x1DDC,
-0x1D6E,
-0x1D02,
-0x1C98,
-0x1C2F,
-0x1BC8,
-0x1B62,
-0x1AFD,
-0x1A9A,
-0x1A38,
-0x19D8,
-0x1979,
-0x191C,
-0x18C0,
-0x1865,
-0x180B,
-0x17B3,
-0x175C,
-0x1706,
-0x16B2,
-0x165E,
-0x160C,
-0x15BB,
-0x156C,
-0x151D,
-0x14CF,
-0x1483,
-0x1438,
-0x13EE,
-0x13A4,
-0x135C,
-0x1315,
-0x12CF,
-0x128A,
-0x1246,
-0x1203,
-0x11C1,
-0x1180,
-0x1140,
-0x1100,
-0x10C2,
-0x1084,
-0x1048,
-0x100C,
-0xFD1,
-0xF97,
-0xF5E,
-0xF25,
-0xEEE,
-0xEB7,
-0xE81,
-0xE4C,
-0xE17,
-0xDE4,
-0xDB1,
-0xD7E,
-0xD4D,
-0xD1C,
-0xCEC,
-0xCBC,
-0xC8E,
-0xC60,
-0xC32,
-0xC05,
-0xBD9,
-0xBAE,
-0xB83,
-0xB59,
-0xB2F,
-0xB06,
-0xADD,
-0xAB6,
-0xA8E,
-0xA67,
-0xA41,
-0xA1C,
-0x9F7,
-0x9D2,
-0x9AE,
-0x98A,
-0x967,
-0x945,
-0x923,
-0x901,
-0x8E0,
-0x8C0,
-0x8A0,
-0x880,
-0x861,
-0x842,
-0x824,
-0x806,
-0x7E8,
-0x7CB,
-0x7AF,
-0x792,
-0x777,
-0x75B,
-0x740,
-0x726,
-0x70B,
-0x6F2,
-0x6D8,
-0x6BF,
-0x6A6,
-0x68E,
-0x676,
-0x65E,
-0x647,
-0x630,
-0x619,
-0x602,
-0x5EC,
-0x5D7,
-0x5C1,
-0x5AC,
-0x597,
-0x583,
-0x56E,
-0x55B,
-0x547,
-0x533,
-0x520,
-0x50E,
-0x4FB,
-0x4E9,
-0x4D7,
-0x4C5,
-0x4B3,
-0x4A2,
-0x491,
-0x480,
-0x470,
-0x460,
-0x450,
-0x440,
-0x430,
-0x421,
-0x412,
-0x403,
-0x3F4,
-0x3E5,
-0x3D7,
-0x3C9,
-0x3BB,
-0x3AD,
-0x3A0,
-0x393,
-0x385,
-0x379,
-0x36C,
-0x35F,
-0x353,
-0x347,
-0x33B,
-0x32F,
-0x323,
-0x318,
-0x30C,
-0x301,
-0x2F6,
-0x2EB,
-0x2E0,
-0x2D6,
-0x2CB,
-0x2C1,
-0x2B7,
-0x2AD,
-0x2A3,
-0x299,
-0x290,
-0x287,
-0x27D,
-0x274,
-0x26B,
-0x262,
-0x259,
-0x251,
-0x248,
-0x240,
-0x238,
-0x230,
-0x228,
-0x220,
-0x218,
-0x210,
-0x209,
-0x201,
-0x1FA,
-0x1F2,
-0x1EB,
-0x1E4,
-0x1DD,
-0x1D6,
-0x1D0,
-0x1C9,
-0x1C2,
-0x1BC,
-0x1B6,
-0x1AF,
-0x1A9,
-0x1A3,
-0x19D,
-0x197,
-0x191,
-0x18C,
-0x186,
-0x180,
-0x17B,
-0x175,
-0x170,
-0x16B,
-0x165,
-0x160,
-0x15B,
-0x156,
-0x151,
-0x14C,
-0x148,
-0x143,
-0x13E,
-0x13A,
-0x135,
-0x131,
-0x12C,
-0x128,
-0x124,
-0x120,
-0x11C,
-0x118,
-0x114,
-0x110,
-0x10C,
-0x108,
-0x104,
-0x100,
-0xFD,
-0xF9,
-0xF5,
-0xF2,
-0xEE
-};
\ No newline at end of file
diff --git a/quantum/audio/luts.c b/quantum/audio/luts.c
new file mode 100644 (file)
index 0000000..9f3de9a
--- /dev/null
@@ -0,0 +1,382 @@
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/pgmspace.h>
+#include "luts.h"
+
+const float vibrato_lut[VIBRATO_LUT_LENGTH] =
+{
+       1.0022336811487,
+       1.0042529943610,
+       1.0058584256028,
+       1.0068905285205,
+       1.0072464122237,
+       1.0068905285205,
+       1.0058584256028,
+       1.0042529943610,
+       1.0022336811487,
+       1.0000000000000,
+       0.9977712970630,
+       0.9957650169978,
+       0.9941756956510,
+       0.9931566259436,
+       0.9928057204913,
+       0.9931566259436,
+       0.9941756956510,
+       0.9957650169978,
+       0.9977712970630,
+       1.0000000000000,
+};
+
+const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH] =
+{
+       0x8E0B,
+       0x8C02,
+       0x8A00,
+       0x8805,
+       0x8612,
+       0x8426,
+       0x8241,
+       0x8063,
+       0x7E8C,
+       0x7CBB,
+       0x7AF2,
+       0x792E,
+       0x7772,
+       0x75BB,
+       0x740B,
+       0x7261,
+       0x70BD,
+       0x6F20,
+       0x6D88,
+       0x6BF6,
+       0x6A69,
+       0x68E3,
+       0x6762,
+       0x65E6,
+       0x6470,
+       0x6300,
+       0x6194,
+       0x602E,
+       0x5ECD,
+       0x5D71,
+       0x5C1A,
+       0x5AC8,
+       0x597B,
+       0x5833,
+       0x56EF,
+       0x55B0,
+       0x5475,
+       0x533F,
+       0x520E,
+       0x50E1,
+       0x4FB8,
+       0x4E93,
+       0x4D73,
+       0x4C57,
+       0x4B3E,
+       0x4A2A,
+       0x491A,
+       0x480E,
+       0x4705,
+       0x4601,
+       0x4500,
+       0x4402,
+       0x4309,
+       0x4213,
+       0x4120,
+       0x4031,
+       0x3F46,
+       0x3E5D,
+       0x3D79,
+       0x3C97,
+       0x3BB9,
+       0x3ADD,
+       0x3A05,
+       0x3930,
+       0x385E,
+       0x3790,
+       0x36C4,
+       0x35FB,
+       0x3534,
+       0x3471,
+       0x33B1,
+       0x32F3,
+       0x3238,
+       0x3180,
+       0x30CA,
+       0x3017,
+       0x2F66,
+       0x2EB8,
+       0x2E0D,
+       0x2D64,
+       0x2CBD,
+       0x2C19,
+       0x2B77,
+       0x2AD8,
+       0x2A3A,
+       0x299F,
+       0x2907,
+       0x2870,
+       0x27DC,
+       0x2749,
+       0x26B9,
+       0x262B,
+       0x259F,
+       0x2515,
+       0x248D,
+       0x2407,
+       0x2382,
+       0x2300,
+       0x2280,
+       0x2201,
+       0x2184,
+       0x2109,
+       0x2090,
+       0x2018,
+       0x1FA3,
+       0x1F2E,
+       0x1EBC,
+       0x1E4B,
+       0x1DDC,
+       0x1D6E,
+       0x1D02,
+       0x1C98,
+       0x1C2F,
+       0x1BC8,
+       0x1B62,
+       0x1AFD,
+       0x1A9A,
+       0x1A38,
+       0x19D8,
+       0x1979,
+       0x191C,
+       0x18C0,
+       0x1865,
+       0x180B,
+       0x17B3,
+       0x175C,
+       0x1706,
+       0x16B2,
+       0x165E,
+       0x160C,
+       0x15BB,
+       0x156C,
+       0x151D,
+       0x14CF,
+       0x1483,
+       0x1438,
+       0x13EE,
+       0x13A4,
+       0x135C,
+       0x1315,
+       0x12CF,
+       0x128A,
+       0x1246,
+       0x1203,
+       0x11C1,
+       0x1180,
+       0x1140,
+       0x1100,
+       0x10C2,
+       0x1084,
+       0x1048,
+       0x100C,
+       0xFD1,
+       0xF97,
+       0xF5E,
+       0xF25,
+       0xEEE,
+       0xEB7,
+       0xE81,
+       0xE4C,
+       0xE17,
+       0xDE4,
+       0xDB1,
+       0xD7E,
+       0xD4D,
+       0xD1C,
+       0xCEC,
+       0xCBC,
+       0xC8E,
+       0xC60,
+       0xC32,
+       0xC05,
+       0xBD9,
+       0xBAE,
+       0xB83,
+       0xB59,
+       0xB2F,
+       0xB06,
+       0xADD,
+       0xAB6,
+       0xA8E,
+       0xA67,
+       0xA41,
+       0xA1C,
+       0x9F7,
+       0x9D2,
+       0x9AE,
+       0x98A,
+       0x967,
+       0x945,
+       0x923,
+       0x901,
+       0x8E0,
+       0x8C0,
+       0x8A0,
+       0x880,
+       0x861,
+       0x842,
+       0x824,
+       0x806,
+       0x7E8,
+       0x7CB,
+       0x7AF,
+       0x792,
+       0x777,
+       0x75B,
+       0x740,
+       0x726,
+       0x70B,
+       0x6F2,
+       0x6D8,
+       0x6BF,
+       0x6A6,
+       0x68E,
+       0x676,
+       0x65E,
+       0x647,
+       0x630,
+       0x619,
+       0x602,
+       0x5EC,
+       0x5D7,
+       0x5C1,
+       0x5AC,
+       0x597,
+       0x583,
+       0x56E,
+       0x55B,
+       0x547,
+       0x533,
+       0x520,
+       0x50E,
+       0x4FB,
+       0x4E9,
+       0x4D7,
+       0x4C5,
+       0x4B3,
+       0x4A2,
+       0x491,
+       0x480,
+       0x470,
+       0x460,
+       0x450,
+       0x440,
+       0x430,
+       0x421,
+       0x412,
+       0x403,
+       0x3F4,
+       0x3E5,
+       0x3D7,
+       0x3C9,
+       0x3BB,
+       0x3AD,
+       0x3A0,
+       0x393,
+       0x385,
+       0x379,
+       0x36C,
+       0x35F,
+       0x353,
+       0x347,
+       0x33B,
+       0x32F,
+       0x323,
+       0x318,
+       0x30C,
+       0x301,
+       0x2F6,
+       0x2EB,
+       0x2E0,
+       0x2D6,
+       0x2CB,
+       0x2C1,
+       0x2B7,
+       0x2AD,
+       0x2A3,
+       0x299,
+       0x290,
+       0x287,
+       0x27D,
+       0x274,
+       0x26B,
+       0x262,
+       0x259,
+       0x251,
+       0x248,
+       0x240,
+       0x238,
+       0x230,
+       0x228,
+       0x220,
+       0x218,
+       0x210,
+       0x209,
+       0x201,
+       0x1FA,
+       0x1F2,
+       0x1EB,
+       0x1E4,
+       0x1DD,
+       0x1D6,
+       0x1D0,
+       0x1C9,
+       0x1C2,
+       0x1BC,
+       0x1B6,
+       0x1AF,
+       0x1A9,
+       0x1A3,
+       0x19D,
+       0x197,
+       0x191,
+       0x18C,
+       0x186,
+       0x180,
+       0x17B,
+       0x175,
+       0x170,
+       0x16B,
+       0x165,
+       0x160,
+       0x15B,
+       0x156,
+       0x151,
+       0x14C,
+       0x148,
+       0x143,
+       0x13E,
+       0x13A,
+       0x135,
+       0x131,
+       0x12C,
+       0x128,
+       0x124,
+       0x120,
+       0x11C,
+       0x118,
+       0x114,
+       0x110,
+       0x10C,
+       0x108,
+       0x104,
+       0x100,
+       0xFD,
+       0xF9,
+       0xF5,
+       0xF2,
+       0xEE,
+};
+
diff --git a/quantum/audio/luts.h b/quantum/audio/luts.h
new file mode 100644 (file)
index 0000000..7df3078
--- /dev/null
@@ -0,0 +1,15 @@
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/pgmspace.h>
+
+#ifndef LUTS_H
+#define LUTS_H
+
+#define VIBRATO_LUT_LENGTH 20
+
+#define FREQUENCY_LUT_LENGTH 349
+
+extern const float vibrato_lut[VIBRATO_LUT_LENGTH];
+extern const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH];
+
+#endif /* LUTS_H */
\ No newline at end of file
diff --git a/quantum/audio/vibrato_lut.h b/quantum/audio/vibrato_lut.h
deleted file mode 100644 (file)
index a2b1f3e..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <avr/pgmspace.h>
-
-#define VIBRATO_LUT_LENGTH 20
-
-const float VIBRATO_LUT[VIBRATO_LUT_LENGTH] = { \
-1.00223368114872,
-1.00425299436105,
-1.00585842560279,
-1.00689052852052,
-1.0072464122237,
-1.00689052852052,
-1.00585842560279,
-1.00425299436105,
-1.00223368114872,
-1,
-0.99777129706302,
-0.99576501699778,
-0.994175695650927,
-0.993156625943589,
-0.992805720491269,
-0.993156625943589,
-0.994175695650927,
-0.99576501699778,
-0.99777129706302,
-1
-};
\ No newline at end of file
index d2316ba1b3bfebf01c1e51bf7248e1bf2f8b5061..6d4172a06c2dedd3def472ea500ec233f69eb4a8 100644 (file)
@@ -1,6 +1,6 @@
 #include "voices.h"
+#include "audio.h"
 #include "stdlib.h"
-#include "vibrato_lut.h"
 
 // these are imported from audio.c
 extern uint16_t envelope_index;
@@ -109,7 +109,7 @@ float voice_envelope(float frequency) {
                 case 0 ... VOICE_VIBRATO_DELAY:
                     break;
                 default:
-                    frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
+                    frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
                     break;
             }
             break;
@@ -160,4 +160,6 @@ float voice_envelope(float frequency) {
     }
 
     return frequency;
-}
\ No newline at end of file
+}
+
+
index 74c873f42f042f9ed3982734cd75db8135422f20..b2495b23b57b796c927f180936ba8c86101fddd3 100644 (file)
@@ -2,8 +2,7 @@
 #include <stdbool.h>
 #include <avr/io.h>
 #include <util/delay.h>
-#include "musical_notes.h"
-#include "song_list.h"
+#include "luts.h"
 
 #ifndef VOICES_H
 #define VOICES_H
index 4b4bd62109b3243e7d62ff7bc7cff4bc4b1c3ab7..5e78d1157d865ca0ee93894e23246659735bd2d0 100644 (file)
@@ -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>
index 83c4f1d1db82f8dd833b2a7f1903e5f3af7426d9..4a076eca4de60ea2bf5b63d550cc75663456bb3d 100644 (file)
@@ -29,6 +29,7 @@ endif
 
 ifeq ($(strip $(AUDIO_ENABLE)), yes)
        SRC += $(QUANTUM_DIR)/audio/audio.c $(QUANTUM_DIR)/audio/voices.c
+       SRC += $(QUANTUM_DIR)/audio/audio.c $(QUANTUM_DIR)/audio/luts.c
 endif
 
 ifeq ($(strip $(UNICODE_ENABLE)), yes)