]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
Merge remote-tracking branch 'tmk/master'
authorMark Sikora <marknsikora@gmail.com>
Tue, 5 Mar 2019 06:06:40 +0000 (01:06 -0500)
committerMark Sikora <marknsikora@gmail.com>
Tue, 5 Mar 2019 06:06:40 +0000 (01:06 -0500)
30 files changed:
README.md
keyboard/ergodox/.gitignore [new file with mode: 0644]
keyboard/ergodox/Ergodox-FAQ.md [new file with mode: 0644]
keyboard/ergodox/Makefile.lufa [new file with mode: 0644]
keyboard/ergodox/Makefile.pjrc [new file with mode: 0644]
keyboard/ergodox/addons/bin/install-workman [new file with mode: 0755]
keyboard/ergodox/addons/bin/set-xkb-map [new file with mode: 0755]
keyboard/ergodox/addons/etc/layout/ktouch/workman-wco.keyboard.xml [new file with mode: 0644]
keyboard/ergodox/addons/etc/layout/ktouch/workman-wcp-ergodox.keyboard.xml [new file with mode: 0644]
keyboard/ergodox/addons/etc/layout/ktouch/workman-wcp.keyboard.xml [new file with mode: 0644]
keyboard/ergodox/addons/etc/layout/ktouch/workman-wdp-fast.ktouch.xml [new file with mode: 0644]
keyboard/ergodox/addons/etc/layout/ktouch/workman-wdp.keyboard.xml [new file with mode: 0644]
keyboard/ergodox/addons/etc/layout/ktouch/workman-wdp.ktouch.xml [new file with mode: 0644]
keyboard/ergodox/addons/etc/layout/xkb/symbols.dir.workman [new file with mode: 0644]
keyboard/ergodox/addons/etc/layout/xkb/workman [new file with mode: 0644]
keyboard/ergodox/config.h [new file with mode: 0644]
keyboard/ergodox/ergodox.c [new file with mode: 0644]
keyboard/ergodox/ergodox.h [new file with mode: 0644]
keyboard/ergodox/i2cmaster.h [new file with mode: 0644]
keyboard/ergodox/keymap_blazak.c [new file with mode: 0644]
keyboard/ergodox/keymap_colemak.c [new file with mode: 0644]
keyboard/ergodox/keymap_common.c [new file with mode: 0644]
keyboard/ergodox/keymap_common.h [new file with mode: 0644]
keyboard/ergodox/keymap_cub.c [new file with mode: 0644]
keyboard/ergodox/keymap_dvorak.c [new file with mode: 0644]
keyboard/ergodox/keymap_micro.c [new file with mode: 0644]
keyboard/ergodox/keymap_passwords_example.h [new file with mode: 0644]
keyboard/ergodox/led.c [new file with mode: 0644]
keyboard/ergodox/matrix.c [new file with mode: 0644]
keyboard/ergodox/twimaster.c [new file with mode: 0644]

index ee44d00d9695f1ade5e23e3140628ceeec9547be..241672f8fb46a51578bf6c787132695474a810d9 100644 (file)
--- a/README.md
+++ b/README.md
@@ -228,4 +228,4 @@ Coding Style
 
 Other Keyboard Firmware Projects
 ------------------
-You can learn a lot about keyboard firmware from these. See [Other Projects](https://github.com/tmk/tmk_keyboard/wiki/Other-Projects) other than TMK.
+You can learn a lot about keyboard firmware from these. See [Other Projects](https://github.com/tmk/tmk_keyboard/wiki/Other-Protjects) other than TMK.
diff --git a/keyboard/ergodox/.gitignore b/keyboard/ergodox/.gitignore
new file mode 100644 (file)
index 0000000..9f8fcd1
--- /dev/null
@@ -0,0 +1,2 @@
+keymap_passwords.h
+keymap_passwords_cub.h
diff --git a/keyboard/ergodox/Ergodox-FAQ.md b/keyboard/ergodox/Ergodox-FAQ.md
new file mode 100644 (file)
index 0000000..256806a
--- /dev/null
@@ -0,0 +1,72 @@
+# TMK Generic
+
+* I'm not sure what the Magic + H does.
+ Is this a menu that will pop up regardless of what platform and program is open? 
+
+ Yes, this is sort of debugging.
+ Use PJRC's [hid_listen](https://www.pjrc.com/teensy/hid_listen.html) to see debug messages.
+
+# TMK/Ergodox specific
+
+* I would like to configure my leds to indicate the active layer.
+ I read that can be done, but I haven't seen an example for this firmware.
+ Can someone please post an example or a link?
+
+ TMK for Ergodox have support for seven (!) led's:
+ - three on right
+ - three on left (see http://geekhack.org/index.php?topic=22780.msg873819#msg873819 for more details)
+ - Teensy onboard led as well
+
+ Any of these leds can be used as layer indicator or NumLock/CapsLock/ScrollLock led.
+
+ [Here is example](https://github.com/cub-uanic/tmk_keyboard/blob/cub_layout/keyboard/ergodox/matrix.c#L121-167)
+ how you can assign some meaning to each led.
+ In this code only left leds are used to show layers, but you can
+ [change `led_set()`](https://github.com/cub-uanic/tmk_keyboard/blob/cub_layout/keyboard/ergodox/led.c)
+ and do anything you want with all leds.
+
+# Firmware
+
+#### Where to get binaries?
+https://github.com/cub-uanic/tmk_keyboard/releases
+
+#### Where to get sources?
+https://github.com/cub-uanic/tmk_keyboard/tree/master
+
+#### How to compile?
+
+    cd tmk_keyboard/keyboard/ergodox
+
+    # just to be safe
+    make -f Makefile.lufa clean
+
+    # use one of these
+    make -f Makefile.lufa
+    make -f Makefile.lufa dvorak
+    make -f Makefile.lufa colemak
+    make -f Makefile.lufa workman
+    make -f Makefile.lufa micro
+    make -f Makefile.lufa cub
+
+
+# Layouts
+
+TODO description of layouts in base firmware binaries
+
+
+# Things TO-DO
+
+- [ ] Flash NumLock led only when "numpad" layer is active
+- [ ] Command (in terms of IS_COMMAND) to switch to no-leds mode
+- [ ] Increase count of ACTION keys
+- [ ] Fix command_state() onboard led: it should flash only when kbd in some specific mode (CONSOLE || MOUSE)
+- [ ] ergodox_blink_all_leds() should save current state of leds, and restore after blink. initial state of all leds == off
+- [ ] add support for pseudo-backlight (reversed LEDs) + docs/photo
+- [ ] command to debug all LEDs (on/off/blink)
+- [ ] proper (in-core) implementation of DEBUG_MATRIX_SCAN_RATE (non-Ergodox specific)
+- [ ] proper (in-core) support for per-layer fn_actions[]
+- [ ] create one-handed layouts, see
+        http://half-qwerty.com/
+        https://geekhack.org/index.php?topic=60165.0
+        https://www.massdrop.com/ext/ergodox/?hash=e097c3b9932179055023d47e48b25f1d
+
diff --git a/keyboard/ergodox/Makefile.lufa b/keyboard/ergodox/Makefile.lufa
new file mode 100644 (file)
index 0000000..976877e
--- /dev/null
@@ -0,0 +1,129 @@
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device.
+#                Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+#               (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+#            have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+#             have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+#               (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+#                (must have Atmel FLIP installed).
+#
+# make debug = Start either simulavr or avarice as specified for debugging, 
+#              with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+#                   bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+# Target file name (without extension).
+TARGET = ergodox_lufa
+
+# Directory common source filess exist
+TMK_DIR = ../../tmk_core
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+# project specific files
+SRC =  keymap_common.c \
+       matrix.c \
+       led.c \
+       ergodox.c \
+       twimaster.c
+
+ifdef KEYMAP
+    SRC := keymap_$(KEYMAP).c $(SRC)
+else
+    SRC := keymap_blazak.c $(SRC)
+endif
+
+CONFIG_H = config.h
+
+
+# MCU name, you MUST set this to match the board you are using
+# type "make clean" after changing this, so all files will be rebuilt
+MCU = atmega32u4
+#MCU = at90usb1286
+
+
+# Processor frequency.
+#   Normally the first thing your program should do is set the clock prescaler,
+#   so your program will run at the correct speed.  You should also set this
+#   variable to same clock speed.  The _delay_ms() macro uses this, and many
+#   examples use this variable to calculate timings.  Do not add a "UL" here.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes  # Mouse keys(+5000)
+EXTRAKEY_ENABLE = yes  # Audio control and System control(+600)
+CONSOLE_ENABLE = yes    # Console for debug
+COMMAND_ENABLE = yes    # Commands for debug and configuration
+SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes              # USB Nkey Rollover (+500)
+#PS2_MOUSE_ENABLE = yes        # PS/2 mouse(TrackPoint) support
+INVERT_NUMLOCK = yes   # invert state of NumLock led
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TMK_DIR)
+
+include $(TMK_DIR)/protocol.mk
+include $(TMK_DIR)/protocol/lufa.mk
+include $(TMK_DIR)/common.mk
+include $(TMK_DIR)/rules.mk
diff --git a/keyboard/ergodox/Makefile.pjrc b/keyboard/ergodox/Makefile.pjrc
new file mode 100644 (file)
index 0000000..04b07d9
--- /dev/null
@@ -0,0 +1,108 @@
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device.
+#                Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+#               (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+#            have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+#             have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+#               (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+#                (must have Atmel FLIP installed).
+#
+# make debug = Start either simulavr or avarice as specified for debugging, 
+#              with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+#                   bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+# Target file name (without extension).
+TARGET = ergodox_pjrc
+
+# Directory common source filess exist
+TMK_DIR = ../../tmk_core
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+# project specific files
+SRC =  keymap_common.c \
+       matrix.c \
+       led.c \
+       ergodox.c \
+       twimaster.c
+
+ifdef KEYMAP
+    SRC := keymap_$(KEYMAP).c $(SRC)
+else
+    SRC := keymap_blazak.c $(SRC)
+endif
+
+CONFIG_H = config.h
+
+
+# MCU name, you MUST set this to match the board you are using
+# type "make clean" after changing this, so all files will be rebuilt
+MCU = atmega32u4
+#MCU = at90usb1286
+
+
+# Processor frequency.
+#   Normally the first thing your program should do is set the clock prescaler,
+#   so your program will run at the correct speed.  You should also set this
+#   variable to same clock speed.  The _delay_ms() macro uses this, and many
+#   examples use this variable to calculate timings.  Do not add a "UL" here.
+F_CPU = 16000000
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+OPT_DEFS += -DBOOTLOADER_SIZE=512 -DFLASH_SIZE_BYTES=0x8000
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes  # Mouse keys(+5000)
+EXTRAKEY_ENABLE = yes  # Audio control and System control(+600)
+CONSOLE_ENABLE = yes    # Console for debug
+COMMAND_ENABLE = yes    # Commands for debug and configuration
+SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes              # USB Nkey Rollover (+500)
+#PS2_MOUSE_ENABLE = yes        # PS/2 mouse(TrackPoint) support
+INVERT_NUMLOCK = yes   # invert state of NumLock led
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TMK_DIR)
+
+include $(TMK_DIR)/protocol.mk
+include $(TMK_DIR)/protocol/pjrc.mk
+include $(TMK_DIR)/common.mk
+include $(TMK_DIR)/rules.mk
diff --git a/keyboard/ergodox/addons/bin/install-workman b/keyboard/ergodox/addons/bin/install-workman
new file mode 100755 (executable)
index 0000000..b7b4ceb
--- /dev/null
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+if [ "`id -u`" = "0" ]; then
+    [ -d /usr/share/kde4/apps/ktouch/ ] && cp ~/etc/layout/ktouch/workman* /usr/share/kde4/apps/ktouch/
+    cp ~/etc/layout/xkb/workman /usr/share/X11/xkb/symbols/workman
+    cat /usr/share/X11/xkb/symbols.dir | grep -v workman > /usr/share/X11/xkb/symbols.dir.new
+    cat ~/etc/layout/xkb/symbols.dir.workman >> /usr/share/X11/xkb/symbols.dir.new
+    mv /usr/share/X11/xkb/symbols.dir.new /usr/share/X11/xkb/symbols.dir
+    echo "Now you could run these command to set Workman-Dvorak-P, Workman-Cub-P, Dvorak-P or QWERTY layouts:"
+    echo "    setxkbmap -layout workman,ru -variant wdp,"
+    echo "    setxkbmap -layout workman,ru -variant wcp,    # for usual keyboard"
+    echo "    setxkbmap -layout workman,ru -variant wce,    # for Ergodox keyboard"
+    echo "    setxkbmap -layout us,ru      -variant dvp,"
+    echo "    setxkbmap -layout us,ru      -variant ,"
+else
+    echo "You should run this from root account"
+    exit 1
+fi
diff --git a/keyboard/ergodox/addons/bin/set-xkb-map b/keyboard/ergodox/addons/bin/set-xkb-map
new file mode 100755 (executable)
index 0000000..8e18763
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+xset r rate 350 80
+
+opts='-model pc104 -option grp:caps_toggle,grp_led:scroll'
+
+case "$1" in
+    dvorak)
+        setxkbmap $opts -layout us,ru -variant dvp,
+        ;;
+    carpalx)
+        setxkbmap $opts -layout carpalx,ru -variant qgmlwb-p,
+        ;;
+    workman)
+        variant='wcp,'
+        lsusb | grep -qi FEED:1307 && variant='wce,'
+        [ -e ~/.force_ergodox ] && variant='wce,'
+        [ -e ~/.force_plain   ] && variant='wcp,'
+        setxkbmap $opts -layout workman,ru -variant "$variant"
+        ;;
+    *)
+        # US or unknown layout - setting US
+        setxkbmap $opts -layout us,ru
+        ;;
+esac
+
diff --git a/keyboard/ergodox/addons/etc/layout/ktouch/workman-wco.keyboard.xml b/keyboard/ergodox/addons/etc/layout/ktouch/workman-wco.keyboard.xml
new file mode 100644 (file)
index 0000000..79348c0
--- /dev/null
@@ -0,0 +1,294 @@
+<KTouchKeyboard>
+ <Title>English Workman layout for programmers from cub@uanic (old)</Title>
+ <Comment>English Workman layout for programmers from cub@uanic (old)</Comment>
+ <Language>en (English)</Language>
+ <Keys>
+  <Key Width="80" X="180" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="65" Position="TopLeft">A</Char>
+  </Key>
+  <Key Width="80" X="280" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="83" Position="TopLeft">S</Char>
+  </Key>
+  <Key Width="80" X="380" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="72" Position="TopLeft">H</Char>
+  </Key>
+  <Key Width="80" X="480" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="84" Position="TopLeft">T</Char>
+  </Key>
+  <Key Width="80" X="780" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="78" Position="TopLeft">N</Char>
+  </Key>
+  <Key Width="80" X="880" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="69" Position="TopLeft">E</Char>
+  </Key>
+  <Key Width="80" X="980" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="79" Position="TopLeft">O</Char>
+  </Key>
+  <Key Width="80" X="1080" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="73" Position="TopLeft">I</Char>
+  </Key>
+  <Key Width="130" X="0" Y="100" Height="80" Type="TAB"/>
+  <Key Width="100" X="1380" Y="100" Height="180" Type="ENTER"/>
+  <Key Width="250" X="1230" Y="300" Height="80" Type="SHIFT"/>
+  <Key Width="130" X="1200" KeyText="AltGr" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="130" X="1350" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="130" X="150" KeyText="Alt" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="130" X="0" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="880" X="300" Y="400" Height="80" Type="SPACE"/>
+  <Key Width="110" X="0" Y="300" Height="80" Type="SHIFT"/>
+  <Key Width="160" X="0" Y="200" Height="80" Type="CAPSLOCK"/>
+  <Key Width="160" X="1310" Y="0" Height="80" Type="BACKSPACE"/>
+  <Key Width="80" X="0" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="96" Position="TopLeft">`</Char>
+   <Char Unicode="126" Position="BottomLeft">~</Char>
+  </Key>
+  <Key Width="80" X="100" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="49" Position="TopLeft">1</Char>
+   <Char Unicode="33" Position="BottomLeft">!</Char>
+  </Key>
+  <Key Width="80" X="200" Y="0" Height="80" FingerKeyIndex="1" Type="NORMAL">
+   <Char Unicode="50" Position="TopLeft">2</Char>
+   <Char Unicode="123" Position="BottomLeft">{</Char>
+  </Key>
+  <Key Width="80" X="300" Y="0" Height="80" FingerKeyIndex="2" Type="NORMAL">
+   <Char Unicode="51" Position="TopLeft">3</Char>
+   <Char Unicode="35" Position="BottomLeft">#</Char>
+  </Key>
+  <Key Width="80" X="400" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="52" Position="TopLeft">4</Char>
+   <Char Unicode="59" Position="BottomLeft">;</Char>
+  </Key>
+  <Key Width="80" X="500" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="53" Position="TopLeft">5</Char>
+   <Char Unicode="125" Position="BottomLeft">}</Char>
+  </Key>
+  <Key Width="80" X="600" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="54" Position="TopLeft">6</Char>
+   <Char Unicode="91" Position="BottomLeft">[</Char>
+  </Key>
+  <Key Width="80" X="700" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="55" Position="TopLeft">7</Char>
+   <Char Unicode="38" Position="BottomLeft">&amp;</Char>
+  </Key>
+  <Key Width="80" X="800" Y="0" Height="80" FingerKeyIndex="5" Type="NORMAL">
+   <Char Unicode="56" Position="TopLeft">8</Char>
+   <Char Unicode="42" Position="BottomLeft">*</Char>
+  </Key>
+  <Key Width="80" X="900" Y="0" Height="80" FingerKeyIndex="6" Type="NORMAL">
+   <Char Unicode="57" Position="TopLeft">9</Char>
+   <Char Unicode="40" Position="BottomLeft">(</Char>
+  </Key>
+  <Key Width="80" X="1000" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="48" Position="TopLeft">0</Char>
+   <Char Unicode="41" Position="BottomLeft">)</Char>
+  </Key>
+  <Key Width="80" X="1100" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="37" Position="TopLeft">%</Char>
+   <Char Unicode="93" Position="BottomLeft">]</Char>
+  </Key>
+  <Key Width="80" X="1200" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="43" Position="TopLeft">+</Char>
+   <Char Unicode="61" Position="BottomLeft">=</Char>
+  </Key>
+  <Key Width="80" X="150" Y="100" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="81" Position="TopLeft">Q</Char>
+  </Key>
+  <Key Width="80" X="250" Y="100" Height="80" FingerKeyIndex="1" Type="NORMAL">
+   <Char Unicode="68" Position="TopLeft">D</Char>
+  </Key>
+  <Key Width="80" X="350" Y="100" Height="80" FingerKeyIndex="2" Type="NORMAL">
+   <Char Unicode="82" Position="TopLeft">R</Char>
+  </Key>
+  <Key Width="80" X="450" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="87" Position="TopLeft">W</Char>
+  </Key>
+  <Key Width="80" X="550" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="66" Position="TopLeft">B</Char>
+  </Key>
+  <Key Width="80" X="650" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="74" Position="TopLeft">J</Char>
+  </Key>
+  <Key Width="80" X="750" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="70" Position="TopLeft">F</Char>
+  </Key>
+  <Key Width="80" X="850" Y="100" Height="80" FingerKeyIndex="5" Type="NORMAL">
+   <Char Unicode="85" Position="TopLeft">U</Char>
+  </Key>
+  <Key Width="80" X="950" Y="100" Height="80" FingerKeyIndex="6" Type="NORMAL">
+   <Char Unicode="80" Position="TopLeft">P</Char>
+  </Key>
+  <Key Width="80" X="1050" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="64" Position="TopLeft">@</Char>
+   <Char Unicode="36" Position="BottomLeft">$</Char>
+  </Key>
+  <Key Width="80" X="1150" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="94" Position="TopLeft">^</Char>
+   <Char Unicode="58" Position="BottomLeft">:</Char>
+  </Key>
+  <Key Width="80" X="1250" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="34" Position="TopLeft">"</Char>
+   <Char Unicode="39" Position="BottomLeft">'</Char>
+  </Key>
+  <Key Width="80" X="580" Y="200" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="71" Position="TopLeft">G</Char>
+  </Key>
+  <Key Width="80" X="680" Y="200" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="89" Position="TopLeft">Y</Char>
+  </Key>
+  <Key Width="80" X="1180" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="95" Position="TopLeft">_</Char>
+   <Char Unicode="45" Position="BottomLeft">-</Char>
+  </Key>
+  <Key Width="80" X="1280" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="124" Position="TopLeft">|</Char>
+   <Char Unicode="92" Position="BottomLeft">\</Char>
+  </Key>
+  <Key Width="80" X="130" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="60" Position="TopLeft">&lt;</Char>
+   <Char Unicode="62" Position="BottomLeft">></Char>
+  </Key>
+  <Key Width="80" X="230" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="90" Position="TopLeft">Z</Char>
+  </Key>
+  <Key Width="80" X="330" Y="300" Height="80" FingerKeyIndex="1" Type="NORMAL">
+   <Char Unicode="88" Position="TopLeft">X</Char>
+  </Key>
+  <Key Width="80" X="430" Y="300" Height="80" FingerKeyIndex="2" Type="NORMAL">
+   <Char Unicode="77" Position="TopLeft">M</Char>
+  </Key>
+  <Key Width="80" X="530" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="67" Position="TopLeft">C</Char>
+  </Key>
+  <Key Width="80" X="630" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="86" Position="TopLeft">V</Char>
+  </Key>
+  <Key Width="80" X="730" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="75" Position="TopLeft">K</Char>
+  </Key>
+  <Key Width="80" X="830" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="76" Position="TopLeft">L</Char>
+  </Key>
+  <Key Width="80" X="930" Y="300" Height="80" FingerKeyIndex="5" Type="NORMAL">
+   <Char Unicode="60" Position="TopLeft">&lt;</Char>
+   <Char Unicode="44" Position="BottomLeft">,</Char>
+  </Key>
+  <Key Width="80" X="1030" Y="300" Height="80" FingerKeyIndex="6" Type="NORMAL">
+   <Char Unicode="62" Position="TopLeft">></Char>
+   <Char Unicode="46" Position="BottomLeft">.</Char>
+  </Key>
+  <Key Width="80" X="1130" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="63" Position="TopLeft">?</Char>
+   <Char Unicode="47" Position="BottomLeft">/</Char>
+  </Key>
+ </Keys>
+ <Connections>
+  <KeyConnector TargetKeyIndex="0"  KeyUnicode="97" />
+  <KeyConnector TargetKeyIndex="0"  KeyUnicode="65"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="1"  KeyUnicode="115"/>
+  <KeyConnector TargetKeyIndex="1"  KeyUnicode="83"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="2"  KeyUnicode="104"/>
+  <KeyConnector TargetKeyIndex="2"  KeyUnicode="72"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="3"  KeyUnicode="116"/>
+  <KeyConnector TargetKeyIndex="3"  KeyUnicode="84"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="4"  KeyUnicode="110"/>
+  <KeyConnector TargetKeyIndex="4"  KeyUnicode="78"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="5"  KeyUnicode="101"/>
+  <KeyConnector TargetKeyIndex="5"  KeyUnicode="69"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="6"  KeyUnicode="111"/>
+  <KeyConnector TargetKeyIndex="6"  KeyUnicode="79"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="7"  KeyUnicode="105"/>
+  <KeyConnector TargetKeyIndex="7"  KeyUnicode="73"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="8"  KeyUnicode="260"/>
+  <KeyConnector TargetKeyIndex="9"  KeyUnicode="13" />
+  <KeyConnector TargetKeyIndex="10" KeyUnicode="257"/>
+  <KeyConnector TargetKeyIndex="11" KeyUnicode="264"/>
+  <KeyConnector TargetKeyIndex="12" KeyUnicode="265"/>
+  <KeyConnector TargetKeyIndex="13" KeyUnicode="263"/>
+  <KeyConnector TargetKeyIndex="14" KeyUnicode="262"/>
+  <KeyConnector TargetKeyIndex="15" KeyUnicode="32" />
+  <KeyConnector TargetKeyIndex="16" KeyUnicode="258"/>
+  <KeyConnector TargetKeyIndex="17" KeyUnicode="259"/>
+  <KeyConnector TargetKeyIndex="18" KeyUnicode="8"  />
+  <KeyConnector TargetKeyIndex="19" KeyUnicode="126"/>
+  <KeyConnector TargetKeyIndex="19" KeyUnicode="96"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="20" KeyUnicode="33" />
+  <KeyConnector TargetKeyIndex="20" KeyUnicode="49"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="21" KeyUnicode="123"/>
+  <KeyConnector TargetKeyIndex="21" KeyUnicode="50"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="22" KeyUnicode="35" />
+  <KeyConnector TargetKeyIndex="22" KeyUnicode="51"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="23" KeyUnicode="59" />
+  <KeyConnector TargetKeyIndex="23" KeyUnicode="52"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="24" KeyUnicode="125"/>
+  <KeyConnector TargetKeyIndex="24" KeyUnicode="53"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="25" KeyUnicode="91" />
+  <KeyConnector TargetKeyIndex="25" KeyUnicode="54"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="26" KeyUnicode="38" />
+  <KeyConnector TargetKeyIndex="26" KeyUnicode="55"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="27" KeyUnicode="42" />
+  <KeyConnector TargetKeyIndex="27" KeyUnicode="56"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="28" KeyUnicode="40" />
+  <KeyConnector TargetKeyIndex="28" KeyUnicode="57"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="29" KeyUnicode="41" />
+  <KeyConnector TargetKeyIndex="29" KeyUnicode="48"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="30" KeyUnicode="93" />
+  <KeyConnector TargetKeyIndex="30" KeyUnicode="37"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="31" KeyUnicode="61" />
+  <KeyConnector TargetKeyIndex="31" KeyUnicode="43"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="32" KeyUnicode="113"/>
+  <KeyConnector TargetKeyIndex="32" KeyUnicode="81"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="33" KeyUnicode="100"/>
+  <KeyConnector TargetKeyIndex="33" KeyUnicode="68"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="34" KeyUnicode="114"/>
+  <KeyConnector TargetKeyIndex="34" KeyUnicode="82"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="35" KeyUnicode="119"/>
+  <KeyConnector TargetKeyIndex="35" KeyUnicode="87"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="36" KeyUnicode="98" />
+  <KeyConnector TargetKeyIndex="36" KeyUnicode="66"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="37" KeyUnicode="106"/>
+  <KeyConnector TargetKeyIndex="37" KeyUnicode="74"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="38" KeyUnicode="102"/>
+  <KeyConnector TargetKeyIndex="38" KeyUnicode="70"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="39" KeyUnicode="117"/>
+  <KeyConnector TargetKeyIndex="39" KeyUnicode="85"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="40" KeyUnicode="112"/>
+  <KeyConnector TargetKeyIndex="40" KeyUnicode="80"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="41" KeyUnicode="36" />
+  <KeyConnector TargetKeyIndex="41" KeyUnicode="64"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="42" KeyUnicode="58" />
+  <KeyConnector TargetKeyIndex="42" KeyUnicode="94"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="43" KeyUnicode="39" />
+  <KeyConnector TargetKeyIndex="43" KeyUnicode="34"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="44" KeyUnicode="103"/>
+  <KeyConnector TargetKeyIndex="44" KeyUnicode="71"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="45" KeyUnicode="121"/>
+  <KeyConnector TargetKeyIndex="45" KeyUnicode="89"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="46" KeyUnicode="45" />
+  <KeyConnector TargetKeyIndex="46" KeyUnicode="95"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="47" KeyUnicode="92" />
+  <KeyConnector TargetKeyIndex="47" KeyUnicode="124" ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="48" KeyUnicode="62" />
+  <KeyConnector TargetKeyIndex="48" KeyUnicode="60"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="49" KeyUnicode="122"/>
+  <KeyConnector TargetKeyIndex="49" KeyUnicode="90"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="50" KeyUnicode="120"/>
+  <KeyConnector TargetKeyIndex="50" KeyUnicode="88"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="51" KeyUnicode="109"/>
+  <KeyConnector TargetKeyIndex="51" KeyUnicode="77"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="52" KeyUnicode="99" />
+  <KeyConnector TargetKeyIndex="52" KeyUnicode="67"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="53" KeyUnicode="118"/>
+  <KeyConnector TargetKeyIndex="53" KeyUnicode="86"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="54" KeyUnicode="107"/>
+  <KeyConnector TargetKeyIndex="54" KeyUnicode="75"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="55" KeyUnicode="108"/>
+  <KeyConnector TargetKeyIndex="55" KeyUnicode="76"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="56" KeyUnicode="44" />
+  <KeyConnector TargetKeyIndex="56" KeyUnicode="60"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="57" KeyUnicode="46" />
+  <KeyConnector TargetKeyIndex="57" KeyUnicode="62"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="58" KeyUnicode="47" />
+  <KeyConnector TargetKeyIndex="58" KeyUnicode="63"  ModifierIndex="10"/>
+ </Connections>
+</KTouchKeyboard>
+
diff --git a/keyboard/ergodox/addons/etc/layout/ktouch/workman-wcp-ergodox.keyboard.xml b/keyboard/ergodox/addons/etc/layout/ktouch/workman-wcp-ergodox.keyboard.xml
new file mode 100644 (file)
index 0000000..b8aac30
--- /dev/null
@@ -0,0 +1,285 @@
+<KTouchKeyboard>
+ <Title>English Workman/Ergodox/Cub</Title>
+ <Comment>English Workman/Ergodox/Cub for programmers</Comment>
+ <Language>en (English)</Language>
+ <Keys>
+  <Key Width="80" X="100" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="65" Position="TopLeft">A</Char>
+  </Key>
+  <Key Width="80" X="200" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="83" Position="TopLeft">S</Char>
+  </Key>
+  <Key Width="80" X="300" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="72" Position="TopLeft">H</Char>
+  </Key>
+  <Key Width="80" X="400" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="84" Position="TopLeft">T</Char>
+  </Key>
+  <Key Width="80" X="930" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="78" Position="TopLeft">N</Char>
+  </Key>
+  <Key Width="80" X="1030" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="69" Position="TopLeft">E</Char>
+  </Key>
+  <Key Width="80" X="1130" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="79" Position="TopLeft">O</Char>
+  </Key>
+  <Key Width="80" X="1230" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="73" Position="TopLeft">I</Char>
+  </Key>
+  <Key Width="80" X="0" Y="100" Height="80" Type="TAB"/>
+  <Key Width="130" X="750" Y="480" Height="80" Type="ENTER"/>
+  <Key Width="80" X="750" KeyText="AltGr" Y="570" Height="80" Type="OTHER"/>
+  <Key Width="80" X="580" KeyText="Alt" Y="570" Height="80" Type="OTHER"/>
+  <Key Width="80" X="0" KeyText="Ctrl" Y="300" Height="80" Type="OTHER"/>
+  <Key Width="160" X="750" Y="390" Height="80" Type="SPACE"/>
+  <Key Width="80" X="0" Y="200" Height="80" Type="SHIFT"/>
+  <Key Width="130" X="530" Y="480" Height="80" Type="SHIFT"/>
+  <Key Width="160" X="500" Y="390" Height="80" Type="BACKSPACE"/>
+  <Key Width="80" X="0" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="126" Position="TopLeft">~</Char>
+   <Char Unicode="96" Position="BottomLeft">`</Char>
+  </Key>
+  <Key Width="80" X="100" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="59" Position="TopLeft">;</Char>
+   <Char Unicode="49" Position="BottomLeft">1</Char>
+  </Key>
+  <Key Width="80" X="200" Y="0" Height="80" FingerKeyIndex="1" Type="NORMAL">
+   <Char Unicode="33" Position="TopLeft">!</Char>
+   <Char Unicode="50" Position="BottomLeft">2</Char>
+  </Key>
+  <Key Width="80" X="300" Y="0" Height="80" FingerKeyIndex="2" Type="NORMAL">
+   <Char Unicode="35" Position="TopLeft">#</Char>
+   <Char Unicode="51" Position="BottomLeft">3</Char>
+  </Key>
+  <Key Width="80" X="400" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="123" Position="TopLeft">{</Char>
+   <Char Unicode="52" Position="BottomLeft">4</Char>
+  </Key>
+  <Key Width="80" X="500" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="125" Position="TopLeft">}</Char>
+   <Char Unicode="53" Position="BottomLeft">5</Char>
+  </Key>
+  <Key Width="80" X="830" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="91" Position="TopLeft">[</Char>
+   <Char Unicode="54" Position="BottomLeft">6</Char>
+  </Key>
+  <Key Width="80" X="930" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="93" Position="TopLeft">]</Char>
+   <Char Unicode="55" Position="BottomLeft">7</Char>
+  </Key>
+  <Key Width="80" X="1030" Y="0" Height="80" FingerKeyIndex="5" Type="NORMAL">
+   <Char Unicode="42" Position="TopLeft">*</Char>
+   <Char Unicode="56" Position="BottomLeft">8</Char>
+  </Key>
+  <Key Width="80" X="1130" Y="0" Height="80" FingerKeyIndex="6" Type="NORMAL">
+   <Char Unicode="40" Position="TopLeft">(</Char>
+   <Char Unicode="57" Position="BottomLeft">9</Char>
+  </Key>
+  <Key Width="80" X="1230" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="41" Position="TopLeft">)</Char>
+   <Char Unicode="48" Position="BottomLeft">0</Char>
+  </Key>
+  <Key Width="80" X="1330" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="61" Position="TopLeft">=</Char>
+   <Char Unicode="43" Position="BottomLeft">+</Char>
+  </Key>
+  <Key Width="80" X="100" Y="100" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="81" Position="TopLeft">Q</Char>
+  </Key>
+  <Key Width="80" X="200" Y="100" Height="80" FingerKeyIndex="1" Type="NORMAL">
+   <Char Unicode="68" Position="TopLeft">D</Char>
+  </Key>
+  <Key Width="80" X="300" Y="100" Height="80" FingerKeyIndex="2" Type="NORMAL">
+   <Char Unicode="82" Position="TopLeft">R</Char>
+  </Key>
+  <Key Width="80" X="400" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="87" Position="TopLeft">W</Char>
+  </Key>
+  <Key Width="80" X="500" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="66" Position="TopLeft">B</Char>
+  </Key>
+  <Key Width="80" X="830" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="74" Position="TopLeft">J</Char>
+  </Key>
+  <Key Width="80" X="930" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="70" Position="TopLeft">F</Char>
+  </Key>
+  <Key Width="80" X="1030" Y="100" Height="80" FingerKeyIndex="5" Type="NORMAL">
+   <Char Unicode="85" Position="TopLeft">U</Char>
+  </Key>
+  <Key Width="80" X="1130" Y="100" Height="80" FingerKeyIndex="6" Type="NORMAL">
+   <Char Unicode="80" Position="TopLeft">P</Char>
+  </Key>
+  <Key Width="80" X="1230" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="36" Position="TopLeft">$</Char>
+   <Char Unicode="64" Position="BottomLeft">@</Char>
+  </Key>
+  <Key Width="80" X="1330" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="58" Position="TopLeft">:</Char>
+   <Char Unicode="37" Position="BottomLeft">%</Char>
+  </Key>
+  <Key Width="80" X="500" Y="200" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="71" Position="TopLeft">G</Char>
+  </Key>
+  <Key Width="80" X="830" Y="200" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="89" Position="TopLeft">Y</Char>
+  </Key>
+  <Key Width="80" X="1330" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="45" Position="TopLeft">-</Char>
+   <Char Unicode="95" Position="BottomLeft">_</Char>
+  </Key>
+  <Key Width="80" X="1330" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="124" Position="TopLeft">|</Char>
+   <Char Unicode="38" Position="BottomLeft">&amp;</Char>
+  </Key>
+  <Key Width="80" X="100" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="90" Position="TopLeft">Z</Char>
+  </Key>
+  <Key Width="80" X="200" Y="300" Height="80" FingerKeyIndex="1" Type="NORMAL">
+   <Char Unicode="88" Position="TopLeft">X</Char>
+  </Key>
+  <Key Width="80" X="300" Y="300" Height="80" FingerKeyIndex="2" Type="NORMAL">
+   <Char Unicode="77" Position="TopLeft">M</Char>
+  </Key>
+  <Key Width="80" X="400" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="67" Position="TopLeft">C</Char>
+  </Key>
+  <Key Width="80" X="500" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="86" Position="TopLeft">V</Char>
+  </Key>
+  <Key Width="80" X="830" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="75" Position="TopLeft">K</Char>
+  </Key>
+  <Key Width="80" X="930" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="76" Position="TopLeft">L</Char>
+  </Key>
+  <Key Width="80" X="1030" Y="300" Height="80" FingerKeyIndex="5" Type="NORMAL">
+   <Char Unicode="60" Position="TopLeft">&lt;</Char>
+   <Char Unicode="44" Position="BottomLeft">,</Char>
+  </Key>
+  <Key Width="80" X="1130" Y="300" Height="80" FingerKeyIndex="6" Type="NORMAL">
+   <Char Unicode="62" Position="TopLeft">></Char>
+   <Char Unicode="46" Position="BottomLeft">.</Char>
+  </Key>
+  <Key Width="80" X="1230" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="63" Position="TopLeft">?</Char>
+   <Char Unicode="47" Position="BottomLeft">/</Char>
+  </Key>
+  <Key Width="80" X="590" KeyText="" Y="100" Height="130" Type="OTHER"/>
+  <Key Width="80" X="590" KeyText="" Y="250" Height="130" Type="OTHER"/>
+  <Key Width="80" X="740" KeyText="" Y="100" Height="130" Type="OTHER"/>
+  <Key Width="80" X="740" KeyText="" Y="250" Height="130" Type="OTHER"/>
+  <Key Width="80" X="400" KeyText="ESC" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="80" X="300" Y="400" Height="80" Type="SPACE"/>
+  <Key Width="80" X="100" KeyText="L2" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="80" X="200" KeyText="" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="80" X="0" KeyText="" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="80" X="930" KeyText="" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="80" X="1030" KeyText="" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="80" X="1130" KeyText="" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="80" X="1230" KeyText="" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="80" X="1330" KeyText="" Y="400" Height="80" Type="OTHER"/>
+ </Keys>
+ <Connections>
+  <KeyConnector KeyUnicode="8" TargetKeyIndex="16"/>
+  <KeyConnector KeyUnicode="13" TargetKeyIndex="9"/>
+  <KeyConnector KeyUnicode="32" TargetKeyIndex="13"/>
+  <KeyConnector KeyUnicode="33" TargetKeyIndex="19"/>
+  <KeyConnector KeyUnicode="35" TargetKeyIndex="20"/>
+  <KeyConnector KeyUnicode="36" TargetKeyIndex="38"/>
+  <KeyConnector KeyUnicode="40" TargetKeyIndex="26"/>
+  <KeyConnector KeyUnicode="41" TargetKeyIndex="27"/>
+  <KeyConnector KeyUnicode="42" TargetKeyIndex="25"/>
+  <KeyConnector KeyUnicode="43" TargetKeyIndex="28"/>
+  <KeyConnector KeyUnicode="44" TargetKeyIndex="51"/>
+  <KeyConnector KeyUnicode="45" TargetKeyIndex="42"/>
+  <KeyConnector KeyUnicode="46" TargetKeyIndex="52"/>
+  <KeyConnector KeyUnicode="47" TargetKeyIndex="53"/>
+  <KeyConnector KeyUnicode="48" TargetKeyIndex="27"/>
+  <KeyConnector KeyUnicode="49" TargetKeyIndex="18" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="50" TargetKeyIndex="19" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="51" TargetKeyIndex="20" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="52" TargetKeyIndex="21" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="53" TargetKeyIndex="22" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="54" TargetKeyIndex="23"/>
+  <KeyConnector KeyUnicode="55" TargetKeyIndex="24"/>
+  <KeyConnector KeyUnicode="56" TargetKeyIndex="25"/>
+  <KeyConnector KeyUnicode="57" TargetKeyIndex="26"/>
+  <KeyConnector KeyUnicode="58" TargetKeyIndex="39"/>
+  <KeyConnector KeyUnicode="59" TargetKeyIndex="18"/>
+  <KeyConnector KeyUnicode="60" TargetKeyIndex="51"/>
+  <KeyConnector KeyUnicode="61" TargetKeyIndex="28"/>
+  <KeyConnector KeyUnicode="62" TargetKeyIndex="52"/>
+  <KeyConnector KeyUnicode="63" TargetKeyIndex="53"/>
+  <KeyConnector KeyUnicode="64" TargetKeyIndex="38"/>
+  <KeyConnector KeyUnicode="65" TargetKeyIndex="0" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="66" TargetKeyIndex="33" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="67" TargetKeyIndex="47" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="68" TargetKeyIndex="30" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="69" TargetKeyIndex="5" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="70" TargetKeyIndex="35" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="71" TargetKeyIndex="40" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="72" TargetKeyIndex="2" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="73" TargetKeyIndex="7" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="74" TargetKeyIndex="34" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="75" TargetKeyIndex="49" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="76" TargetKeyIndex="50" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="77" TargetKeyIndex="46" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="78" TargetKeyIndex="4" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="79" TargetKeyIndex="6" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="80" TargetKeyIndex="37" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="81" TargetKeyIndex="29" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="82" TargetKeyIndex="31" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="83" TargetKeyIndex="1" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="84" TargetKeyIndex="3" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="85" TargetKeyIndex="36" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="86" TargetKeyIndex="48" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="87" TargetKeyIndex="32" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="88" TargetKeyIndex="45" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="89" TargetKeyIndex="41" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="90" TargetKeyIndex="44" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="91" TargetKeyIndex="23"/>
+  <KeyConnector KeyUnicode="92" TargetKeyIndex="43"/>
+  <KeyConnector KeyUnicode="93" TargetKeyIndex="24"/>
+  <KeyConnector KeyUnicode="94" TargetKeyIndex="39"/>
+  <KeyConnector KeyUnicode="95" TargetKeyIndex="42"/>
+  <KeyConnector KeyUnicode="96" TargetKeyIndex="17" ModifierIndex="14"/>
+  <KeyConnector KeyUnicode="97" TargetKeyIndex="0"/>
+  <KeyConnector KeyUnicode="98" TargetKeyIndex="33"/>
+  <KeyConnector KeyUnicode="99" TargetKeyIndex="47"/>
+  <KeyConnector KeyUnicode="100" TargetKeyIndex="30"/>
+  <KeyConnector KeyUnicode="101" TargetKeyIndex="5"/>
+  <KeyConnector KeyUnicode="102" TargetKeyIndex="35"/>
+  <KeyConnector KeyUnicode="103" TargetKeyIndex="40"/>
+  <KeyConnector KeyUnicode="104" TargetKeyIndex="2"/>
+  <KeyConnector KeyUnicode="105" TargetKeyIndex="7"/>
+  <KeyConnector KeyUnicode="106" TargetKeyIndex="34"/>
+  <KeyConnector KeyUnicode="107" TargetKeyIndex="49"/>
+  <KeyConnector KeyUnicode="108" TargetKeyIndex="50"/>
+  <KeyConnector KeyUnicode="109" TargetKeyIndex="46"/>
+  <KeyConnector KeyUnicode="110" TargetKeyIndex="4"/>
+  <KeyConnector KeyUnicode="111" TargetKeyIndex="6"/>
+  <KeyConnector KeyUnicode="112" TargetKeyIndex="37"/>
+  <KeyConnector KeyUnicode="113" TargetKeyIndex="29"/>
+  <KeyConnector KeyUnicode="114" TargetKeyIndex="31"/>
+  <KeyConnector KeyUnicode="115" TargetKeyIndex="1"/>
+  <KeyConnector KeyUnicode="116" TargetKeyIndex="3"/>
+  <KeyConnector KeyUnicode="117" TargetKeyIndex="36"/>
+  <KeyConnector KeyUnicode="118" TargetKeyIndex="48"/>
+  <KeyConnector KeyUnicode="119" TargetKeyIndex="32"/>
+  <KeyConnector KeyUnicode="120" TargetKeyIndex="45"/>
+  <KeyConnector KeyUnicode="121" TargetKeyIndex="41"/>
+  <KeyConnector KeyUnicode="122" TargetKeyIndex="44"/>
+  <KeyConnector KeyUnicode="123" TargetKeyIndex="21"/>
+  <KeyConnector KeyUnicode="124" TargetKeyIndex="43"/>
+  <KeyConnector KeyUnicode="125" TargetKeyIndex="22"/>
+  <KeyConnector KeyUnicode="126" TargetKeyIndex="17"/>
+  <KeyConnector KeyUnicode="258" TargetKeyIndex="14"/>
+  <KeyConnector KeyUnicode="259" TargetKeyIndex="15"/>
+  <KeyConnector KeyUnicode="260" TargetKeyIndex="8"/>
+  <KeyConnector KeyUnicode="262" TargetKeyIndex="12"/>
+  <KeyConnector KeyUnicode="263" TargetKeyIndex="11"/>
+  <KeyConnector KeyUnicode="264" TargetKeyIndex="10"/>
+ </Connections>
+</KTouchKeyboard>
diff --git a/keyboard/ergodox/addons/etc/layout/ktouch/workman-wcp.keyboard.xml b/keyboard/ergodox/addons/etc/layout/ktouch/workman-wcp.keyboard.xml
new file mode 100644 (file)
index 0000000..03919b5
--- /dev/null
@@ -0,0 +1,294 @@
+<KTouchKeyboard>
+ <Title>English Workman layout for programmers from cub@uanic</Title>
+ <Comment>English Workman layout for programmers from cub@uanic</Comment>
+ <Language>en (English)</Language>
+ <Keys>
+  <Key Width="80" X="180" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="65" Position="TopLeft">A</Char>
+  </Key>
+  <Key Width="80" X="280" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="83" Position="TopLeft">S</Char>
+  </Key>
+  <Key Width="80" X="380" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="72" Position="TopLeft">H</Char>
+  </Key>
+  <Key Width="80" X="480" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="84" Position="TopLeft">T</Char>
+  </Key>
+  <Key Width="80" X="780" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="78" Position="TopLeft">N</Char>
+  </Key>
+  <Key Width="80" X="880" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="69" Position="TopLeft">E</Char>
+  </Key>
+  <Key Width="80" X="980" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="79" Position="TopLeft">O</Char>
+  </Key>
+  <Key Width="80" X="1080" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="73" Position="TopLeft">I</Char>
+  </Key>
+  <Key Width="130" X="0" Y="100" Height="80" Type="TAB"/>
+  <Key Width="100" X="1380" Y="100" Height="180" Type="ENTER"/>
+  <Key Width="250" X="1230" Y="300" Height="80" Type="SHIFT"/>
+  <Key Width="130" X="1200" KeyText="AltGr" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="130" X="1350" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="130" X="150" KeyText="Alt" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="130" X="0" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="880" X="300" Y="400" Height="80" Type="SPACE"/>
+  <Key Width="110" X="0" Y="300" Height="80" Type="SHIFT"/>
+  <Key Width="160" X="0" Y="200" Height="80" Type="CAPSLOCK"/>
+  <Key Width="160" X="1310" Y="0" Height="80" Type="BACKSPACE"/>
+  <Key Width="80" X="0" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="96" Position="TopLeft">`</Char>
+   <Char Unicode="126" Position="BottomLeft">~</Char>
+  </Key>
+  <Key Width="80" X="100" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="49" Position="TopLeft">1</Char>
+   <Char Unicode="59" Position="BottomLeft">;</Char>
+  </Key>
+  <Key Width="80" X="200" Y="0" Height="80" FingerKeyIndex="1" Type="NORMAL">
+   <Char Unicode="50" Position="TopLeft">2</Char>
+   <Char Unicode="33" Position="BottomLeft">!</Char>
+  </Key>
+  <Key Width="80" X="300" Y="0" Height="80" FingerKeyIndex="2" Type="NORMAL">
+   <Char Unicode="51" Position="TopLeft">3</Char>
+   <Char Unicode="35" Position="BottomLeft">#</Char>
+  </Key>
+  <Key Width="80" X="400" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="52" Position="TopLeft">4</Char>
+   <Char Unicode="123" Position="BottomLeft">{</Char>
+  </Key>
+  <Key Width="80" X="500" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="53" Position="TopLeft">5</Char>
+   <Char Unicode="125" Position="BottomLeft">}</Char>
+  </Key>
+  <Key Width="80" X="600" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="54" Position="TopLeft">6</Char>
+   <Char Unicode="91" Position="BottomLeft">[</Char>
+  </Key>
+  <Key Width="80" X="700" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="55" Position="TopLeft">7</Char>
+   <Char Unicode="93" Position="BottomLeft">]</Char>
+  </Key>
+  <Key Width="80" X="800" Y="0" Height="80" FingerKeyIndex="5" Type="NORMAL">
+   <Char Unicode="56" Position="TopLeft">8</Char>
+   <Char Unicode="42" Position="BottomLeft">*</Char>
+  </Key>
+  <Key Width="80" X="900" Y="0" Height="80" FingerKeyIndex="6" Type="NORMAL">
+   <Char Unicode="57" Position="TopLeft">9</Char>
+   <Char Unicode="40" Position="BottomLeft">(</Char>
+  </Key>
+  <Key Width="80" X="1000" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="48" Position="TopLeft">0</Char>
+   <Char Unicode="41" Position="BottomLeft">)</Char>
+  </Key>
+  <Key Width="80" X="1100" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="37" Position="TopLeft">%</Char>
+   <Char Unicode="38" Position="BottomLeft">&amp;</Char>
+  </Key>
+  <Key Width="80" X="1200" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="43" Position="TopLeft">+</Char>
+   <Char Unicode="61" Position="BottomLeft">=</Char>
+  </Key>
+  <Key Width="80" X="150" Y="100" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="81" Position="TopLeft">Q</Char>
+  </Key>
+  <Key Width="80" X="250" Y="100" Height="80" FingerKeyIndex="1" Type="NORMAL">
+   <Char Unicode="68" Position="TopLeft">D</Char>
+  </Key>
+  <Key Width="80" X="350" Y="100" Height="80" FingerKeyIndex="2" Type="NORMAL">
+   <Char Unicode="82" Position="TopLeft">R</Char>
+  </Key>
+  <Key Width="80" X="450" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="87" Position="TopLeft">W</Char>
+  </Key>
+  <Key Width="80" X="550" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="66" Position="TopLeft">B</Char>
+  </Key>
+  <Key Width="80" X="650" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="74" Position="TopLeft">J</Char>
+  </Key>
+  <Key Width="80" X="750" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="70" Position="TopLeft">F</Char>
+  </Key>
+  <Key Width="80" X="850" Y="100" Height="80" FingerKeyIndex="5" Type="NORMAL">
+   <Char Unicode="85" Position="TopLeft">U</Char>
+  </Key>
+  <Key Width="80" X="950" Y="100" Height="80" FingerKeyIndex="6" Type="NORMAL">
+   <Char Unicode="80" Position="TopLeft">P</Char>
+  </Key>
+  <Key Width="80" X="1050" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="64" Position="TopLeft">@</Char>
+   <Char Unicode="36" Position="BottomLeft">$</Char>
+  </Key>
+  <Key Width="80" X="1150" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="94" Position="TopLeft">^</Char>
+   <Char Unicode="58" Position="BottomLeft">:</Char>
+  </Key>
+  <Key Width="80" X="1250" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="34" Position="TopLeft">"</Char>
+   <Char Unicode="39" Position="BottomLeft">'</Char>
+  </Key>
+  <Key Width="80" X="580" Y="200" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="71" Position="TopLeft">G</Char>
+  </Key>
+  <Key Width="80" X="680" Y="200" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="89" Position="TopLeft">Y</Char>
+  </Key>
+  <Key Width="80" X="1180" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="95" Position="TopLeft">_</Char>
+   <Char Unicode="45" Position="BottomLeft">-</Char>
+  </Key>
+  <Key Width="80" X="1280" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="124" Position="TopLeft">|</Char>
+   <Char Unicode="92" Position="BottomLeft">\</Char>
+  </Key>
+  <Key Width="80" X="130" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="60" Position="TopLeft">&lt;</Char>
+   <Char Unicode="62" Position="BottomLeft">></Char>
+  </Key>
+  <Key Width="80" X="230" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="90" Position="TopLeft">Z</Char>
+  </Key>
+  <Key Width="80" X="330" Y="300" Height="80" FingerKeyIndex="1" Type="NORMAL">
+   <Char Unicode="88" Position="TopLeft">X</Char>
+  </Key>
+  <Key Width="80" X="430" Y="300" Height="80" FingerKeyIndex="2" Type="NORMAL">
+   <Char Unicode="77" Position="TopLeft">M</Char>
+  </Key>
+  <Key Width="80" X="530" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="67" Position="TopLeft">C</Char>
+  </Key>
+  <Key Width="80" X="630" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="86" Position="TopLeft">V</Char>
+  </Key>
+  <Key Width="80" X="730" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="75" Position="TopLeft">K</Char>
+  </Key>
+  <Key Width="80" X="830" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="76" Position="TopLeft">L</Char>
+  </Key>
+  <Key Width="80" X="930" Y="300" Height="80" FingerKeyIndex="5" Type="NORMAL">
+   <Char Unicode="60" Position="TopLeft">&lt;</Char>
+   <Char Unicode="44" Position="BottomLeft">,</Char>
+  </Key>
+  <Key Width="80" X="1030" Y="300" Height="80" FingerKeyIndex="6" Type="NORMAL">
+   <Char Unicode="62" Position="TopLeft">></Char>
+   <Char Unicode="46" Position="BottomLeft">.</Char>
+  </Key>
+  <Key Width="80" X="1130" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="63" Position="TopLeft">?</Char>
+   <Char Unicode="47" Position="BottomLeft">/</Char>
+  </Key>
+ </Keys>
+ <Connections>
+  <KeyConnector TargetKeyIndex="0"  KeyUnicode="97" />
+  <KeyConnector TargetKeyIndex="0"  KeyUnicode="65"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="1"  KeyUnicode="115"/>
+  <KeyConnector TargetKeyIndex="1"  KeyUnicode="83"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="2"  KeyUnicode="104"/>
+  <KeyConnector TargetKeyIndex="2"  KeyUnicode="72"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="3"  KeyUnicode="116"/>
+  <KeyConnector TargetKeyIndex="3"  KeyUnicode="84"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="4"  KeyUnicode="110"/>
+  <KeyConnector TargetKeyIndex="4"  KeyUnicode="78"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="5"  KeyUnicode="101"/>
+  <KeyConnector TargetKeyIndex="5"  KeyUnicode="69"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="6"  KeyUnicode="111"/>
+  <KeyConnector TargetKeyIndex="6"  KeyUnicode="79"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="7"  KeyUnicode="105"/>
+  <KeyConnector TargetKeyIndex="7"  KeyUnicode="73"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="8"  KeyUnicode="260"/>
+  <KeyConnector TargetKeyIndex="9"  KeyUnicode="13" />
+  <KeyConnector TargetKeyIndex="10" KeyUnicode="257"/>
+  <KeyConnector TargetKeyIndex="11" KeyUnicode="264"/>
+  <KeyConnector TargetKeyIndex="12" KeyUnicode="265"/>
+  <KeyConnector TargetKeyIndex="13" KeyUnicode="263"/>
+  <KeyConnector TargetKeyIndex="14" KeyUnicode="262"/>
+  <KeyConnector TargetKeyIndex="15" KeyUnicode="32" />
+  <KeyConnector TargetKeyIndex="16" KeyUnicode="258"/>
+  <KeyConnector TargetKeyIndex="17" KeyUnicode="259"/>
+  <KeyConnector TargetKeyIndex="18" KeyUnicode="8"  />
+  <KeyConnector TargetKeyIndex="19" KeyUnicode="126"/>
+  <KeyConnector TargetKeyIndex="19" KeyUnicode="96"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="20" KeyUnicode="59" />
+  <KeyConnector TargetKeyIndex="20" KeyUnicode="49"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="21" KeyUnicode="33" />
+  <KeyConnector TargetKeyIndex="21" KeyUnicode="50"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="22" KeyUnicode="35" />
+  <KeyConnector TargetKeyIndex="22" KeyUnicode="51"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="23" KeyUnicode="123"/>
+  <KeyConnector TargetKeyIndex="23" KeyUnicode="52"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="24" KeyUnicode="125"/>
+  <KeyConnector TargetKeyIndex="24" KeyUnicode="53"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="25" KeyUnicode="91" />
+  <KeyConnector TargetKeyIndex="25" KeyUnicode="54"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="26" KeyUnicode="93" />
+  <KeyConnector TargetKeyIndex="26" KeyUnicode="55"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="27" KeyUnicode="42" />
+  <KeyConnector TargetKeyIndex="27" KeyUnicode="56"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="28" KeyUnicode="40" />
+  <KeyConnector TargetKeyIndex="28" KeyUnicode="57"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="29" KeyUnicode="41" />
+  <KeyConnector TargetKeyIndex="29" KeyUnicode="48"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="30" KeyUnicode="38" />
+  <KeyConnector TargetKeyIndex="30" KeyUnicode="37"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="31" KeyUnicode="61" />
+  <KeyConnector TargetKeyIndex="31" KeyUnicode="43"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="32" KeyUnicode="113"/>
+  <KeyConnector TargetKeyIndex="32" KeyUnicode="81"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="33" KeyUnicode="100"/>
+  <KeyConnector TargetKeyIndex="33" KeyUnicode="68"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="34" KeyUnicode="114"/>
+  <KeyConnector TargetKeyIndex="34" KeyUnicode="82"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="35" KeyUnicode="119"/>
+  <KeyConnector TargetKeyIndex="35" KeyUnicode="87"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="36" KeyUnicode="98" />
+  <KeyConnector TargetKeyIndex="36" KeyUnicode="66"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="37" KeyUnicode="106"/>
+  <KeyConnector TargetKeyIndex="37" KeyUnicode="74"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="38" KeyUnicode="102"/>
+  <KeyConnector TargetKeyIndex="38" KeyUnicode="70"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="39" KeyUnicode="117"/>
+  <KeyConnector TargetKeyIndex="39" KeyUnicode="85"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="40" KeyUnicode="112"/>
+  <KeyConnector TargetKeyIndex="40" KeyUnicode="80"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="41" KeyUnicode="36" />
+  <KeyConnector TargetKeyIndex="41" KeyUnicode="64"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="42" KeyUnicode="58" />
+  <KeyConnector TargetKeyIndex="42" KeyUnicode="94"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="43" KeyUnicode="39" />
+  <KeyConnector TargetKeyIndex="43" KeyUnicode="34"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="44" KeyUnicode="103"/>
+  <KeyConnector TargetKeyIndex="44" KeyUnicode="71"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="45" KeyUnicode="121"/>
+  <KeyConnector TargetKeyIndex="45" KeyUnicode="89"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="46" KeyUnicode="45" />
+  <KeyConnector TargetKeyIndex="46" KeyUnicode="95"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="47" KeyUnicode="92" />
+  <KeyConnector TargetKeyIndex="47" KeyUnicode="124" ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="48" KeyUnicode="62" />
+  <KeyConnector TargetKeyIndex="48" KeyUnicode="60"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="49" KeyUnicode="122"/>
+  <KeyConnector TargetKeyIndex="49" KeyUnicode="90"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="50" KeyUnicode="120"/>
+  <KeyConnector TargetKeyIndex="50" KeyUnicode="88"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="51" KeyUnicode="109"/>
+  <KeyConnector TargetKeyIndex="51" KeyUnicode="77"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="52" KeyUnicode="99" />
+  <KeyConnector TargetKeyIndex="52" KeyUnicode="67"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="53" KeyUnicode="118"/>
+  <KeyConnector TargetKeyIndex="53" KeyUnicode="86"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="54" KeyUnicode="107"/>
+  <KeyConnector TargetKeyIndex="54" KeyUnicode="75"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="55" KeyUnicode="108"/>
+  <KeyConnector TargetKeyIndex="55" KeyUnicode="76"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="56" KeyUnicode="44" />
+  <KeyConnector TargetKeyIndex="56" KeyUnicode="60"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="57" KeyUnicode="46" />
+  <KeyConnector TargetKeyIndex="57" KeyUnicode="62"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="58" KeyUnicode="47" />
+  <KeyConnector TargetKeyIndex="58" KeyUnicode="63"  ModifierIndex="10"/>
+ </Connections>
+</KTouchKeyboard>
+
diff --git a/keyboard/ergodox/addons/etc/layout/ktouch/workman-wdp-fast.ktouch.xml b/keyboard/ergodox/addons/etc/layout/ktouch/workman-wdp-fast.ktouch.xml
new file mode 100644 (file)
index 0000000..09db487
--- /dev/null
@@ -0,0 +1,585 @@
+<KTouchLecture>
+ <Title>Fast Workman + symbols from Dvorak for programme</Title>
+ <FontSuggestions>Courier 10 Pitch</FontSuggestions>
+ <Levels>
+  <Level>
+   <NewCharacters>ashtneoi</NewCharacters>
+   <Line>than oath tone tints tees nth hoe hahs tea eat ions</Line>
+   <Line>taint ho ass hoses ash test tan hot toes s ts soot one</Line>
+   <Line>hahs ion sises ash hosts ton hot tee tints taint shies</Line>
+   <Line>hen seas teen he tot hint the hoses son tost sine into</Line>
+   <Line>ho tens the noon sin hes shin shoo soon tins sit</Line>
+   <Line>hoot a ts ah neon tit heat toss sis in s host ions ton</Line>
+   <Line>nests note neat oaten nit sons inti inane shah soot</Line>
+   <Line>h inn is i nit he sets o this note test sans hash ton</Line>
+   <Line>stone neath those oh none sons sit tins tins ha</Line>
+   <Line>oath e sheen hos tee hosts ate neath hint ate h</Line>
+   <Line>snits tans tone h notes tie hes noons note tease shoe</Line>
+   <Line>tots ante thin s tot s tho aeon eon hits shin hat tine</Line>
+   <Line>is satin shoos sits sanes too sine es those shine neat</Line>
+   <Line>inane too thee sh hath the noes sass tee sots test</Line>
+   <Line>shins inns snot onto es an ten then shoo tons tees tine</Line>
+   <Line>tins ions sit ten stone s those son oh hoses on</Line>
+   <Line>tins aha tats state ate i o oaten noons is senna satin</Line>
+   <Line>sises sat tees sit hone teat sat shot neath that</Line>
+   <Line>stone sat tan ate ha tote shoe ton anti hoot shat</Line>
+   <Line>sat tea ani as sh test tea the ate thine sits t too</Line>
+   <Line>ins sises an tots thee shat ion sass nits hoses nose</Line>
+   <Line>hen in ahas the eh shine hens oath at he tine hoses noses</Line>
+   <Line>noon sites aeon eon at tints nits hes shes thine inane</Line>
+   <Line>this hes sate at hit eon tens hoot ion eons hies</Line>
+   <Line>tote ts shit shit ahas seas o non sane ease at not</Line>
+   <Line>sasses shit soon teat ah totes nannies sties sites tho</Line>
+   <Line>notes oats shins ions stats tin tonnes shits stats</Line>
+   <Line>inset sashes shoots host a anion tens hashes tenets</Line>
+   <Line>anoint ohos tee saith shone hats sh hostess ease</Line>
+   <Line>hash hoes hashes neat insist anoints hoists sanest</Line>
+   <Line>es ts anti sea theists asses sateen notion sane hen</Line>
+   <Line>shits shoot aeon nets hats sass hot hit session nests</Line>
+   <Line>attain son hose eats oaten sits seasons otiose sans</Line>
+   <Line>hate nets toes stoats sot settees nits not titan noes</Line>
+   <Line>sonatas toot tost tosses ante tins sons teens hoist</Line>
+   <Line>oh asses season soon antenna sashes steins oath</Line>
+   <Line>hits hoes heat the o toot tinnies sass hoots snoots tat</Line>
+   <Line>tents neat hotshot noshes snot satiate inti stoat</Line>
+   <Line>tie stoats tents sent sonata stones hints hate sises</Line>
+   <Line>sites testate then oat neatest sonnet noshes ohos</Line>
+   <Line>honest teethes soot satiate tattoo titan noses sass</Line>
+   <Line>anoint tans ah not neatest notion onion ass onsets</Line>
+   <Line>tees easies anti he tint nits sit saith anion note</Line>
+   <Line>henna hoists ants snoots tines siestas ten sonata tie</Line>
+   <Line>sites easiest sonnies anons session hoe theist ani</Line>
+   <Line>notions sties sheets ants insane estate hie in</Line>
+   <Line>hos noise teethes assets intense assents sat hoot</Line>
+   <Line>stash thee thee one teethes sheathe so seas tinnies his</Line>
+   <Line>sonata toot oh thin toss tattoos shines sheath nosies</Line>
+   <Line>inti hoists noons shoo toniest tint teats noose anise</Line>
+  </Level>
+  <Level>
+   <NewCharacters>qdrwfup$</NewCharacters>
+   <Line>thrush stride super apt $ups foe hairs trout wrests erupts</Line>
+   <Line>pita $pisses seres dons seeped dread option $feuded thus</Line>
+   <Line>praise pots pupa $pear drones swords runts preps prefer</Line>
+   <Line>snouts added unfit $theft rifted $front info$ winner</Line>
+   <Line>unset porn rosin troth opines swine operas $west rares</Line>
+   <Line>iffier opera heeded ware finest hers arrows atria</Line>
+   <Line>fifes panda quotas were rewire dots sadder aided wins</Line>
+   <Line>thrift nun dun psst queen $sorer piers frets dares</Line>
+   <Line>$ires darned $potato pared$ hue undies duffer errs reused</Line>
+   <Line>sweep earned ended touts poises shorts uteri fainer free</Line>
+   <Line>widows pips hide roared $arson pas doffs frond parent shadow</Line>
+   <Line>dunno purr$ putt west weds$ tauter swaps teed truth</Line>
+   <Line>pupas quip rips strop purse sored sered trod whited</Line>
+   <Line>aria dried $paths shorts did pees $haws whoops hewn</Line>
+   <Line>runt pepper stow wanna woofs hut shined aft rod what</Line>
+   <Line>dense aides air$ $outed $whets pea$ sands herpes$ raped</Line>
+   <Line>dote stows quips pips pets quasar sores twos urea</Line>
+   <Line>upon shiner $spades dotted roofs post $niter $dared darned</Line>
+   <Line>heeded$ $warned sifts twee tared dread$ fond$ apes</Line>
+   <Line>soup puff $troop panda report osiers $puffs eddies redrew</Line>
+   <Line>nutted strap$ weired udder wind fetid fain rapes sear</Line>
+   <Line>swats rotate entrap waders$ or hue nu road eased reran</Line>
+   <Line>feta tutors sander $shows for eddied $hoofs rs herons</Line>
+   <Line>truer theed sowed fores fern dope nadirs fat aerate pis</Line>
+   <Line>few turner purrs darn peers sauted tauter dated$ show</Line>
+   <Line>$warrior airs sprier quitted adepter potter niftier pouted</Line>
+   <Line>wadi rhea$ froth quire sups pet opined firsts redound</Line>
+   <Line>$footed dirties forties arrows$ snorer present fiesta</Line>
+   <Line>appease shape noshed seeded$ winded $urns swoops outs</Line>
+   <Line>rifted outdid perhaps hairpin ratio fended heir$ wrap</Line>
+   <Line>$pundit spade hasp adopts fains suture suers refuted</Line>
+   <Line>dint thrifts $partied $squads renter tied turnout roded</Line>
+   <Line>arid whiffed power$ terrors opinion $poops nippier hearth</Line>
+   <Line>denier fiestas suited nearest waif horses tore</Line>
+   <Line>hairdo frond fades dodo soprano sinew fattier downed</Line>
+   <Line>disused persist pariah roaster arrears $soups owned</Line>
+   <Line>feeders orates errata fear senders snipers hither upped</Line>
+   <Line>waif teethed $shodden sun$ renter sue poises doff dwarfed</Line>
+   <Line>troupes rinds earths append draft rooster peeper</Line>
+   <Line>rereads finner upsets potpies stopped $showers sprites</Line>
+   <Line>teeters radios roofed twits radiant $wears steers fritter</Line>
+   <Line>sworded swap diets$ hosed honors won arouse weirder speed</Line>
+   <Line>dare nerds pendent $protons poohed tardies$ $stripe shade</Line>
+   <Line>outers hooted ids psst hosted sour editors pewters sered</Line>
+   <Line>edition weirs $truer tented unison spriest opus peons</Line>
+   <Line>outwit quiet writhed readies peso swatter tape$ pennon</Line>
+   <Line>$snorts spats ships harpist town $swathes shapes fa</Line>
+   <Line>trotter aspirin odds $iffier howdah sortied pains wand</Line>
+   <Line>$sorts $entwine turrets tartars unstop inner$ inside prior</Line>
+   <Line>who trades starter duh intoned$ artiste sensors fain</Line>
+  </Level>
+  <Level>
+   <NewCharacters>bjgycvkl</NewCharacters>
+   <Line>$creek fjord leans eureka rowel vagued cage pickup holler</Line>
+   <Line>ogre lanced $churls bidets cots glow $chows bean satiny</Line>
+   <Line>bags capons bulbed$ ulcer beech bogey going vials novel</Line>
+   <Line>dusk jabbed $cysts dactyl covert herb forgo belied buffet</Line>
+   <Line>$foray abbeys$ avows lubing tawny chant loudly$ last</Line>
+   <Line>hack stork$ divan cleans sight ebbed venal$ flower pal</Line>
+   <Line>$darken growl vacant ballad cased scab yonder pickup</Line>
+   <Line>beeves $leans hyphen beck scoop chart$ dyer guff beers</Line>
+   <Line>casks lovely piker junta $cannon panel horsy wackos</Line>
+   <Line>convoy dales tank claws lavish subdue birth fluffy jaguar</Line>
+   <Line>alone bonier region lever $cellar paltry kicks hooked ribald</Line>
+   <Line>livens rights$ $boater gouty gooks ballad gosh leans</Line>
+   <Line>$ranks belief ghoul pulls punch cops wry coyote weaver</Line>
+   <Line>loans nil surrey dicks tyrant awoke kabob glided bribe</Line>
+   <Line>surrey $donkey elide$ welds ruby$ pilaf cleat story uncle</Line>
+   <Line>dewlap$ $petrol lushes ceded lush blahs jury$ slob gofers</Line>
+   <Line>above dweeb$ chaste knives rung leggy ploys richer vices</Line>
+   <Line>rakish $hubs treks swirl wall life appal evils$ greys</Line>
+   <Line>arrays $longs cloths squawk viands ironic plows fitful</Line>
+   <Line>flown $bouts relays$ pilaff doled citric trench hailed</Line>
+   <Line>dauber bind $cost avasts $befit petal flea hoagie colic</Line>
+   <Line>edging geckos etcher cyclic$ typed jack splays reckon</Line>
+   <Line>cuss alter you lieges cools wage taco gaping$ dahlia</Line>
+   <Line>juts rabbit panty pinked trowel unsay cubit bounty</Line>
+   <Line>lisp$ knave hanky drub agave$ shrank dodge $baboon jags</Line>
+   <Line>flunked $ogres ravaged $enrols tikes sickles flee parolee</Line>
+   <Line>brain avid legatee$ ethnic nailing blanch cawing$ solve</Line>
+   <Line>nesting fury avenges swanky placers delete berried taller</Line>
+   <Line>sorrels befalls pueblos janitor gnaw bright glueing$ facts</Line>
+   <Line>griped justify bounty sloe$ clatter$ chichi cyanide weedy</Line>
+   <Line>flub scion piggies$ lisped succor shivery $doings charge</Line>
+   <Line>etched opting higher nick advents $chains $equably join</Line>
+   <Line>geodes clarion detects gable $lassie scythes eerily</Line>
+   <Line>says cubs things dowager gaping$ viewing$ scraped wiliest</Line>
+   <Line>fateful scorn brinks collude drills beside ovoid stilt</Line>
+   <Line>$victory glut savvier $leach such$ $rubiest concord jape</Line>
+   <Line>vagary burps rifled barred retract rooting ranks glad</Line>
+   <Line>auburn losing swirly burgles ascends rabbles canine dove</Line>
+   <Line>curing throngs fueling wangles balls relied gas cloths</Line>
+   <Line>repays quoting creates browner carpi nils stooges scuttle</Line>
+   <Line>slakes hibachi $wetland gayer corsage revues clue</Line>
+   <Line>falters staled recur frolic palsied splashy evils geckos</Line>
+   <Line>bloc kisser slued gluts browser$ fluent pullets pile</Line>
+   <Line>caterer $bearish lagoon target chicory wingers ocelots</Line>
+   <Line>serials blob lessor quirked gods $intake coaling kneeing</Line>
+   <Line>unlikes viol winging brogues loving booting bonkers</Line>
+   <Line>socks $slanted $stacks thongs cite $ranking whalers$ unwary</Line>
+   <Line>henpeck chairs foetal$ sausage shyness vegans laciest</Line>
+   <Line>snitch$ $acres lacked sleek $entail ilks budge recoils</Line>
+   <Line>florae aspic deject kookier gain cleanse ingot rising</Line>
+  </Level>
+  <Level>
+   <NewCharacters>zxm,./:'\-</NewCharacters>
+   <Line>clump manges moth raceme tuxes empire ,mashes mowers fixed</Line>
+   <Line>blazes, mid/ -monks fixity chimps hansom \hoaxes merged</Line>
+   <Line>opium .dioxin emir grazes lament, times chomp 'atom sexes</Line>
+   <Line>smit moo gamed zed /jammed stumps monger\ rummy mute</Line>
+   <Line>groom- impede rhombi lumber mores seized omelet moder</Line>
+   <Line>eczema/ mosque' crazy miler/ damp hymn maizes thumbs' mantis</Line>
+   <Line>meeker clime prom' \blintz .molder mapped atom miffs domain</Line>
+   <Line>.zodiac humors/ champ boom$ 'hemmed cameo -dams mimosa</Line>
+   <Line>emirs manics atom caroms pygmy hoaxed. stanza dogmas</Line>
+   <Line>expert- jazzed- macing medics gram' muggy -mull makeup</Line>
+   <Line>mammas:: vamped$ emoted:: merely oxbow sambas, semi</Line>
+   <Line>bums\ bums' thymus barman\ blooms- farm malign smiles</Line>
+   <Line>spumed \rime gambit -scuzzy femur mull/ .scrimp chrome</Line>
+   <Line>swampy \make marshy zinc sums rumble nixed calmed dimes</Line>
+   <Line>smells tumble ,name klutz, jumbos blame\ muting. numbly</Line>
+   <Line>ampuls- disarm stumps ::motor mar. medal 'slalom flaxen</Line>
+   <Line>\ermine -amaze micra cervix -aroma more $mainly disarm</Line>
+   <Line>::morn timbre/ forums manned lump mucks, grime named</Line>
+   <Line>topaz, zeta .dame slum\ hum roomer /limns sizing ritzy</Line>
+   <Line>mashed fluxes ,qualm ,minis humors' ::gyms mussed' misdo</Line>
+   <Line>mutts .demote manner amazes umped minxes manned x</Line>
+   <Line>ampuls -hexing ,exert -crimp muter' amused storm$ bimbo</Line>
+   <Line>bamboo exodus chrome macro remark merger$ monies carom</Line>
+   <Line>scummy. macing ::ms taxies\ smote laxer ::shames murky</Line>
+   <Line>mart' spume mocked/ flux shames hoaxes lambs ohm hammed</Line>
+   <Line>theme. domains. toolbox\ miters ,fizz murk /theism madly</Line>
+   <Line>amends mood flume hoaxes woodmen $musky plumage myopics</Line>
+   <Line>mufti ashram$ eminent ::poxes mangoes tumble ::expound motors</Line>
+   <Line>plazas meeker exit$ /jam airman homier mutter customs vizor</Line>
+   <Line>latex$ $marts myopics cameos anthem mooring lament damper</Line>
+   <Line>,merrier zero $sextant sputum\ ashamed/ animus' emitted</Line>
+   <Line>'makings muffler dualism' symbols froze meaning$ gizmos</Line>
+   <Line>amigos -clomps spumed noncom acme ::drummed misters comedy</Line>
+   <Line>$totemic malign' claimed himself norms. mange' immense</Line>
+   <Line>razzing tumbled dimness rumored slums mains magpies gunman</Line>
+   <Line>mucus dustmen mas- crumbed -hemlock \moulted bombed exacter</Line>
+   <Line>program. dam airmen\ becalm bronze diatom$ masts morsel</Line>
+   <Line>rimed morns 'moister umped rumbles clomps:: .gamin bombed</Line>
+   <Line>menfolk$ citizen midwife\ bramble capsize cameoed\ maze</Line>
+   <Line>mutants regimen temper roam dualism booze zonked, gummy</Line>
+   <Line>jasmine exiles .admiral damping- simile' mattock frogman</Line>
+   <Line>laments- denims zoom ampules mouse maiden:: boozier me</Line>
+   <Line>primed monitor mazes$ rhizome/ sixteen many- mammals mild</Line>
+   <Line>message motley\ purism milch sax barroom anytime romance</Line>
+   <Line>admirer mourned' limed doormat timpani simmer$ game</Line>
+   <Line>phloem womanly amasses merits -lama \limes 'newsmen reforms</Line>
+   <Line>$next midwife ,nomadic wizened vamps matures$ mousse mar</Line>
+   <Line>gourmet azimuth permute movies:: charms:: damp smoke</Line>
+   <Line>mooring similes zed -emerged plumb mummify /midway tamper</Line>
+   <Line>legmen ,waltz hertz, mowed emits waltz amber claims boatman</Line>
+  </Level>
+  <Level>
+   <NewCharacters>~;[{}(=*)+]%!</NewCharacters>
+   <Line>{fudge will cruets copse gash fumes town armies+ tannin</Line>
+   <Line>plunks! mauled. censer ravens .future tripe\ treed mu</Line>
+   <Line>gruels enrol dishes merry% oceans gouge ;while stars</Line>
+   <Line>+ploys edicts limber{ pounce =retain shove heath bonds</Line>
+   <Line>edgy allure clue arc scouts( hones\ bloods )titted purged</Line>
+   <Line>quark vector past; royals flaxen creed rowed [vising notice</Line>
+   <Line>-goose nooned bated whens }turf grub opted pluses iguana</Line>
+   <Line>lumps gnat! hoist ruffle! yore* -turfs gown entice guilt</Line>
+   <Line>aces{ metes sods slyly .easels \peps gamins law whets</Line>
+   <Line>]deeded job pokes cocoas %storey *thighs talker saw</Line>
+   <Line>nixed acrid $swells )hub toggle~ edicts grudge youth} perts</Line>
+   <Line>hid ducts pooh denim shoon wiggle~ stirs /bruins butte</Line>
+   <Line>opens\ !marts bravos discs man whited= taxis manner. mars</Line>
+   <Line>herons\ +tugs berms; lean flawed rifts aster worth outage</Line>
+   <Line>sold- axle liner) bolled blinds welled [enrage thwart boxers</Line>
+   <Line>]bugs =pooh .rheas tack [debts narks) baud %exes chumps</Line>
+   <Line>~fights rivals dines zonked toll stump melon flog gurus</Line>
+   <Line>brandy) divvy mien rosier, jurist quotes quiche stud</Line>
+   <Line>states tryout gobble !torso market tyros} plaque nobles</Line>
+   <Line>.wrong sloes) ports:: types sheave* depend obeys bother</Line>
+   <Line>trench saner pixy feuds deicer\ spud -stanks amiss r</Line>
+   <Line>%grad hexes joys plate crouch] pranks cede hype slink) duel</Line>
+   <Line>snotty- cunt bevel every% videos level- ~envoy seven hilly</Line>
+   <Line>holed{ }vowing humors coccis lilt vex[ ]fuse still rids</Line>
+   <Line>soiled ::shirk heal caplet] pearly) )soppy %outset coat</Line>
+   <Line>lacunae bans mods towered program' visuals whites titted</Line>
+   <Line>coheres- !ageing rent outwit\ largo, gambol bedroll= cagily</Line>
+   <Line>muumuu% tangier amassed leagued weeping- battens! leg</Line>
+   <Line>volley% guitars toying markups cupolas$ rawer ninepin% clique</Line>
+   <Line>rise} begged tramped roused) emblem. !gougers both strafes</Line>
+   <Line>hurrays herself daubing:: volt/ lubbers ,seek dampens reread</Line>
+   <Line>}twilled surname duck% %fulling ravels; outputs) vamps</Line>
+   <Line>satiate bodice /bits ::nighest foolish doffs graving badges</Line>
+   <Line>purveys fretful several shaker +pizzas sellers handle</Line>
+   <Line>+include likable towered ,tic airfare ;painful infidel</Line>
+   <Line>burgs egoists wasps reputed[ rafting (editor %scrams karate</Line>
+   <Line>alluvia bounty coifed }rescued guise( {sects /nomads true</Line>
+   <Line>}craning violet }settee foremen elitist homer jigging laser</Line>
+   <Line>teeter timider vale. spinner~ %holder \swerved rein</Line>
+   <Line>*chirrup excite guffaw wobbly (jetties -awaked waifing</Line>
+   <Line>afloat day% weirds \various ideally depend bosom spiffy</Line>
+   <Line>quarto quavery[ 'revenue )ankh whoops! 'hissing silkier</Line>
+   <Line>exhales/ diorama thins belched wash ionizes! 'woozy paddies</Line>
+   <Line>{bolts germ hammed oaken) imbibed wenches:: juncos decade</Line>
+   <Line>$calked dryly babes elitism[ outlets slave:: scenery fief</Line>
+   <Line>garnish) weeks) deigned tabling ~reduce chived reused</Line>
+   <Line>$impetus dithers+ aspics~ =troths fags gyros vagrant reared</Line>
+   <Line>tunics[ =golfer endure forcing' curd .yuckier }rhizome gazette</Line>
+   <Line>'armorer clicked} siding sinning hernias +munches caudal</Line>
+   <Line>}wiled renewal coffer furled pigskin; !valley pistil</Line>
+  </Level>
+  <Level>
+   <NewCharacters>0123456789</NewCharacters>
+   <Line>(saved moss tint:: tomb )cowers neath gosh; booty+ chive</Line>
+   <Line>pity canes ankhs( ~spoken cabal- moons$ poring laking froze</Line>
+   <Line>plugs toughs dilled [putty email 6vices harks alters% attar</Line>
+   <Line>sells pagers\ habit fest %cars yucked whited canine bahs</Line>
+   <Line>calked rehab hours. paunch sour{ trace, =pate mimosa props</Line>
+   <Line>harass tamer5 fa ::renown !mopes firms6 naive -motive clasp</Line>
+   <Line>dunks cubing found homier troupe blur gnarls drills8 trucks</Line>
+   <Line>sonic raze +rhyme \hymns rank salves boots ate knew clots</Line>
+   <Line>looter5 avasts {amigo stun, voled taut )vanned traces</Line>
+   <Line>1icier comas states/ crown black whams* apse inch/ kicked</Line>
+   <Line>byes. blent, burrs hotbed foist moats. egg neon4 splint</Line>
+   <Line>,cameo .annual raved sludge' {snit thrust foul absurd operas</Line>
+   <Line>amid soul except+ icebox owning single kiddo% socks9 braced</Line>
+   <Line>~hoping ulcers2 quake wades $tan fates 7blabs 5yogurt masks</Line>
+   <Line>rabid clumps (downed coital 3blue avian gotta+ runt cocoas</Line>
+   <Line>nomad %ridges huhs {victim stains9 twee hammed 5corn wish</Line>
+   <Line>cell:: ampuls dammed2 osprey 9moaned latent adorn goo</Line>
+   <Line>sagest 1dammed dim jinnis tents exits5 3ratios 4milieu gains</Line>
+   <Line>lining$ ~pangs knew yawed% pawed join= begs% honey prize</Line>
+   <Line>4erupts lowly= %lids unsaid stymie gaunts depend lousy</Line>
+   <Line>shoon rifest 1unpin sunny! slick wooer writer mail making</Line>
+   <Line>tire mentor* cans) tined brays% germ$ huff2 hymen coded</Line>
+   <Line>flaks ~deck dreary 7stud dizzy menial phone taps of</Line>
+   <Line>flanks:: .scary deeps] 3primp mainly[ 5areas 7hornet cabals</Line>
+   <Line>testes 4inure cheat pecan jest thaws brinks }fill abhor</Line>
+   <Line>'superb tares 7densest 7feign fiats1 ~hardens ::equines bums</Line>
+   <Line>pillbox= doused \pinch sonata pisses supine0 !woolier smears</Line>
+   <Line>petted (toiler wag jackets forgive peeves, pore enthuse</Line>
+   <Line>localed hawser begin excuse cancans celled \runner drags</Line>
+   <Line>lustily$ rottens carboys *livable japes= -framer maw</Line>
+   <Line>link heal touched ingrain attest romaine' gaging bobcat</Line>
+   <Line>oodles nicks tackles throne% z (bosser ashram gluts ringing</Line>
+   <Line>hideous] *bowls nutrias }hid thinly% radiate- bung( balk</Line>
+   <Line>example ::carpet layout 3sonny %read plot contact! fairway</Line>
+   <Line>-hardtop bops+ gruels surety !oddity 4trothed *partner grit</Line>
+   <Line>sulky} -demise gollies =afoot japan jollied elope reputed</Line>
+   <Line>comings lockets jape 7chisel jinxed( vagues \balder giving</Line>
+   <Line>wend groovy airways jinn* preppie ;sicks yogis( needs</Line>
+   <Line>jollies ;wizard [however hiss] }lions bones hollow- shaves</Line>
+   <Line>bun! 7gathers smooth' (eddy arches kopeks casket poured</Line>
+   <Line>dolling$ kidneys4 4bredes smile' infests discos$ sleazy</Line>
+   <Line>}revoked 1barred comic+ 1mutable ]jesters suiting[ rations</Line>
+   <Line>\hotter mu server. cartel salads 7teethed drills reused</Line>
+   <Line>lows hahs scenes satchel moonlit desires %bows inseams chops</Line>
+   <Line>chagrin; brutish{ [hurried cobbler thorn wagoner endowed</Line>
+   <Line>fount fuzes cricks pans studded5 recall woofers cupped</Line>
+   <Line>rack5 clerk chain =bronzes miller *masking 6maids tariffs</Line>
+   <Line>::rumpled sputum blacken (kneecap phonier= midland6 cupolas</Line>
+   <Line>pitches~ avoided 2niggle hitter{ totemic- nobody answers</Line>
+   <Line>meeter9 scarred$ inmates6 /lessees rhymed miser[ tabooed</Line>
+  </Level>
+  <Level>
+   <NewCharacters>&lt;>?#@^"|</NewCharacters>
+   <Line>fucker2 whams7 5drum 0wipes rewire ~outwit wander peer</Line>
+   <Line>laced wusses vivas his 7pluses mushes frugal goo bed</Line>
+   <Line>legs shorts 1poor threat fondly oil @basks skeet pimps</Line>
+   <Line>hooped 9brunt throe~ fir @fiver topped:: ages ]scald loaned</Line>
+   <Line>parry feint8 hoed:: hutch hominy mering4 {hydra fiver</Line>
+   <Line>globes >cusps makes jib ,uproar stout" sprig$ spare jives</Line>
+   <Line>grave gybe1 sheiks chile facets( 0ponder )amok enact</Line>
+   <Line>}diva pulsar *finger !laurel noted )pared jilt barren undue</Line>
+   <Line>odd aortae* sang +rest site .singe wile~ musky goof theed</Line>
+   <Line>ground razz &lt;bevels brogue cadre moral) sushi castle/ humbly</Line>
+   <Line>|saber linage 'killed piking baning mufti^ rude mambos</Line>
+   <Line>robing &lt;joked floor ]coccis stoats oaths) pupil pairs</Line>
+   <Line>tunnel 'sinker latent 6bursar 5clones hulks pith auk</Line>
+   <Line>size ?griefs pangs% murk chili cox tore tinges decode( foxes</Line>
+   <Line>0bland fetter taunt{ /ruins wisp= teat waive jinni. faced</Line>
+   <Line>undoes 0rears belie %la drawn. -nodule slime:: eking monks</Line>
+   <Line>;arctic 7slake =bumped ruler8 cabbie .angled 7rattan swipe</Line>
+   <Line>liens eels' 8prying pylon &lt;vanes .flap "funded nubs[ walls</Line>
+   <Line>shouts =poised evokes pied dub yacht:: hep larder{ yessed</Line>
+   <Line>churl payer prank scoff exist2 sulky wines +lid mazes. specs</Line>
+   <Line>under tramp posit drew larva0 4supply skit =common curs</Line>
+   <Line>"tumor flared jurist( pop milky 1glen whewed 3dots imbeds</Line>
+   <Line>rouse whirrs cohort pupil }cachet twill %heresy bogus</Line>
+   <Line>fa moose% bored{ seeks inside} =chinos 1lead slued| shekel</Line>
+   <Line>]smack $mashes ]tests harem layoff> bully ochre sexing</Line>
+   <Line>saucily4 anklet chiles >relapse crack+ sises( 5guyed crumby</Line>
+   <Line>7lees corpses neuron jets [puberty 9wighted baneful daunt</Line>
+   <Line>knack toggled5 bicker muse, caped momma. freeway* preen</Line>
+   <Line>seating, slink. lotus+ %quoits styes7 gel tone mists vagrant</Line>
+   <Line>pompous3 ranches .wimples /hived freak garbing fluent</Line>
+   <Line>mastoid 'recta salvo risky mining rife excites pacific" bulk</Line>
+   <Line>"maestro pundits- wittier. rudder= orbited/ tramped sprig</Line>
+   <Line>rents pains vowel +gill peeking moos| bottoms dubious isobars</Line>
+   <Line>2outrank croaked gabbed circle resume&lt; velvety- taring</Line>
+   <Line>(deputy nasal raffles6 loudest ooze* %chic waspish+ tusks</Line>
+   <Line>~cokes "gimme nobly dulled* #durably serener forums all</Line>
+   <Line>leavens 7settee davit guzzles mud&lt; =travels 'gawky creams</Line>
+   <Line>>imbeds snip bulky gee 4draftee cause meteors6 scone deep</Line>
+   <Line>"waxen 1retypes already- gimlet3 smart {upswing exempts</Line>
+   <Line>fusible 5wiled 8blessed behold manhunt bloomer pastes</Line>
+   <Line>rinsed" +terms gosling> 5sandbox 'stirrer ruddied pileup</Line>
+   <Line>hoot tripod blown{ imagery3 dignity] quaking fez9 slain</Line>
+   <Line>ivies fazed softens# anise mantis maps carver! gear lancers</Line>
+   <Line>imply lids ~gulling phoenix torques crocked coughs- busies</Line>
+   <Line>.finds pet 7fright pokeys layaway| making$ 6weirdos rawest</Line>
+   <Line>1comedic #intuit tumors toddle ,lighter =found paced</Line>
+   <Line>spider [yawing |stamp trusses 5zipper stable excite| maroon</Line>
+   <Line>2kopecks reams pocks lineup carmine wick {sices stank</Line>
+   <Line>|biggie echoes elides pupils; !timbres laundry! outlook</Line>
+   <Line>[grubby wittier punster/ cups pulpit( studio turnkey busses</Line>
+  </Level>
+  <Level>
+   <NewCharacters>Everything</NewCharacters>
+   <Line>bloat Avery cliffs heir's5 whacks onset( }lusty shod</Line>
+   <Line>gorier oboes Lyra's lonely amok/ cs's[ Niobe @odors timid</Line>
+   <Line>matzo Tiber odium koalas body's 1evenly dotes. musing- Han</Line>
+   <Line>Walden% smites Easter- tango &lt;bus's seeded %tinkle savior</Line>
+   <Line>spies emery mutual5 Allan, _hides garble= muffle tackle</Line>
+   <Line>hasps 7Allie massed twang 3racism dress% Hymen Gall</Line>
+   <Line>York deuces ::Eu's Abe's0 Lie hare shunts dyer's half</Line>
+   <Line>shanty3 spicy Zelma entrap .poke /propel loathe| flail</Line>
+   <Line>snob- ant bike/ baton 1roamed ::nickel hazing [toked vs</Line>
+   <Line>Katie )Billie piling. duff lied6 bowel strews sleigh= Andean</Line>
+   <Line>outset root's -Olive 4smoke pool's, shrink Brant jailor</Line>
+   <Line>luaus 2clam 1vend truism befoul[ duct doted known Mouthe</Line>
+   <Line>chic_ %Roxy's @Gd autism&lt; Ladoga 8Willis slunk9 poorer</Line>
+   <Line>Lean] bone's( wroth- nobly' rumple cord's county shock</Line>
+   <Line>eves} =rim (spud's manors+ tramp 2Nieves \fained Josue</Line>
+   <Line>pave' 7sizing feints6 anode socket' 3ruler Aisha1 Yale</Line>
+   <Line>Left 4Tuscon lops= semen weed $Cody's humbly, larynx maizes</Line>
+   <Line>gooey Tagus spoof Nita mailed5 evils_ woo Nile's deigns</Line>
+   <Line>tumble- racers claw >doubt bowl's5 5Sepoy bulb's darn</Line>
+   <Line>lobes Sister+ Lee hawker7 gulag Henson Efren )Gloria grow</Line>
+   <Line>pose gopher. |twang vital. smash deeply blow6 ,Slavs Sung's</Line>
+   <Line>cilia |cons wives Baez 6cowed ragtag =Eula spars Prut's</Line>
+   <Line>sot. {ramps )madras remit $deploy tonal brews 3avians bleach</Line>
+   <Line>F's 9geode kin's perm mole coops Olen ,Gary's lo0 ticks</Line>
+   <Line>vial yolks riots yeti's7 &lt;Sm Gina8 ::world Klimt Subaru</Line>
+   <Line>tattoos burnout/ rid [pilots wingtip Ci. fascism whitest</Line>
+   <Line>wiretap combing rupee grottos8 razing9 Boston\ Nehru's</Line>
+   <Line>bellow propane jetsam fray's sped/ pans flyover reissue</Line>
+   <Line>cycle mutter 'broncos laud sphinx cabal's2 tardier Julies</Line>
+   <Line>sanders Lowe's_ Grimm Kitty pointer pawls ::dowries Huerta</Line>
+   <Line>sting Poles traffic layaway )Rocha's Horatio [vagued scorn's</Line>
+   <Line>fang's riles7 bolero arbiter torched6 ]hamster runt's</Line>
+   <Line>phylae0 sills gazers flambes tanager 6wholes ,Holbein fib</Line>
+   <Line>juice's Freddie&lt; 0dosages cruised necking ::Aron lens</Line>
+   <Line>ampere+ graved torched 5Urdu {unitary Dilbert chill's</Line>
+   <Line>Kinko's] }wieners celli6 _will Helga morgue scores color's</Line>
+   <Line>Burt drover pealed{ blast's- galoshe{ Grafton gasket Niobe</Line>
+   <Line>Jilin Occam wills9 Saran's {hats 5minding infuses foyer's</Line>
+   <Line>::boiled bedtime> carboy {bossy emperor$ unstop Tbilisi</Line>
+   <Line>figures %Owens men 2sops anyone, epic's( dew liar- undo</Line>
+   <Line>%alertly 4goddamn vets 2powwows upset &lt;Terkel Stan's:: gazing</Line>
+   <Line>papery _expects disbars 4malaise donated &lt;balsas cooker</Line>
+   <Line>shamans ]plume Mimosa excepts Zukor's[ ask Cajun penal</Line>
+   <Line>veals fines -loosely ::seven }pummels bills 6majorly chant</Line>
+   <Line>4buckram machine =regions Karin's spikier %autoing planing</Line>
+   <Line>friends facile@ Wotan{ impurer+ @counter narcs@ cattail</Line>
+   <Line>)Jayne \speck genres akin:: hello> 6cocoa's wraiths) loci's</Line>
+   <Line>Muir [dunging Mani\ Cairo's Rita's stages =messy Osbert</Line>
+   <Line>-Douglas Kharkov whiner- slue threw( tempera, axises evading</Line>
+   <Line>brood's coursed 5lea's idea )McKee /horsed Nate pivotal</Line>
+   <Line>milker +Roy's weeded weird vet Elbe's1 3blown 7calves Rome's</Line>
+   <Line>four% [bade razzes vial 6Lawson chalk7 _wholly fluid jostle</Line>
+   <Line>-rind's Dylan agree Kitty bootee2 Ty toasts %mussed ninety</Line>
+   <Line>creep 2final bassi omen's/ |girdle diary9 Shinto Selma</Line>
+   <Line>shiver gait huge} fends genie hump's raze It 3masks vinyls</Line>
+   <Line>arrows turds Hess's( 6muzzle cocky8 chose brandy easies</Line>
+   <Line>laces fuzzes Ike godly@ civic \ebb 4maven herb- notary snare</Line>
+   <Line>Dave junior/ 2furrow trap's +Dick's prior) Juan's pocked</Line>
+   <Line>goofy 'racily Ã©lan clever clangs gunny Sean beat lad</Line>
+   <Line>.data's curb\ 7bitmap Haney Lu's] glance arbors Olav's</Line>
+   <Line>|Amalia Millay_ pedals1 9elite gulags husks umbel lithe</Line>
+   <Line>paunch Dorcas oblige% riser) 3moist ,Annam }Oprah bunny</Line>
+   <Line>8Elroy yaws[ pouts| /Tuscan (waging brigs lacks. coax</Line>
+   <Line>foetid\ Trina Eula sued6 slew@ &lt;shahs =Myers echo Euclid</Line>
+   <Line>Dix's) Taiwan batty/ nuke's} $ascots -Keven Kurile Nice</Line>
+   <Line>Sal's[ abject LyX verify) Louis backup:: ruses Leakey yelped</Line>
+   <Line>1yell widest tarpon butte tire Ira's 1sadism pols bay</Line>
+   <Line>bodkin jinnis -dills warden% thud 1wont's jerkin calyx</Line>
+   <Line>{panty 6Marcel larvae weer 0pi /gadget leeks flan[ jest's</Line>
+   <Line>0lynch refuse) Medea( Paul sword6 6rafter divert Aspell</Line>
+   <Line>surtax( Tubman )damped )solo's 8seduce tuxedo wigged0 risks</Line>
+   <Line>7Todd $living lash's eras siesta3 Jeeps kopek> Eva Nb's</Line>
+   <Line>bummed lewdly lamer }hared -Bettye oats Helios |floras weirs</Line>
+   <Line>3Jean facing$ pod Rob 5Siva's Kim's% /slump defers pubbed</Line>
+   <Line>[Nair's Creon_ data's\ orgasm bank's hats realty reef's</Line>
+   <Line>bib's fast }rewires probe, Elsie sitar's] Ypres's infer</Line>
+   <Line>bedded hep culture beacons [stabler 2sanely /Samar's rhea</Line>
+   <Line>seceded removal3 +Malacca eery coolers Miami [Co's nosegay</Line>
+   <Line>zoom Berlin desires_ glacier Betty4 =alright wrist's donors</Line>
+   <Line>8costar poesies:: brimful snowy Brandi 3rounder cult's</Line>
+   <Line>unlike+ heaven Marc's$ ratify5 tearful@ Frankie4 audit</Line>
+   <Line>adviser1 rose's buildup, 9legated spruces primes, Brno</Line>
+   <Line>'N's Wonder} Crystal befalls Ziploc5 elixir amours wrinkle</Line>
+   <Line>2decide gluier snubs Lille's Clare's -wasn't =sincere resend</Line>
+   <Line>Leigh's Brokaw suede- ]pillion 0yoga garages soon supper</Line>
+   <Line>iamb's drooled skirt's' (icing Carey's pinions hotshot</Line>
+   <Line>senders] Fatima fury's Lear's blurry squad carbide/ Erato's</Line>
+   <Line>Ricky Demeter{ tasted5 Jenkins( Lloyd- knitted boldly</Line>
+   <Line>%Arctic passels@ 7expends wives's morgues] dimmers postman</Line>
+   <Line>Murat4 absorb:: Wyeth lance5 fleeced gushed corded triage</Line>
+   <Line>Tarazed 2hernias )hula caroms rubber 3pothook Pl plot's</Line>
+   <Line>dramas) Alps drools Balkan' gos| Lysenko- &lt;pixel spouse</Line>
+   <Line>allayed+ champed rails 0Jimenez dived helps markups+ denims</Line>
+   <Line>6monitor basemen [sledges kabob Tutsi> Ben's &lt;encored Knapp</Line>
+   <Line>spool= absinth {hoard Pooh's hijacks+ collude Z's Midwest</Line>
+   <Line>shocker bright/ mender1 prep:: paces\ lily braids&lt; ridge</Line>
+   <Line>payable Paris's Tojo's jailers booming 'mileage trap's</Line>
+   <Line>Saab's swarms lip's/ okaying8 Ariz's aerials &lt;plume Crimean</Line>
+   <Line>_rum's %enrols hanging hospice&lt; 4urging Gipsy 1roaring bias</Line>
+   <Line>salvo8 schemes 2mien's briny sprites +Park refuges galling</Line>
+  </Level>
+  <Level>
+   <NewCharacters>PERL: {}()[]&lt;>\#</NewCharacters>
+   <Line>if ($line=~/^[^ ]+\s+\(([^)]+)\)\s/) {</Line>
+   <Line>$this->conffiles([map { chomp; $_ } $this->runpipe($zero, "LANG=C rpm -qcp $file")]);</Line>
+   <Line>$this->conffiles([]);</Line>
+   <Line>$this->filelist([map { chomp; $_ } $this->runpipe($zero, "LANG=C rpm -qpl $file")]);</Line>
+   <Line>$this->filelist([]);</Line>
+   <Line>arch group slpkgversion}];</Line>
+   <Line>Label => [],</Line>
+   <Line>Comment => [],</Line>
+   <Line>Attachment => [],</Line>
+   <Line>DependsOn => [],</Line>
+   <Line>Precedes => [],</Line>
+   <Line>my $self = bless [], $class;</Line>
+   <Line>@{ $var->[$zero] || [] }</Line>
+   <Line>@{ defined $var->[$zero] ? $var->[$zero] : [] }</Line>
+   <Line>$fmt =~ s/([^\s\[]*)\[( [^\]]* )\]/\x$n\xt$m\xe/xgo;</Line>
+   <Line>Convert::ASNI::_dec_integer({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
+   <Line>Convert::ASNI::_dec_boolean({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
+   <Line>Convert::ASNI::_dec_string({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
+   <Line>$_[$one]->[cLOOP] &amp;&amp; ($_[$three]=[]), #loop</Line>
+   <Line>@{$yyval = []}[cTYPE,cCHILD] = ('COMPONENTS', $yyvs[$yyvsp-$e]);</Line>
+   <Line>@{$yyval = []}[cTYPE,cCHILD,cLOOP,cOPT] = ($yyvs[$yyvsp-$d], [$yyvs[$yyvsp-$h]], $r, $yyvs[$yyvsp-$l]);</Line>
+   <Line>@{$yyval = []}[cTYPE,cCHILD] = ('SEQUENCE', $yyvs[$yyvsp-$c]);</Line>
+   <Line>@{$yyval = []}[cTYPE,cCHILD] = ('SET', $yyvs[$yyvsp-$b]);</Line>
+   <Line>@{$yyval = []}[cTYPE,cCHILD] = ('CHOICE', $yyvs[$yyvsp-$a]);</Line>
+   <Line>@{$yyval = []}[cTYPE] = ('ENUM');</Line>
+   <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$a];</Line>
+   <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$b];</Line>
+   <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$c];</Line>
+   <Line>@{$yyval = []}[cTYPE,cCHILD,cDEFINE] = ('ANY',undef,$yyvs[$yyvsp-$z]);</Line>
+   <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$d];</Line>
+   <Line>{ $yyval = [];</Line>
+   <Line>([,{}]|::=)</Line>
+   <Line>io => [qw(asn_recv asn_send asn_read asn_write asn_get asn_ready)],</Line>
+   <Line>debug => [qw(asn_dump asn_hexdump)],</Line>
+   <Line>ASN_PRIMITIVE ASN_CONSTRUCTOR ASN_LONG_LEN ASN_EXTENSION_ID ASN_BIT)],</Line>
+   <Line>tag => [qw(asn_tag asn_decode_tag asn_decode_tag asn_encode_tag asn_decode_length asn_encode_length)]</Line>
+   <Line>eval { _encode($self->{options}, $self->{script}, $stash, [], $buf) }</Line>
+   <Line>my $me = ref($pkg) ? $pkg : bless [];</Line>
+   <Line>my $me = ref($pkg) ? $pkg : bless [], $pkg;</Line>
+   <Line>bless [], $type;</Line>
+   <Line>$$self{'data'}{'sections'}{'events'} = [];</Line>
+   <Line>$$self{'data'}{'sections'}{'holidays'} = [];</Line>
+   <Line>$$self{'data'}{'sections'}{$sect} = [];</Line>
+   <Line>'date' => [], # the parsed date split</Line>
+   <Line>'offset' => [], # The offset from GMT</Line>
+   <Line>'gmt' => [], # the date converted to GMT</Line>
+   <Line>'loc' => [], # the date converted to local timezone</Line>
+   <Line>$$dmb{'data'}{'holidays'}{'hols'} = [];</Line>
+   <Line>return [];</Line>
+  </Level>
+  <Level>
+   <NewCharacters>PERL: {}()[]&lt;>\# + 0123456789</NewCharacters>
+   <Line>if ($path !~ m|^/[^;\(\)]+|) {</Line>
+   <Line>if ($line =~ m/^tcp:\s+\[(\S+)\]\s+\S+\s+(\S+)\s*$/) {</Line>
+   <Line>my $storage_list = [];</Line>
+   <Line>my $cmd = ['/sbin/vgchange', '-aln', $scfg->{vgname}];</Line>
+   <Line>my $slist = [];</Line>
+   <Line>my $devlist = [];</Line>
+   <Line>while ($tmpl =~ m/([^{]+)?({([^}]+)})?/g) {</Line>
+   <Line>#'et' => [], # Ethopia or Estonia ??</Line>
+   <Line>#'th' => [],</Line>
+   <Line>my $kvmkeymaparray = [];</Line>
+   <Line>return $str ? [ Text::ParseWords::shellwords($str) ] : [];</Line>
+   <Line>my $lines = [];</Line>
+   <Line>my $cmd = ['lvremove', '-f', $di->{snapdev}];</Line>
+   <Line>return [];</Line>
+   <Line>my $res = [];</Line>
+   <Line>$skiplist = [] if !$skiplist;</Line>
+   <Line>my $bklist = [];</Line>
+   <Line>my $tasklist = [];</Line>
+   <Line>$task->{disks} = [];</Line>
+   <Line>my $vollist = [];</Line>
+   <Line>=item B&lt;shell_quote> [I&lt;string>]...</Line>
+   <Line>=item B&lt;shell_quote_best_effort> [I&lt;string>]...</Line>
+   <Line>=item B&lt;shell_comment_quote> [I&lt;string>]</Line>
+   <Line>RFC2732 => qr/[^A-Za-z0-9\-_.!~*'()]/,</Line>
+   <Line>return $1 if $_[0] =~ s,^\\\\([^\\]+),,; # UNC</Line>
+   <Line>return $1 if $_[0] =~ s,^\\\\([^\\]+),,; # UNC</Line>
+   <Line>return $path =~ m,^[a-zA-Z]:, || $path =~ m,^[/\\],;</Line>
+   <Line># gopher://&lt;host>[:&lt;port>]/&lt;gopher-path></Line>
+   <Line>'us' => [qw(www.ACME.gov www.ACME.mil)],</Line>
+   <Line>'gb' => [qw(www.ACME.co.uk www.ACME.org.uk www.ACME.ac.uk)],</Line>
+   <Line>'au' => [qw(www.ACME.com.au www.ACME.org.au www.ACME.edu.au)],</Line>
+   <Line>'il' => [qw(www.ACME.co.il www.ACME.org.il www.ACME.net.il)],</Line>
+   <Line>m,^[a-zA-Z]:[/\\],) # dosish file name</Line>
+   <Line>$reserved = q(;/?:@&amp;=+$,[]);</Line>
+   <Line>$u->query_param($key, []);</Line>
+   <Line>$key =~ s/([;\/?:@&amp;=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg;</Line>
+   <Line>$val =~ s/([;\/?:@&amp;=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg;</Line>
+   <Line>for (@copy) { s/([;\/?:@&amp;=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg; }</Line>
+   <Line>$old =~ s{^\[(.*)\]$}{$1}; # remove brackets around IPv6 (RFC 3986 3.2.2)</Line>
+   <Line>bless [URI::file->new_abs(shift)], $class;</Line>
+   <Line>return eval { $thingy->can( 'as_string' ) } ? $thingy->as_string([]) : $thingy;</Line>
+   <Line>my $self = bless [], $class;</Line>
+   <Line>return [] if $string eq '[]';</Line>
+   <Line>$hash->{$key} = [];</Line>
+   <Line>$lines[-1] .= ' []';</Line>
+   <Line>$string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g;</Line>
+   <Line>$line .= ' []';</Line>
+   <Line>$line .= ' []';</Line>
+   <Line>and mappings, support for the constructs [] (empty sequence) and {}</Line>
+   <Line>--- []</Line>
+  </Level>
+ </Levels>
+</KTouchLecture>
diff --git a/keyboard/ergodox/addons/etc/layout/ktouch/workman-wdp.keyboard.xml b/keyboard/ergodox/addons/etc/layout/ktouch/workman-wdp.keyboard.xml
new file mode 100644 (file)
index 0000000..ffeb20d
--- /dev/null
@@ -0,0 +1,294 @@
+<KTouchKeyboard>
+ <Title>English Workman with Dvorak-for-Programmers</Title>
+ <Comment>English Workman WDP Keyboard Layout</Comment>
+ <Language>en (English)</Language>
+ <Keys>
+  <Key Width="80" X="180" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="65" Position="TopLeft">A</Char>
+  </Key>
+  <Key Width="80" X="280" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="83" Position="TopLeft">S</Char>
+  </Key>
+  <Key Width="80" X="380" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="72" Position="TopLeft">H</Char>
+  </Key>
+  <Key Width="80" X="480" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="84" Position="TopLeft">T</Char>
+  </Key>
+  <Key Width="80" X="780" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="78" Position="TopLeft">N</Char>
+  </Key>
+  <Key Width="80" X="880" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="69" Position="TopLeft">E</Char>
+  </Key>
+  <Key Width="80" X="980" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="79" Position="TopLeft">O</Char>
+  </Key>
+  <Key Width="80" X="1080" Y="200" Height="80" Type="FINGER">
+   <Char Unicode="73" Position="TopLeft">I</Char>
+  </Key>
+  <Key Width="130" X="0" Y="100" Height="80" Type="TAB"/>
+  <Key Width="100" X="1380" Y="100" Height="180" Type="ENTER"/>
+  <Key Width="250" X="1230" Y="300" Height="80" Type="SHIFT"/>
+  <Key Width="130" X="1200" KeyText="AltGr" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="130" X="1350" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="130" X="150" KeyText="Alt" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="130" X="0" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
+  <Key Width="880" X="300" Y="400" Height="80" Type="SPACE"/>
+  <Key Width="110" X="0" Y="300" Height="80" Type="SHIFT"/>
+  <Key Width="160" X="0" Y="200" Height="80" Type="CAPSLOCK"/>
+  <Key Width="160" X="1310" Y="0" Height="80" Type="BACKSPACE"/>
+  <Key Width="80" X="0" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="96" Position="TopLeft">`</Char>
+   <Char Unicode="126" Position="BottomLeft">~</Char>
+  </Key>
+  <Key Width="80" X="100" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="38" Position="TopLeft">&amp;</Char>
+   <Char Unicode="59" Position="BottomLeft">;</Char>
+  </Key>
+  <Key Width="80" X="200" Y="0" Height="80" FingerKeyIndex="1" Type="NORMAL">
+   <Char Unicode="55" Position="TopLeft">7</Char>
+   <Char Unicode="91" Position="BottomLeft">[</Char>
+  </Key>
+  <Key Width="80" X="300" Y="0" Height="80" FingerKeyIndex="2" Type="NORMAL">
+   <Char Unicode="53" Position="TopLeft">5</Char>
+   <Char Unicode="123" Position="BottomLeft">{</Char>
+  </Key>
+  <Key Width="80" X="400" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="51" Position="TopLeft">3</Char>
+   <Char Unicode="125" Position="BottomLeft">}</Char>
+  </Key>
+  <Key Width="80" X="500" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="49" Position="TopLeft">1</Char>
+   <Char Unicode="40" Position="BottomLeft">(</Char>
+  </Key>
+  <Key Width="80" X="600" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="57" Position="TopLeft">9</Char>
+   <Char Unicode="61" Position="BottomLeft">=</Char>
+  </Key>
+  <Key Width="80" X="700" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="48" Position="TopLeft">0</Char>
+   <Char Unicode="42" Position="BottomLeft">*</Char>
+  </Key>
+  <Key Width="80" X="800" Y="0" Height="80" FingerKeyIndex="5" Type="NORMAL">
+   <Char Unicode="50" Position="TopLeft">2</Char>
+   <Char Unicode="41" Position="BottomLeft">)</Char>
+  </Key>
+  <Key Width="80" X="900" Y="0" Height="80" FingerKeyIndex="6" Type="NORMAL">
+   <Char Unicode="52" Position="TopLeft">4</Char>
+   <Char Unicode="43" Position="BottomLeft">+</Char>
+  </Key>
+  <Key Width="80" X="1000" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="54" Position="TopLeft">6</Char>
+   <Char Unicode="93" Position="BottomLeft">]</Char>
+  </Key>
+  <Key Width="80" X="1100" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="56" Position="TopLeft">8</Char>
+   <Char Unicode="37" Position="BottomLeft">%</Char>
+  </Key>
+  <Key Width="80" X="1200" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="35" Position="TopLeft">#</Char>
+   <Char Unicode="33" Position="BottomLeft">!</Char>
+  </Key>
+  <Key Width="80" X="150" Y="100" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="81" Position="TopLeft">Q</Char>
+  </Key>
+  <Key Width="80" X="250" Y="100" Height="80" FingerKeyIndex="1" Type="NORMAL">
+   <Char Unicode="68" Position="TopLeft">D</Char>
+  </Key>
+  <Key Width="80" X="350" Y="100" Height="80" FingerKeyIndex="2" Type="NORMAL">
+   <Char Unicode="82" Position="TopLeft">R</Char>
+  </Key>
+  <Key Width="80" X="450" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="87" Position="TopLeft">W</Char>
+  </Key>
+  <Key Width="80" X="550" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="66" Position="TopLeft">B</Char>
+  </Key>
+  <Key Width="80" X="650" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="74" Position="TopLeft">J</Char>
+  </Key>
+  <Key Width="80" X="750" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="70" Position="TopLeft">F</Char>
+  </Key>
+  <Key Width="80" X="850" Y="100" Height="80" FingerKeyIndex="5" Type="NORMAL">
+   <Char Unicode="85" Position="TopLeft">U</Char>
+  </Key>
+  <Key Width="80" X="950" Y="100" Height="80" FingerKeyIndex="6" Type="NORMAL">
+   <Char Unicode="80" Position="TopLeft">P</Char>
+  </Key>
+  <Key Width="80" X="1050" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="64" Position="TopLeft">@</Char>
+   <Char Unicode="36" Position="BottomLeft">$</Char>
+  </Key>
+  <Key Width="80" X="1150" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="94" Position="TopLeft">^</Char>
+   <Char Unicode="58" Position="BottomLeft">:</Char>
+  </Key>
+  <Key Width="80" X="1250" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="34" Position="TopLeft">"</Char>
+   <Char Unicode="39" Position="BottomLeft">'</Char>
+  </Key>
+  <Key Width="80" X="580" Y="200" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="71" Position="TopLeft">G</Char>
+  </Key>
+  <Key Width="80" X="680" Y="200" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="89" Position="TopLeft">Y</Char>
+  </Key>
+  <Key Width="80" X="1180" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="95" Position="TopLeft">_</Char>
+   <Char Unicode="45" Position="BottomLeft">-</Char>
+  </Key>
+  <Key Width="80" X="1280" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="124" Position="TopLeft">|</Char>
+   <Char Unicode="92" Position="BottomLeft">\</Char>
+  </Key>
+  <Key Width="80" X="130" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="60" Position="TopLeft">&lt;</Char>
+   <Char Unicode="62" Position="BottomLeft">></Char>
+  </Key>
+  <Key Width="80" X="230" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+   <Char Unicode="90" Position="TopLeft">Z</Char>
+  </Key>
+  <Key Width="80" X="330" Y="300" Height="80" FingerKeyIndex="1" Type="NORMAL">
+   <Char Unicode="88" Position="TopLeft">X</Char>
+  </Key>
+  <Key Width="80" X="430" Y="300" Height="80" FingerKeyIndex="2" Type="NORMAL">
+   <Char Unicode="77" Position="TopLeft">M</Char>
+  </Key>
+  <Key Width="80" X="530" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="67" Position="TopLeft">C</Char>
+  </Key>
+  <Key Width="80" X="630" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+   <Char Unicode="86" Position="TopLeft">V</Char>
+  </Key>
+  <Key Width="80" X="730" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="75" Position="TopLeft">K</Char>
+  </Key>
+  <Key Width="80" X="830" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+   <Char Unicode="76" Position="TopLeft">L</Char>
+  </Key>
+  <Key Width="80" X="930" Y="300" Height="80" FingerKeyIndex="5" Type="NORMAL">
+   <Char Unicode="60" Position="TopLeft">&lt;</Char>
+   <Char Unicode="44" Position="BottomLeft">,</Char>
+  </Key>
+  <Key Width="80" X="1030" Y="300" Height="80" FingerKeyIndex="6" Type="NORMAL">
+   <Char Unicode="62" Position="TopLeft">></Char>
+   <Char Unicode="46" Position="BottomLeft">.</Char>
+  </Key>
+  <Key Width="80" X="1130" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
+   <Char Unicode="63" Position="TopLeft">?</Char>
+   <Char Unicode="47" Position="BottomLeft">/</Char>
+  </Key>
+ </Keys>
+ <Connections>
+  <KeyConnector TargetKeyIndex="0"  KeyUnicode="97"/>
+  <KeyConnector TargetKeyIndex="0"  KeyUnicode="65"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="1"  KeyUnicode="115"/>
+  <KeyConnector TargetKeyIndex="1"  KeyUnicode="83"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="2"  KeyUnicode="104"/>
+  <KeyConnector TargetKeyIndex="2"  KeyUnicode="72"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="3"  KeyUnicode="116"/>
+  <KeyConnector TargetKeyIndex="3"  KeyUnicode="84"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="4"  KeyUnicode="110" />
+  <KeyConnector TargetKeyIndex="4"  KeyUnicode="78"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="5"  KeyUnicode="101"/>
+  <KeyConnector TargetKeyIndex="5"  KeyUnicode="69"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="6"  KeyUnicode="111"/>
+  <KeyConnector TargetKeyIndex="6"  KeyUnicode="79"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="7"  KeyUnicode="105"/>
+  <KeyConnector TargetKeyIndex="7"  KeyUnicode="73"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="8"  KeyUnicode="260"/>
+  <KeyConnector TargetKeyIndex="9"  KeyUnicode="13" />
+  <KeyConnector TargetKeyIndex="10" KeyUnicode="257"/>
+  <KeyConnector TargetKeyIndex="11" KeyUnicode="264"/>
+  <KeyConnector TargetKeyIndex="12" KeyUnicode="265"/>
+  <KeyConnector TargetKeyIndex="13" KeyUnicode="263"/>
+  <KeyConnector TargetKeyIndex="14" KeyUnicode="262"/>
+  <KeyConnector TargetKeyIndex="15" KeyUnicode="32" />
+  <KeyConnector TargetKeyIndex="16" KeyUnicode="258"/>
+  <KeyConnector TargetKeyIndex="17" KeyUnicode="259"/>
+  <KeyConnector TargetKeyIndex="18" KeyUnicode="8"  />
+  <KeyConnector TargetKeyIndex="19" KeyUnicode="126"/>
+  <KeyConnector TargetKeyIndex="19" KeyUnicode="96"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="20" KeyUnicode="59" />
+  <KeyConnector TargetKeyIndex="20" KeyUnicode="38"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="21" KeyUnicode="91" />
+  <KeyConnector TargetKeyIndex="21" KeyUnicode="55"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="22" KeyUnicode="123"/>
+  <KeyConnector TargetKeyIndex="22" KeyUnicode="53"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="23" KeyUnicode="125"/>
+  <KeyConnector TargetKeyIndex="23" KeyUnicode="51"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="24" KeyUnicode="40" />
+  <KeyConnector TargetKeyIndex="24" KeyUnicode="49"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="25" KeyUnicode="61" />
+  <KeyConnector TargetKeyIndex="25" KeyUnicode="57"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="26" KeyUnicode="42" />
+  <KeyConnector TargetKeyIndex="26" KeyUnicode="48"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="27" KeyUnicode="41" />
+  <KeyConnector TargetKeyIndex="27" KeyUnicode="50"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="28" KeyUnicode="43" />
+  <KeyConnector TargetKeyIndex="28" KeyUnicode="52"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="29" KeyUnicode="93" />
+  <KeyConnector TargetKeyIndex="29" KeyUnicode="54"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="30" KeyUnicode="37" />
+  <KeyConnector TargetKeyIndex="30" KeyUnicode="56"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="31" KeyUnicode="35"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="31" KeyUnicode="33" />
+  <KeyConnector TargetKeyIndex="32" KeyUnicode="113"/>
+  <KeyConnector TargetKeyIndex="32" KeyUnicode="81"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="33" KeyUnicode="100"/>
+  <KeyConnector TargetKeyIndex="33" KeyUnicode="68"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="34" KeyUnicode="114"/>
+  <KeyConnector TargetKeyIndex="34" KeyUnicode="82"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="35" KeyUnicode="119"/>
+  <KeyConnector TargetKeyIndex="35" KeyUnicode="87"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="36" KeyUnicode="98"/>
+  <KeyConnector TargetKeyIndex="36" KeyUnicode="66"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="37" KeyUnicode="106" />
+  <KeyConnector TargetKeyIndex="37" KeyUnicode="74"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="38" KeyUnicode="102"/>
+  <KeyConnector TargetKeyIndex="38" KeyUnicode="70"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="39" KeyUnicode="117"/>
+  <KeyConnector TargetKeyIndex="39" KeyUnicode="85"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="40" KeyUnicode="112"/>
+  <KeyConnector TargetKeyIndex="40" KeyUnicode="80"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="41" KeyUnicode="36" />
+  <KeyConnector TargetKeyIndex="41" KeyUnicode="64"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="42" KeyUnicode="58" />
+  <KeyConnector TargetKeyIndex="42" KeyUnicode="94"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="43" KeyUnicode="39" />
+  <KeyConnector TargetKeyIndex="43" KeyUnicode="34"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="44" KeyUnicode="103"/>
+  <KeyConnector TargetKeyIndex="44" KeyUnicode="71"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="45" KeyUnicode="121"/>
+  <KeyConnector TargetKeyIndex="45" KeyUnicode="89"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="46" KeyUnicode="45" />
+  <KeyConnector TargetKeyIndex="46" KeyUnicode="95"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="47" KeyUnicode="124" ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="47" KeyUnicode="92" />
+  <KeyConnector TargetKeyIndex="48" KeyUnicode="60"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="48" KeyUnicode="62" />
+  <KeyConnector TargetKeyIndex="49" KeyUnicode="122"/>
+  <KeyConnector TargetKeyIndex="49" KeyUnicode="90"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="50" KeyUnicode="120"/>
+  <KeyConnector TargetKeyIndex="50" KeyUnicode="88"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="51" KeyUnicode="109" />
+  <KeyConnector TargetKeyIndex="51" KeyUnicode="77"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="52" KeyUnicode="99"/>
+  <KeyConnector TargetKeyIndex="52" KeyUnicode="67"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="53" KeyUnicode="118"/>
+  <KeyConnector TargetKeyIndex="53" KeyUnicode="86"  ModifierIndex="16"/>
+  <KeyConnector TargetKeyIndex="54" KeyUnicode="107"/>
+  <KeyConnector TargetKeyIndex="54" KeyUnicode="75"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="55" KeyUnicode="108"/>
+  <KeyConnector TargetKeyIndex="55" KeyUnicode="76"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="56" KeyUnicode="44" />
+  <KeyConnector TargetKeyIndex="56" KeyUnicode="60"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="57" KeyUnicode="46" />
+  <KeyConnector TargetKeyIndex="57" KeyUnicode="62"  ModifierIndex="10"/>
+  <KeyConnector TargetKeyIndex="58" KeyUnicode="47" />
+  <KeyConnector TargetKeyIndex="58" KeyUnicode="63"  ModifierIndex="10"/>
+ </Connections>
+</KTouchKeyboard>
+
diff --git a/keyboard/ergodox/addons/etc/layout/ktouch/workman-wdp.ktouch.xml b/keyboard/ergodox/addons/etc/layout/ktouch/workman-wdp.ktouch.xml
new file mode 100644 (file)
index 0000000..aa5c66e
--- /dev/null
@@ -0,0 +1,1151 @@
+<KTouchLecture>
+ <Title>Workman + symbols from Dvorak for programme</Title>
+ <FontSuggestions>Courier 10 Pitch</FontSuggestions>
+ <Levels>
+  <Level>
+   <NewCharacters>tn</NewCharacters>
+   <Line>n tn n n n ntn tn n tn t tn t tn t n n t t</Line>
+   <Line>ntn t ntn ntn ntn n ntn tn ntn ntn n ntn t</Line>
+   <Line>n t tn t t tn n tn n t n tn n tn tn n n ntn</Line>
+   <Line>n t ntn ntn t n tn ntn ntn tn ntn ntn n n</Line>
+   <Line>n tn t tn n t t t ntn tn n n t tn t t tn t</Line>
+   <Line>ntn tn n n tn ntn n tn t n t t n tn n tn n</Line>
+   <Line>t n tn ntn n n ntn n t tn t tn n tn tn ntn</Line>
+   <Line>ntn tn t tn ntn n ntn ntn tn n n n t tn t</Line>
+   <Line>tn tn ntn t ntn ntn t ntn n ntn t ntn n ntn</Line>
+   <Line>t ntn ntn n t t n t n ntn ntn t ntn ntn ntn</Line>
+   <Line>tn n t n ntn ntn n ntn n ntn n ntn n ntn ntn</Line>
+   <Line>n t ntn ntn tn n n tn t t tn t ntn t n tn</Line>
+   <Line>n t n t t ntn t n n n n n t n n t tn ntn n</Line>
+   <Line>n ntn t ntn t ntn t tn tn ntn ntn t ntn t</Line>
+   <Line>t n tn t t ntn tn t n tn tn n tn ntn tn t</Line>
+   <Line>n ntn t tn tn tn t ntn t ntn tn t t t tn ntn</Line>
+   <Line>t t t tn t ntn n t t tn t ntn tn n t ntn ntn</Line>
+   <Line>tn t t t tn n tn tn ntn n ntn n tn ntn tn</Line>
+   <Line>n n n t ntn t tn n n n n ntn n t tn n n n</Line>
+   <Line>tn t ntn tn n tn tn n tn tn ntn t t ntn t</Line>
+   <Line>tn n t ntn ntn tn ntn ntn tn tn n n t n n</Line>
+   <Line>tn tn tn t t tn ntn ntn ntn t tn tn tn ntn</Line>
+   <Line>tn n t tn t n tn ntn n t t ntn t tn n tn ntn</Line>
+   <Line>tn t t n tn n ntn tn ntn n n tn ntn n t ntn</Line>
+   <Line>tn n t ntn tn n ntn ntn tn tn t n ntn ntn</Line>
+   <Line>ntn tn n t tn ntn t t t t tn tn n tn ntn t</Line>
+   <Line>t t t ntn n ntn ntn n ntn tn ntn n tn tn n</Line>
+   <Line>tn n t ntn tn n t n tn ntn ntn t ntn t n t</Line>
+   <Line>ntn tn tn tn ntn tn t ntn t ntn tn tn tn t</Line>
+   <Line>tn t t n t n t tn t ntn t n t t t tn tn t</Line>
+  </Level>
+  <Level>
+   <NewCharacters>he</NewCharacters>
+   <Line>h e h e h h e e h e he eh hh ee hh eh eh he heh he heh hehe</Line>
+   <Line>ten h nth eh h ten h net he hen tee nth h he nth ten tee the</Line>
+   <Line>h he the ten tee eh ten nth the ten nth he net the</Line>
+   <Line>eh tee tee net he h he he nth hen tee ten hen eh</Line>
+   <Line>he eh he the h ten e he e tee h h e hen tee h h nth</Line>
+   <Line>he nth eh ten h tee he net tee he hen tee net net he nth</Line>
+   <Line>h tee nth nth hen nth e net the h net h the eh ten he</Line>
+   <Line>net he h ten the eh h net net he hen hen e he nth e</Line>
+   <Line>tee he nth nth ten h e h the tee net net e tee h net net</Line>
+   <Line>hen ten he eh the hen tee eh h ten tee hen nth he ten</Line>
+   <Line>nth hen e net e nth net h eh nth eh he nth net net</Line>
+   <Line>h he the the nth net the hen he h eh eh h net he</Line>
+   <Line>h tee he ten e nth net h e h hen the hen hen h h he net</Line>
+   <Line>nth the eh he net nth net hen hen ten e h e net nth</Line>
+   <Line>hen e net tee net eh nth hen tee ten hen e hen h</Line>
+   <Line>tee e hen he he net net hen the nth the tee tee nth net</Line>
+   <Line>he ten ten hen ten h nth nth e ten nth hen eh tee nth</Line>
+   <Line>the net net eh net h the ten h h h ten net he nth</Line>
+   <Line>the net h h tee tee h tee he hen tee ten ten eh eh</Line>
+   <Line>hen tee e tee the hen h ten the hen hen net net hen</Line>
+   <Line>h h h hen e hen he h e the the h tee tee he h e net</Line>
+   <Line>ten h nth nth e the eh eh net nth eh hen the eh hen</Line>
+   <Line>ten ten tee he he ten the he ten nth nth ten the nth eh</Line>
+   <Line>the ten e eh h h h hen nth he hen hen e hen ten the</Line>
+   <Line>eh tee e net hen h e hen nth eh hen ten the the net</Line>
+   <Line>ten h he nth hen the h tee he e h ten e the ten e</Line>
+   <Line>he then entente tenth thee teethe net teeth the</Line>
+   <Line>nth tent teeth net thee net tent ten tenet entente tenet</Line>
+   <Line>eh entente eh nth teen ten tee eh h the teen nth tenth</Line>
+   <Line>he ten teeth tenet he he teen tenth then he h hen thee then</Line>
+   <Line>h teethe e tenet thee h tent entente eh tee he then</Line>
+   <Line>nth then net teen then tent then entente hen eh tee</Line>
+   <Line>teethe ten nth teen then net net the entente eh</Line>
+   <Line>then hen tenet e hen hen net he teen net tenet teethe</Line>
+   <Line>tee tenth then thee h he hen tenet net nth tenet tee</Line>
+   <Line>teen h tee then teethe thee teethe tent e entente tent</Line>
+   <Line>tent tee tenet tent entente tenth teethe eh eh eh</Line>
+   <Line>thee thee teen he thee ten tent eh entente thee hen</Line>
+   <Line>then h net entente e teen tenet the teethe he thee</Line>
+   <Line>tee h tee tent teeth h tent net thee he ten h nth teeth</Line>
+   <Line>thee ten tee nth entente tenth tent entente he then</Line>
+   <Line>tenet nth entente h eh teen the tenth thee e he teen</Line>
+   <Line>eh tent nth teen thee thee teen then entente teeth tenth</Line>
+   <Line>e eh teen eh ten teethe entente eh teen nth he ten ten</Line>
+   <Line>then then teeth tenth thee teethe entente nth tee</Line>
+   <Line>net ten teen tee thee thee net hen the eh teeth hen</Line>
+   <Line>tenth net the entente entente entente teethe h</Line>
+   <Line>then h tenth teeth tee tenth tenet h tee entente net</Line>
+   <Line>tent thee teeth tenet the teen nth e tee entente then</Line>
+   <Line>tee entente he tent nth h ten he teeth tee he tee</Line>
+   <Line>he hen tenet tee teethe tent he e teethe entente ten</Line>
+  </Level>
+  <Level>
+   <NewCharacters>so</NewCharacters>
+   <Line>o s o s s o o o s so set nest net son not nos ton</Line>
+   <Line>set nest net o s o s s o o o s nos ton so son not</Line>
+   <Line>note oh sots tho shoo too soon note tone she sent tost</Line>
+   <Line>ohs shoe not soon hoes ohos nest seen sees see nosh</Line>
+   <Line>hot sees too eons ones host she tots note toss shoo seen</Line>
+   <Line>tone note so shes es non neon toes non sent snot on</Line>
+   <Line>she es shoe shes sh tons non tons test es noes shoe tots</Line>
+   <Line>hot onto shoe nets tons eon none neon neon test eon hens</Line>
+   <Line>shes toot hot toes es hes sots nets hone sees shes</Line>
+   <Line>tost hot non she hoes tees so hos sons hose eon shot</Line>
+   <Line>shoo no hone seen es soon tons nose neon neon toot eon</Line>
+   <Line>hos hot eon see onto tons ts sons nosh toe hoes one</Line>
+   <Line>s none toot none oh tho tot set ohos host hone shes sees</Line>
+   <Line>soon toot one seen test soot oho s tost toes shoo</Line>
+   <Line>not shot sees ho toes tots test soot son hoes hes</Line>
+   <Line>toes shes sots ohos oh tote sets toot on not hot non</Line>
+   <Line>nest sons tens shes noon noes too hoot soot tot toot</Line>
+   <Line>test to neon hens ohs s tost ohos son tot ohos hes</Line>
+   <Line>hose ho note hose hoot o hens tots snot hes shoe toss</Line>
+   <Line>hose shot tees tho she shot toot ohos see sots shoo</Line>
+   <Line>tons ohs eon she tost ts ohos non hone hot no nosh shot</Line>
+   <Line>on ohs toot hone tees toes oh seen hone oho noes tens</Line>
+   <Line>hose nest soot set sons tho not nosh none shoe tho</Line>
+   <Line>nosh not hose oh hoot sets so nose hoe eons sots nets</Line>
+   <Line>ts es no toe test neon sot ohos not oh set hot nosh</Line>
+   <Line>sh o to ts she eons noes hose on noes hot noes o</Line>
+   <Line>sot sees tots hos tot hes tho shes note ho tote shoo</Line>
+   <Line>hos onset hostess sot thees those sheet not sees</Line>
+   <Line>host ho those not hosses tenon hostess tense tests</Line>
+   <Line>neon snot sot stone sooth shoot tests tost teens hones</Line>
+   <Line>sot honest tensest hottest soothes tenets tenths eon</Line>
+   <Line>o tost shots hens toes soothes onto onsets none</Line>
+   <Line>settee soothes nests teens soon to tons nosh hoe tost</Line>
+   <Line>hottest sots tote sot tenons sh shone sots tooth one</Line>
+   <Line>honest tenses sonnets nest non tenths soot tonnes hens</Line>
+   <Line>tenons hoots noshes tone no tones on ohos honest nooses</Line>
+   <Line>tonne tensest tho ohos onset nose no tons she soon</Line>
+   <Line>no onto tests sheets shoots tots hos hone sets hosses</Line>
+   <Line>ethos tho hes shoot so she tensest shoes tees theses</Line>
+   <Line>hoots sees noose non neon she toes tho thees ho</Line>
+   <Line>hostess soothes noose seen test tone sense noses eon</Line>
+   <Line>sees shes toots sooth shots hoes note nets noses</Line>
+   <Line>hose sons sets o seethes sense oneness hoes hose hoots</Line>
+   <Line>tho shone notes these nests hosses ethos sees neon</Line>
+   <Line>sons noon sots theses soon no son seethes nosh not</Line>
+   <Line>nests tenons tots snot tests sh sooth hoot nests hose</Line>
+   <Line>ton nooses these teethes sons tot senses sheen snoot</Line>
+   <Line>too tots es shes sooths noose hoses hoot notes oh</Line>
+   <Line>too tones sheets shot sonnets shoe honest ones neon</Line>
+   <Line>s too toss nets noshes no settees sheets oho soon shes</Line>
+   <Line>seethes to sons hoses hens tones snoot tense shot seethe</Line>
+   <Line>soot settees tees tote nests tenets tensest tote</Line>
+  </Level>
+  <Level>
+   <NewCharacters>ai</NewCharacters>
+   <Line>aeon stoat ease hints ease atone anti tat nits shies</Line>
+   <Line>aha satin tithe saith teats shine atone taint hah</Line>
+   <Line>tithe stain shine teas ants in into tines hits nits</Line>
+   <Line>sass eat taint teats inns hint iota shat sans than</Line>
+   <Line>oath hints oats hats ahas ah sit hint ashes heats stoat</Line>
+   <Line>ants snit iota saith aeon tats sate ash tie sash</Line>
+   <Line>hahs satin a heath as tea neat asset shine hits shins</Line>
+   <Line>ion tit anon sine taint seas stoat sates his hahs</Line>
+   <Line>it oats sanes at eat snit onion inti onion ease shin</Line>
+   <Line>tins hit seats that tans ashen hint hints nit nit</Line>
+   <Line>hints hit saith ashes his shat eats an sanes tines</Line>
+   <Line>ion ions tat ion ate hahs oasis anon sea sine stain</Line>
+   <Line>sis hate tan snits hash anti at tins that teat site hies</Line>
+   <Line>anon tint ani hath tithe sat stint snits snits tits</Line>
+   <Line>hiss nit tits sanes it shah tea seat hash sin is</Line>
+   <Line>sits tease senna ion an shat stain sine hi sine ion</Line>
+   <Line>ease asset ease hint tie inn anon sties tint titan nits</Line>
+   <Line>nines taint inane ante tithe sans in sit sine hiss</Line>
+   <Line>tits iota heat hits sate heath tan tits as senna saith</Line>
+   <Line>onion ani as sat snit inti nines sises is its shine</Line>
+   <Line>a ahas neath tie i iota seats ashen sites tea stoat teats</Line>
+   <Line>shins saith ass neat sea ates oasis heats state an</Line>
+   <Line>tithe sit sins tins tines ashen tin shine tints nine</Line>
+   <Line>an stoat shit ions tint stein heats ions hath inti</Line>
+   <Line>snits tines satin sanes ashen shah shah hath tats tea</Line>
+   <Line>titans shat ates sanest tat ahas noise noises anons tastes</Line>
+   <Line>senate intense senates stein saint nits hath sheathe</Line>
+   <Line>intents sasses oat testis sin hit notions inane</Line>
+   <Line>easies neatest east stein assist ant stoats senates</Line>
+   <Line>oats shine atones attests stein thine taste ah eaten</Line>
+   <Line>oat hats atheist iota siestas tannin sat thin onion ashen</Line>
+   <Line>hints tan sasses hasten ion attains tithe sate hisses</Line>
+   <Line>toniest sheaths inanest iotas seasons tattoos this</Line>
+   <Line>asinine tins anise ash estate tats snits sonnies tiniest</Line>
+   <Line>hiss taint ti ass intense theist tinnies sins eta</Line>
+   <Line>tannest tenant saith ants satin stain hah stint instant</Line>
+   <Line>stoats it has anoint antes neonate oats neonate sheath</Line>
+   <Line>attest stint thesis hies into ninths it assents an</Line>
+   <Line>hashish tie oaten sises teas hiss sanest noise insist</Line>
+   <Line>ease tattoos stashes attain atone assists sashes sash</Line>
+   <Line>ants hits toniest hit sane hoists ninths attain shies</Line>
+   <Line>tints assets than hosanna titans ant sonnies at</Line>
+   <Line>nation assists toast sonata tannin shits theists hoists</Line>
+   <Line>insets anion state seasons ti antes heathen than sass</Line>
+   <Line>hahs haste hoist neat saiths anons teats assets asses</Line>
+   <Line>tea saint titans ants neath hastes oats neath tins</Line>
+   <Line>sass hie tin tits sin easies hashes asset its hints tint</Line>
+   <Line>teases noise hi hoists season than nannies shit</Line>
+   <Line>intones stashes a tithe sea at tannest hath satiate hiss</Line>
+   <Line>insane than anti hiss insets stein hie anon anions</Line>
+  </Level>
+  <Level>
+   <NewCharacters>wf</NewCharacters>
+   <Line>town whew awes whits woes whets ewes owe sown wow</Line>
+   <Line>ifs fan shift wite wanes watt fasts fests new sewn</Line>
+   <Line>wases awe watt hoof wot newt own show of fin fats</Line>
+   <Line>wean wean foe fin wash fief fit foes fife fins if</Line>
+   <Line>weft wises woe foot f off swoon waif f shows fist</Line>
+   <Line>hew wow want woe now sofa afoot swine ow owe fen</Line>
+   <Line>wino stow wash west how own wean feat thaw when</Line>
+   <Line>fests fa weft wash new sofa oafs snow fine tow fates</Line>
+   <Line>wait wot sown owes snow shift safe wish owes fens new</Line>
+   <Line>twine fee shift of oft weest woos went ewes wish we</Line>
+   <Line>sheaf woo stew owns wash wafts wet fists fa news</Line>
+   <Line>wise was shows sweat wees sweat wino wee wen wife of</Line>
+   <Line>wite twit swish ifs fees woe wets fens shift now soft</Line>
+   <Line>fin fief wises wot feat wash swoon we fain fiat foot show</Line>
+   <Line>sheaf tiff wow owns wife twee ewes foe we thaw owns</Line>
+   <Line>sows fates oft how sift owes hefts whets owns fan</Line>
+   <Line>afoot foist fins fees wefts wanes twee hoof fate watt</Line>
+   <Line>whoa wises fate swoon shown wife weft fish watt two</Line>
+   <Line>wets w whits two saw soft fin off fee swat wise want wows</Line>
+   <Line>fee woo sows how sew wait town fins news went wist</Line>
+   <Line>woos whit hewn wets own fate wests wean whew fats tow</Line>
+   <Line>fits feat now snow whet west wane when fiat fests font</Line>
+   <Line>watt twist whit swish sawn fins was snow fest waft ewes</Line>
+   <Line>awe watt haft fees wanes show fin swoon wean wine</Line>
+   <Line>saws if with wean font now hews when fist how with now</Line>
+   <Line>shows twines wens sweets whews whew waists newses toffee</Line>
+   <Line>twits fission stiffen sinew whit wants taffies nitwits</Line>
+   <Line>who infant whew withes softie sweeten infest wean</Line>
+   <Line>shafts foe swishes fasten sifts stow fastest sniff</Line>
+   <Line>fitness hafts fain wafts we fasts swans fine staff</Line>
+   <Line>show oafs finises wattest seesaws foot sofa often waifs</Line>
+   <Line>white wife off staffs new withe festoon taffies fainest</Line>
+   <Line>fission woe wet fastest foots oafish fiestas who</Line>
+   <Line>wattest wost twin stiffs fashion tiffs woofs fiestas</Line>
+   <Line>went saw wises waits wits wins infests haw infest white</Line>
+   <Line>fifes fawn fees hews snows fattest news finises faints</Line>
+   <Line>font fawns fewest woof afoot own swift fawns sweets</Line>
+   <Line>oafs woo sewn twain f faiths whits winnow wattest wanna</Line>
+   <Line>foots now wash news feats feats infests wins newness stows</Line>
+   <Line>swish fashion sweats whits fifties fannies swoons finis</Line>
+   <Line>wefts anew sweats twists fit owe hew awash nitwit sofa</Line>
+   <Line>infests waists twin saws wefts fist wit wines fission</Line>
+   <Line>softest fists hoof newts safe tweets nitwits feint finesse</Line>
+   <Line>softens feasts hewn withe wont heehaws sofas thaws</Line>
+   <Line>info twee whose fatties fannies fifes washes winos</Line>
+   <Line>aft staffs stew newton sews own whiff whew within wan</Line>
+   <Line>wise whoa tiffs whiffs fan festoon whoosh wet</Line>
+   <Line>taffies hoof weest whews fist stow who fee stiffen washes</Line>
+   <Line>newt faint swath fan watts saws waist whens swats faiths</Line>
+   <Line>fa wettest weft fain theft haws with offset offense</Line>
+  </Level>
+  <Level>
+   <NewCharacters>bj</NewCharacters>
+   <Line>jabot jet ibis stab bib bit baton beefs boas ebbs</Line>
+   <Line>bow stab bin beta abbot hobo booth bast basin be</Line>
+   <Line>obese bets jots beat beans ebb bate betas boss job</Line>
+   <Line>jot bent bits ebbs oboe sob hobo bane beta bites boat</Line>
+   <Line>ebb jots jobs nibs jibes jaws webs boon fibs ban</Line>
+   <Line>webs boat jabs bani bani bans boons beta snob bests</Line>
+   <Line>best bee boss boob bites boob boa fib beans jets boob</Line>
+   <Line>booth bits best jib boa nib bites bate beefs boos both</Line>
+   <Line>both bees bin oboe beans b bit j base nab bosh ban tibia</Line>
+   <Line>jaws oboes josh boons boa snobs abaft jabot bane</Line>
+   <Line>bits abaft jest bit base john be fob babe job webs</Line>
+   <Line>bone basin be snobs baas abaft sob bins boats jot</Line>
+   <Line>jib jabs basin jabot beta bees abet banes boobs boat</Line>
+   <Line>betas bee bent beef bees bobs jinn babe sobs boss banes</Line>
+   <Line>bite bet jaws banjo banns bash jinni beefs hob</Line>
+   <Line>boon jib josh boots bate bah bean bent job abbot jinni</Line>
+   <Line>basts ebbs sob sob bast hobs bests best bins booth joist</Line>
+   <Line>bias j bass jibs tibia betas bait baton bathe j</Line>
+   <Line>banes betas boon beats bat bans bee bane jab bite ban</Line>
+   <Line>jots snob bean bath beans ban babe ebbs sahib hobo</Line>
+   <Line>boas bosh fob sobs john banns beat bate bate nabs ibis</Line>
+   <Line>boats bane jibe jab bias bats oboes sob bass webs bees</Line>
+   <Line>fobs baton boss baton boons jibes bet b beans banns</Line>
+   <Line>fobs john basts boo fobs beef nab sob booth ebbs bone</Line>
+   <Line>bias bat beef abbot beet sob both bibs tab befit</Line>
+   <Line>abet ban nabs benefit bobs bobbins bass bests bate</Line>
+   <Line>bitten boat beats befits bane j abbot boons boasts bin</Line>
+   <Line>ibises basin banshee baboons beat abases swabs behest</Line>
+   <Line>jots babiest nib babe bonito between tab basin jibs</Line>
+   <Line>besets be bonnets joist nabob benefit beefs beet offbeat</Line>
+   <Line>banns bassist jibe web best abet babes beneath jobs</Line>
+   <Line>jests nabs enjoins bobbies fibs jibes babes bets</Line>
+   <Line>hob bones bisons bones beans habits beasts be</Line>
+   <Line>best snobs taboo taboo jaws besot bootee nabs bash</Line>
+   <Line>bobbin hobbit obsess basins offbeat jaws bani bone</Line>
+   <Line>hob besot bathe newbies bones bassos bonbon babies</Line>
+   <Line>absinth bee taboo nabs banana offbeat tabs jobs ibis</Line>
+   <Line>bane bahs fob tabbies hob obese bassi besots bosses</Line>
+   <Line>bibs jeans jib bobbin bins bets nabob bans bate battens</Line>
+   <Line>baobab hobnobs beset behest bit stabs batten bassoon</Line>
+   <Line>obtain behest ebb baa boots abash bites newbie bonnie</Line>
+   <Line>taboo basin joists abaft beneath swab abet hoboes bisons</Line>
+   <Line>baste bobbin basin ban banshee ban abbess abbess boot</Line>
+   <Line>boots tab baa bonbons newbies jaw taboos bahs joists</Line>
+   <Line>banjoes basses ninja bow bobbins base jibe taboo been</Line>
+   <Line>jinni tibia jobs bathes jabot bosh be john bestow beaten</Line>
+   <Line>fobs besots befits basin ibis bent bobbins bias</Line>
+   <Line>bananas baobab bet bins banshee newbies abates taboo</Line>
+   <Line>nibs hoboes wannabe oboist wannabe boast boasts taboos</Line>
+   <Line>bones nabs bits bashes hobbies stab bestow ebonies</Line>
+  </Level>
+  <Level>
+   <NewCharacters>ru</NewCharacters>
+   <Line>tours tar rues burnt wrote unfair trots saber toner</Line>
+   <Line>sirs rouse brains russet writs riff bares burr throbs</Line>
+   <Line>wrote trusts rajah fore herbs afresh abuses wiser</Line>
+   <Line>torso tuber rabbi uh aortas thrown ether stun suite</Line>
+   <Line>bunion oar fret rite reset earns stern futon sonars tinier</Line>
+   <Line>butane ratios tortes horse terns urns untie fart</Line>
+   <Line>water user forte tofu stirs joust harts inert soars</Line>
+   <Line>tutu unease beer fare tore wuss runt rosin untie shout</Line>
+   <Line>earn worsts renew herons ewers stater auto start brunet</Line>
+   <Line>rabbi ruts frat rosier furs trash faster reborn artier</Line>
+   <Line>fuss rerun buts roof areas inter eater nut hooter haters</Line>
+   <Line>fresh brr iron terns barbs refit brunet busies buns</Line>
+   <Line>robes ferret ran shout errors towers snafus huhs urn</Line>
+   <Line>sure bureau resins breast sir sauna bars inert sorta</Line>
+   <Line>broth ruff barter sauna firth entire rise rebate</Line>
+   <Line>barfs wares earn whirs joust inaner north shirt or</Line>
+   <Line>heirs fores shore heart errata stuff surfs tor bust</Line>
+   <Line>huts ware fair rout harsh jaunt terse tuna tribes</Line>
+   <Line>troth uh shire beau artier bear tubs aria wire stern</Line>
+   <Line>r sorer sun worn ours roes wares wreath fore throbs sue</Line>
+   <Line>rarer tubae bribe jeer arias riots irate short tiara</Line>
+   <Line>sierra brat fusses wrath fusses bores earn rift fort</Line>
+   <Line>erase heirs tribes inaner born jut afire russet sues</Line>
+   <Line>shrew wore trues waster surer wear sues biers areas</Line>
+   <Line>tufts user tors reefs rub abuts route stuns hart</Line>
+   <Line>arena fours harass tubbier bistro fear soars retain nouns</Line>
+   <Line>sunset rust tureen sower sassier ears rabbi shutout</Line>
+   <Line>arenas tartest trustee hearten tartars erase effort</Line>
+   <Line>r writ rots tuners straw bra nastier furor snowier sinus</Line>
+   <Line>fainter sure renown banters era bonfire testers aunt</Line>
+   <Line>insert wrier hubs rainier sustain return fibber aorta</Line>
+   <Line>boorish rotor shares briefer arenas subsets ran</Line>
+   <Line>rose ran baronet errants runs tatters firth writers riffs</Line>
+   <Line>sneer wiriest unjust oars taunts intuit rower nub unbent</Line>
+   <Line>forties shires snorers steers terrier unhorse sinuous</Line>
+   <Line>renew wrote hires arts forts outworn rubber rots</Line>
+   <Line>throes oration rhubarb bosuns sort bestir urinate borne</Line>
+   <Line>refiner nu bitters antiwar buffet sewers butts tenure</Line>
+   <Line>whiners tuner hotter suit barter aeries juniors butt</Line>
+   <Line>snafus trust rebates jurors raja turban huff wries rattan</Line>
+   <Line>out fuss rebuses firths teasers harrow thous twister beau</Line>
+   <Line>fishier foresaw hitter bus hoarser inborn tawnier nature</Line>
+   <Line>shirt nut tier bonier sera shirr utters barrens swatter</Line>
+   <Line>unhorse horse wafers titter sojourn jesters woofer rosins</Line>
+   <Line>fewer wusses herein unbar threw rajas assort serous</Line>
+   <Line>ewer juts surfers refiner rebut taro tore tartans roots</Line>
+   <Line>written sorters throws tush affairs astute senator</Line>
+   <Line>beer renew unfair thrown refuse intros about weather</Line>
+   <Line>unsafer burners isobar throat briars assorts suffers</Line>
+   <Line>sourer abouts brutes fetters tether tubbier twitter</Line>
+  </Level>
+  <Level>
+   <NewCharacters>dp</NewCharacters>
+   <Line>traps podia papaw troop tired needed dates deport snipes</Line>
+   <Line>profit put ides torrid asp dwarfs rodeos aided pup</Line>
+   <Line>dread urned nodded winds posse dweeb turnip douse prop</Line>
+   <Line>trades rends raids rubbed spared sender triad drab</Line>
+   <Line>dried bird poops defend reaped pith poseur unhand deeds</Line>
+   <Line>debit denies dope pssts dins pined papers d issued puss</Line>
+   <Line>drape winds pear swop pseudo sport deepen rapier aired</Line>
+   <Line>pester sand purist forded breed aspen sap preen frond</Line>
+   <Line>fjord eddies pot nodes burden tithed rated props spurt</Line>
+   <Line>reaper sirred tap poured swops ups need prods hoed</Line>
+   <Line>deader spares read showed dose seeps dander purr pub</Line>
+   <Line>inputs absurd breads pops shrewd dust fjord spats pond</Line>
+   <Line>ashed peas due and arid nopes repast warred needed phones</Line>
+   <Line>tripod doers poor ado preses put tundra indoor debit thuds</Line>
+   <Line>drew bud japan rubied send pause herded sedan props</Line>
+   <Line>pars dares reader dust snides puree donuts beefed</Line>
+   <Line>sods hided porn wed rodent offed fished waned fopped</Line>
+   <Line>fend doe pawn odious saned sedans wraps depot abode parse</Line>
+   <Line>spite spurs bide ired appear poop pepper dweeb redraw</Line>
+   <Line>potato roared frond spout jape pear rend hides hippie</Line>
+   <Line>dust hasps pasts prow dope shed depth sadist hods</Line>
+   <Line>bashed robed roared opined fend ford paints posh aped</Line>
+   <Line>dander hard sewed peanut waited pends dope adored</Line>
+   <Line>wood babied tuned pound nodes pares tundra jade</Line>
+   <Line>spawn rotted aboard reed hewed render pawed dwarfs</Line>
+   <Line>renders bredes taproot pipers pissed serape stript defeats</Line>
+   <Line>passer undo spat strafed ripped disses pound pest outed</Line>
+   <Line>sered android drooped potpie beds reds sepsis dunner</Line>
+   <Line>paused tips prune pents tied fished steads dado</Line>
+   <Line>pour trope bred ids fad photons parses torpedo towards</Line>
+   <Line>dandier spooned seabird fronds spouse need stood</Line>
+   <Line>dustier debuted treated snippet offside dots rides</Line>
+   <Line>orotund propane shards pinned droops peeper upon</Line>
+   <Line>rubdown needs duster tipsier duet titted wordier anted</Line>
+   <Line>atoned trued fawned send tape peso pursuit depends bawdier</Line>
+   <Line>tarpon bounded rowdies abodes phonied pured prows</Line>
+   <Line>wades foppish harried updates denotes waders spare</Line>
+   <Line>eider paired puttied refused sadder adobe paired prints</Line>
+   <Line>sutured portend adopt operand paints toad worsted</Line>
+   <Line>spiders shunned option needs dash sheep adepter aided</Line>
+   <Line>around awards rowdier derbies aspirin robbed jutted</Line>
+   <Line>pinnate speared bonds fasted soused rained swipes done</Line>
+   <Line>path phonier ropes tasted sanded fade radiate sapient</Line>
+   <Line>warded reed hoboed pupped toads steeps peanuts honored</Line>
+   <Line>pshaws daubers poster tornado donuts upturn opened spits</Line>
+   <Line>pander showed upend doored period adhere turd hods derides</Line>
+   <Line>fund hoboed darns ponder peso rapper prods forded</Line>
+   <Line>shadow adapter petted wearied ride wrested rips swords</Line>
+   <Line>superb rowed dropped pips adroit duress panther piteous</Line>
+   <Line>pents sadness pub torrid punt taunted poses opened stashed</Line>
+  </Level>
+  <Level>
+   <NewCharacters>q$</NewCharacters>
+   <Line>quip$ quaffs piqued queer$ equate torque squire quit</Line>
+   <Line>quiet quires q squash queue$ quip queued quote squish quotas</Line>
+   <Line>quoth$ quasar queer quires squids quarts sequin quite</Line>
+   <Line>quoted quad quanta$ aquae quote quota $quaff quid</Line>
+   <Line>qua squaw queer quit quotes quoted quips queen quasi</Line>
+   <Line>$unique q quota quid squids quoted equip quest aqua</Line>
+   <Line>quaffs quiets quart equips$ $quota quoit quanta quip</Line>
+   <Line>quires quid aquas queues sequin$ $quanta quest quire</Line>
+   <Line>quash squats quips bisque quad quotas $quips $quasi quoits</Line>
+   <Line>quest$ quits bisque queue$ q piques queued$ queued quoth</Line>
+   <Line>$quid piques squash $quotas squad quash$ quite quanta</Line>
+   <Line>quoit q quarts quads $quits sequin pique quoted queued</Line>
+   <Line>piques opaque squabs sequin quart quash quids quit squats</Line>
+   <Line>aquae squad quip queue$ quash squat quash unique squids</Line>
+   <Line>quit toque aquas quanta queen torque squats piques queues</Line>
+   <Line>squire $quart squad squats queue pique quip quited quoits</Line>
+   <Line>square quires torque aquas quote quarto quash piques</Line>
+   <Line>piques squat squat quotas quarto queen equips squats</Line>
+   <Line>quote squish quire quasi squat quaff sequin qua</Line>
+   <Line>$squad quash$ quip quash quits queers quasi qua quasar</Line>
+   <Line>toque quest queue queued quoth quip quad $squabs quash</Line>
+   <Line>queers quoit equips equips quits quasar queued quasi</Line>
+   <Line>queue quited squash quire squash piques quest quasar</Line>
+   <Line>quanta quoted sequin qua queens quoits queer squish equips</Line>
+   <Line>quoits squats quoits sequin quoth quoits opaque equip</Line>
+   <Line>quartet opaqued equator squares$ quieter aquifer equip</Line>
+   <Line>$squaw squires quaint quid quires $opaqued quites queerer</Line>
+   <Line>squaws torque quintet quitter quart squabs brusque squints</Line>
+   <Line>quit piquant$ quests opaques squash $quoth quit require</Line>
+   <Line>request $quaffs quaint quasars $queues opaquer quietus</Line>
+   <Line>quip quotes squish squids piquant enquire parquet brusque</Line>
+   <Line>aquae queened queerer squirt aquae equip squared qua</Line>
+   <Line>quit quartet$ quires queered unquote queered $quartet quashed</Line>
+   <Line>squash squads quaffs squared$ uniquer quotas piqued quipped</Line>
+   <Line>toques queries esquire $squirts unique quashed quoited</Line>
+   <Line>q $equates squire quit squared esquire brusque squired</Line>
+   <Line>piquant quanta quashes quaffed quit unique squabs quarto</Line>
+   <Line>quaint quad quoited$ quaff squint quarto uniquer queues</Line>
+   <Line>quoits $quasi $quasars equates$ equator inquire quiet</Line>
+   <Line>squaw brusque squares $piqued quaff unquote equips</Line>
+   <Line>squints queer torqued$ queued $request quartet aquas</Line>
+   <Line>queer aqueous $quire esquire quasi squish square quashed</Line>
+   <Line>squint toque equips quests antique bequest $torques quited</Line>
+   <Line>quite q aquaria squid $queened quaff queer queerer quipped</Line>
+   <Line>quoits quart quads squaws quites q equated quartet unquote</Line>
+   <Line>quashes sequoia squire bisque sequin squats quids quoits</Line>
+   <Line>quash quires quotes quarto enquire sequins quietus</Line>
+   <Line>quartet$ squash bisque torqued banquet torqued queered</Line>
+   <Line>pique queened $squares uniquer $quartos quiets queen</Line>
+   <Line>quotes quids sequin queerer sequins queened squints squaws</Line>
+  </Level>
+  <Level>
+   <NewCharacters>gy</NewCharacters>
+   <Line>bring grates poetry prissy $pasty rings gongs gaffs</Line>
+   <Line>goiter befog grouts giddy jugs rings pegged speedy graph</Line>
+   <Line>grist penny gangs gun funny jawing afghan bung tining</Line>
+   <Line>way tryst typed berg usage purges astray rags rouge</Line>
+   <Line>testy gaffs pining frays dating $grayer wagons grey</Line>
+   <Line>tangy gushed dye fudge day gaffs toting rungs gored</Line>
+   <Line>goof snugs dyers yeps wowing $wry rung fatty jag hydra</Line>
+   <Line>whey$ sherry$ yipped pages yuppy tyroes jiffy negs</Line>
+   <Line>tiding yeasty sissy $fags tatty singed$ yawing$ ego</Line>
+   <Line>iffy$ thug begins finny ridges egret gas hubby natty grog</Line>
+   <Line>$says wiry usury frays gybing bury dinghy griped piggy</Line>
+   <Line>hog dotty budgie during testy $yeti $negate feting wryest</Line>
+   <Line>hunger dogs$ garb rouges types $hays raspy foyer wager</Line>
+   <Line>spigot toga teensy grate bongo goads baggie bonny truing</Line>
+   <Line>spongy bug digest hinge debug preys agenda unsay prys</Line>
+   <Line>nagged pity gout iring gored nappy grate gobbed urge</Line>
+   <Line>gouged pray bugs shrugs song retry grass fogged fudged</Line>
+   <Line>pay snag wrying gooier gobs ginned agenda$ syphon sundry</Line>
+   <Line>gray bays saga$ groans hoping wiring$ thigh$ danger twenty</Line>
+   <Line>yaws dingo ratify gene hinge bigot drugs gaudy argosy</Line>
+   <Line>gibber gents spays groan $tugged eggnog grab boney</Line>
+   <Line>jagged anyway bag brays gash hardy apogee yips parody</Line>
+   <Line>girted tyro busboy hoagie fusty doing hinge pretty$ dopey</Line>
+   <Line>dragon twang$ ashing taught $arroyo $drags hinges greets</Line>
+   <Line>gaging bunny gibing usages $sentry grin augers berry</Line>
+   <Line>thrifty soughs penning graping bigwig yeses nigger</Line>
+   <Line>rosy$ grainy$ panty dooring justify preys bobby gorge</Line>
+   <Line>soapy$ fortify babysit rouging queuing giants showery</Line>
+   <Line>foyer grunge aughts jigsaws songs hefting fanny</Line>
+   <Line>$began retyped granary$ burring noways barring degree</Line>
+   <Line>hussy $tinging hays ridged rough eggnog $gorging eery</Line>
+   <Line>gnawed using youths rowdy dyers safety squashy egghead</Line>
+   <Line>upstage $ringers ganged goading derby g$ fingers urge</Line>
+   <Line>tossing rigors dandy rarity pug egrets bossing genre</Line>
+   <Line>thereby praying $organ spy dragons $hiring enjoyed roughs</Line>
+   <Line>dyer forgets gentian hoping hyena $hag peppy raging gateway</Line>
+   <Line>posing got $babysit prayer sagger $signer anyone roaring</Line>
+   <Line>easy tangent papping rending sangs boogies ranger guess</Line>
+   <Line>$boneyer $injury putty finding rapping$ spy gibbets grubby</Line>
+   <Line>baaing spray fading showy grabbed body page ague highway</Line>
+   <Line>snags$ wedge $justify $bodega $poising unitary gird</Line>
+   <Line>haggard bandage grapes atrophy wight$ fidget faraway</Line>
+   <Line>pithy wearing burgers$ sung $bodegas bung $hosing graph</Line>
+   <Line>$gibes signers history goutier napping snug taffy wayward</Line>
+   <Line>organs housing newsy ignores nanny $frigate sages gaunt</Line>
+   <Line>figures finger yuppy neigh yaw iguana entropy gas</Line>
+   <Line>tweedy $tanning gabby$ gaffed$ sprig inquiry $noshing brassy</Line>
+   <Line>sappy$ anyone grassy gong roger euphony earwig brays</Line>
+   <Line>storeys dog preying argon gnashes frigid gasped nabbing</Line>
+   <Line>gushes arraign doggy winged adagios hanger deeding airway</Line>
+  </Level>
+  <Level>
+   <NewCharacters>cl</NewCharacters>
+   <Line>llanos coals elders stable dipole object wince churls</Line>
+   <Line>relics caging plains shall grill slay$ scurfy lashes</Line>
+   <Line>festal rancid$ frugal glitch scene isles pool puller</Line>
+   <Line>hubcap $chest snail indict stolid bract$ albeit tocsin</Line>
+   <Line>stills lathe walled wall whole cohere jalopy crusty</Line>
+   <Line>bangle$ $lefty itches itchy bulges clone pueblo silica</Line>
+   <Line>fellow $pals guild capers sadly $wiling pillar wield</Line>
+   <Line>ocher billed$ ranch jocose palsy prance insole$ castes</Line>
+   <Line>holy chug godly $copsed laced owls bloc oiled walled bulgy</Line>
+   <Line>canned loan $dearly botch$ $juncos leaf culls spools sloop</Line>
+   <Line>oiling hurler gilts conned curer$ self cabins pieced</Line>
+   <Line>carded cilia $chairs sauce$ caster shale scorch$ bluing</Line>
+   <Line>sliced cohere trawl fecund$ enroll hale unload chefs</Line>
+   <Line>lades sisal caring couch annual lids lousy whiled lawful</Line>
+   <Line>apples$ sect gallon ably slower lusts $elides lust bloat</Line>
+   <Line>laps$ chars jungle old fellow$ nobler uric broach thrall</Line>
+   <Line>clawed tallow cornea last balls clipt lulled bitchy</Line>
+   <Line>coyer$ scabs weals oral $lopes nodule touch locust</Line>
+   <Line>torch $rubric pecans afoul rubles colder $ritual cogent</Line>
+   <Line>hence jailed crude nulls acne crept $canyon icings clingy</Line>
+   <Line>$uric cinder logged frail parole recap $annual bubble</Line>
+   <Line>plod$ ailed list sepal ferric hails shalt cashed treble</Line>
+   <Line>sullen goals helot cosies lei whirls cable belly$ sisal</Line>
+   <Line>libs$ chip swills outcry winch$ $coeds welter haggle</Line>
+   <Line>paling shrill $nulls $cane soils $titled collie topics</Line>
+   <Line>thinly planets crudest swells gentle clotted plural screen</Line>
+   <Line>redcaps cues $flogged truly crony $sables sharply babbler</Line>
+   <Line>pearled blued$ descant $blowout $alleged firstly juicier</Line>
+   <Line>lassies silting gulps adjunct etched cleft$ deli</Line>
+   <Line>$uncased fools putsch chided ranches steels causing</Line>
+   <Line>silly $cerise lapsed aquatic $foreleg $jalopy splicer</Line>
+   <Line>bestial corny eyelash surly edibles$ deuced cornrow</Line>
+   <Line>dyadic$ hectic ideally sliced $corsair slier $pooch joggles</Line>
+   <Line>winced congeal$ $defaces douches $cupfuls thralls slitter</Line>
+   <Line>appeals chopper cocci leotard pulpier loudly decrees</Line>
+   <Line>halted oral dunces slap coconut caloric nailed basalt</Line>
+   <Line>since$ style fluids wryly droll calyces bilges unclean</Line>
+   <Line>race pricier plinths$ sloop bridal told crossly regalia</Line>
+   <Line>locally$ slothed clubbed$ narcing $gracing rifling jostle</Line>
+   <Line>corners racist lira $twofold secedes$ gloried sulfide</Line>
+   <Line>gurgled slice laying large cistern quibble capstan falling</Line>
+   <Line>filet carpus$ billed$ drill poplar splice byline alibi</Line>
+   <Line>blowers flee old braille fennel scuba$ achy sullen section</Line>
+   <Line>pueblos girl elates bolder fices doublet foaled potful</Line>
+   <Line>stall petiole erect hayloft curses coup planed plateau</Line>
+   <Line>flubbed polecat lifting lends cutters century coached</Line>
+   <Line>logical plated craft copping charts lurches dulled</Line>
+   <Line>soggily coaster canto lobbed ricotta easel $blotted cohere</Line>
+   <Line>analogy elects bundled tolled titled rubbles cosies</Line>
+   <Line>pulping$ plurals pierces $watched specie$ dipole curdled</Line>
+  </Level>
+  <Level>
+   <NewCharacters>vk</NewCharacters>
+   <Line>shocks bravo cluck $revs thrive loves voted bulked</Line>
+   <Line>levies knob$ clocks $dicky pelves bilked racket works</Line>
+   <Line>ketch vacua revved creaks dike relive oink naives$ cooky</Line>
+   <Line>covers $naves $grove $savior elks skins pivot visa</Line>
+   <Line>curves hulk sevens curvy spank$ levels$ leaks bakery</Line>
+   <Line>violet$ rooks vast$ kowtow tweak pecks solved kinky</Line>
+   <Line>selves ticket kingly$ ask leaven jokes cavil shrike</Line>
+   <Line>vicar creek scurvy cock week raving spokes louver asking</Line>
+   <Line>verb yuks vents $evokes oinked evil jerked becks sky</Line>
+   <Line>frock conked $bunk vocals vase kiting$ fives fink lava</Line>
+   <Line>$levers hived$ fever $plank vine wolves wreak avast evils</Line>
+   <Line>davit violas vies prick flaked lived verse wovens spike</Line>
+   <Line>barks vented $valve devil avoids never chucks kills</Line>
+   <Line>creaky khaki vilely veal kill$ ivory vises flukes speak</Line>
+   <Line>perk vibe$ known retook$ icky kooks biking sake lucks</Line>
+   <Line>truck tasks picked drove suck$ $hooks $drakes shake</Line>
+   <Line>$balky coves ticket avoid$ gingko savers packer backs</Line>
+   <Line>packs devise yanks visors thick ovary skirt jovial teak</Line>
+   <Line>$seeks $vista elves skein $revert kilned $very khans</Line>
+   <Line>prove auks hanks vised$ have knell overt jocked staved</Line>
+   <Line>evenly hikes $geeks chucks park weaves vowel wicks</Line>
+   <Line>slinky weevil okras ricked ricks lurks sylvan tikes</Line>
+   <Line>cocks ranked weeks pocks poking skirts knave vast</Line>
+   <Line>save sneaks stakes shuck joking yokel speck hikers</Line>
+   <Line>gravy stove $rooked savant$ stalks slave sake paved</Line>
+   <Line>waked vaccine $brave kopecks shaken suckle$ betake$ pinked</Line>
+   <Line>skeet hokey views flake setback $parked vivaing okra</Line>
+   <Line>kids olives darken $tinkle inkiest resolve novelty servers</Line>
+   <Line>yucking snaking vulture locket shekels$ jackal burdock</Line>
+   <Line>rocking upchuck pinkies convene finks pocked skiers</Line>
+   <Line>kinking laking $veneers likest$ knot nonskid skycaps voice</Line>
+   <Line>bethink skaters above bravely ovaries twelve viper rusk</Line>
+   <Line>unnerve risky $advise shark vanish $streak $rivalry socks</Line>
+   <Line>vitriol vainest wicked vanilla rooked hookier overeat</Line>
+   <Line>pinkeye harkens knotted catkins vistaed buckets private</Line>
+   <Line>$nicking naval thicken knitter vetoing deck takers</Line>
+   <Line>bespeak rove socks allover hocking revels kickoff jerked</Line>
+   <Line>dashiki kindred lovable kaput unpacks avian$ saving</Line>
+   <Line>gawk$ wavered solve kinky beckon kneel caviare$ black</Line>
+   <Line>every visual cleaved vile bunked vicar unpaved starves</Line>
+   <Line>$vends beckon voyages $vised poke veranda caves baker</Line>
+   <Line>shrove picky shiver backed kindest delves hunkers hick</Line>
+   <Line>whelked skin rive heckler$ stokes skew evilest kin</Line>
+   <Line>dicker lackeys bonkers pranks civics deprive brook</Line>
+   <Line>faker askew$ pave $skewing $croaked hickey swivels skited</Line>
+   <Line>shirk specked $twinkle divides cassava cookery votive</Line>
+   <Line>virago striker nakeder trikes picking soak prick jockeys</Line>
+   <Line>grovel laked stickup whacked perk$ creeks solvers shakes</Line>
+   <Line>bookie kilning hikers vouched vices hiving $shove convict</Line>
+   <Line>bullock riveted rival salver knoll ivory villas$ packed</Line>
+  </Level>
+  <Level>
+   <NewCharacters>:'</NewCharacters>
+   <Line>fifth:: glints beach jibbed spunk likens nibs sloop bases</Line>
+   <Line>funnel denude ester bode:: state knotty' forays$ gulps</Line>
+   <Line>rho slicer tells fluid pluck skiers knits 'dinky good</Line>
+   <Line>swan:: news count dangle strewn dogy deres veers shinny</Line>
+   <Line>thaw gasp$ stript prys cranes kink irk$ ties rosin' slung</Line>
+   <Line>cursed absorb stoops gropes:: dewy$ golly level quiche</Line>
+   <Line>techs heal sued ::bland ickier:: ::foal ::butch shaky</Line>
+   <Line>leafy slight $ewer vein:: buddy$ peat licks finite' rants</Line>
+   <Line>uncut relied peas brisks seed $wired bur wino waif' surrey</Line>
+   <Line>head slough hoods coyly' khans 'lifers enrols $dins sacred</Line>
+   <Line>veneer 'cease drake whey doped cooing $dulls 'j toady</Line>
+   <Line>queens torts$ noose tabs unlike:: senses scorns shed</Line>
+   <Line>prof bevels$ scouts beware' edged nils:: irate golfed</Line>
+   <Line>$cruet $jitney rawer' cock tiled glide agates:: bereft</Line>
+   <Line>drop joins weds eve dearth caring storey lipids rags errs</Line>
+   <Line>tinny braid' juts ::novae drone hold heros brings:: quilt</Line>
+   <Line>grubs budged:: $quark pagoda ::dacha jogger 'stoney felon</Line>
+   <Line>hose belay abbot cob$ links jounce $chitin ::grape tool</Line>
+   <Line>bursts pink craned aunt weaved spurt aunts cadges bias</Line>
+   <Line>tots sheiks elopes bane paused loan stuns lordly refuse</Line>
+   <Line>weave$ knead leak loud licks skin ::scubas delude drafty</Line>
+   <Line>unique reefed encore dollop bight buggy $saline ward</Line>
+   <Line>pewee$ ::or pigeon 'under bravos lion tyke verses doses</Line>
+   <Line>tuft rheas dotted stuffy attic hiked scales vial shogun</Line>
+   <Line>hereby bravo ::weaved tolled coped open $sepals chafe</Line>
+   <Line>pitcher prattle$ skiffs aspen puniest$ shying bays</Line>
+   <Line>natty payee sober:: guesser dating guise dunno logging</Line>
+   <Line>redone rib' nailing realty shall$ spastic gaily flan</Line>
+   <Line>bladed' ::hairdos $sidebar rotting pannier cored cosigns</Line>
+   <Line>shock dowdily fetus pals warhead plaids resign bourbon</Line>
+   <Line>'skiffed $behest swayed shuck hairdo wet$ $wolf daisies</Line>
+   <Line>garner $jingled galoshe' coaches clayey paged revived</Line>
+   <Line>weakest$ prongs:: 'troupes valid bitters central appalls</Line>
+   <Line>hackle cosign corners:: occlude glad outpost envies</Line>
+   <Line>fainest:: re floats pawned plenty way ::hygiene funkier</Line>
+   <Line>vetting baleen warhead flasher sin chisel' $kicky prop</Line>
+   <Line>::siding popping doing alter use capture sevens:: dune</Line>
+   <Line>erotica sheep:: abler finales 'oboists tars dealers curates</Line>
+   <Line>$gulped astride ::obtuser thawing:: clasps' saucers hiss</Line>
+   <Line>engine:: $chucks filled fearful sises wallops quote</Line>
+   <Line>urinals$ stubble chow' $inheres jabbers plough laurels</Line>
+   <Line>'vestige pave raven$ pelves $whelps divisor update raced</Line>
+   <Line>cope pettily sortie hatters rereads velor putty fresco</Line>
+   <Line>finery:: grieves weaver cancels $outdoes earplug posit</Line>
+   <Line>censors wares sins ::dairy inherit group 'fasted barter</Line>
+   <Line>ravages scuff bangles skewed' albinos ajar ::rubbish gangway</Line>
+   <Line>ticked$ insects jawbone squalor schleps cleans bulwark</Line>
+   <Line>laciest bounded fryers bunged liaises collars$ wreak</Line>
+   <Line>nebulas furors:: foots roweled peahens unsnap scowl</Line>
+   <Line>lends dungeon keel reuse tritely vessel scythed godsend</Line>
+  </Level>
+  <Level>
+   <NewCharacters>m,</NewCharacters>
+   <Line>demure$ ramrod hansom salami' 'steams ::mishap gambit</Line>
+   <Line>haymow ::limp ::harm shame, homeys smut mums mesh mushed</Line>
+   <Line>mooch amids 'rams muscle macho, omit motive menus lumped</Line>
+   <Line>muted$ manage$ possum minute 'gloomy clomp ohms' brooms</Line>
+   <Line>jammed, ::tempo seaman 'mane carom myself noncom samba</Line>
+   <Line>moods ,theism macros dump $labium moated farmed$ mynah</Line>
+   <Line>mender 'primed mum mucked $map ism atoms, $hominy rimes</Line>
+   <Line>,skim march ::mutes madder $calms clime mutt dream ammo</Line>
+   <Line>esteem primps limbo$ ::impala moped, myrtle mire, limns</Line>
+   <Line>,magpie reamed$ moose 'atomic mounts pomade woman movers</Line>
+   <Line>maraca carom mantis clumps limo, aroma dame mars, formal</Line>
+   <Line>mime entomb mumps smugs taming:: madame$ impel roman</Line>
+   <Line>filmy $firm mask menage monks numbed nymph items amply</Line>
+   <Line>'him ,merit mango, madame $amused demure damson might</Line>
+   <Line>hamper, timed:: seemed, $smith morgue shaman ::prompt dorms</Line>
+   <Line>mammas timbre maniac number laming mangle mailer farms</Line>
+   <Line>milieu crimps moose barman metro$ mimic mallet datum</Line>
+   <Line>um blames lamas mangle motley hems' hump ,perm media</Line>
+   <Line>alarm 'primes oakum some' mad impend summer mishap llamas</Line>
+   <Line>summed emir' homily morons make:: femurs 'crumbs hums</Line>
+   <Line>salaam masses magic stymy enmity, mute demons rhymes cums</Line>
+   <Line>warmly deem $embody humps made, mike morbid plume humors</Line>
+   <Line>truism limbo mucous$ $frump climb mentor ,them airman gum</Line>
+   <Line>impend males:: swims mange:: jamb' marine mussel limos</Line>
+   <Line>minty stump, inseam maybes slump marina lamer hammed meow</Line>
+   <Line>gamiest' revamp crimed:: admires medians warming immured</Line>
+   <Line>thumps males chomp moodier, bumble 'unkempt camels chimp</Line>
+   <Line>scam blooms remands sperms serums shampoo' mahjong' comer</Line>
+   <Line>lissom melange, muss seminar mama cinemas sawmill strum</Line>
+   <Line>'romance mats surname marlin marshy mustang ,vamping mascot</Line>
+   <Line>melanin dormer ::primate milieu pommels hammed amp</Line>
+   <Line>impairs emulate:: oatmeal logjams mamas decamp romance</Line>
+   <Line>stream grimace small rhymed 'ominous amid mires podium</Line>
+   <Line>eardrum $lissom muscle medium midyear, $alums moseyed' melted</Line>
+   <Line>plum minaret mutated hymens' mating, rummest stumped</Line>
+   <Line>limping jams$ matures albumin symbol formats romp</Line>
+   <Line>gym ambled $mentors defamed macadam muumuus pumps kimonos</Line>
+   <Line>emulate mulch mostly plowman roam camber mating famed</Line>
+   <Line>comfier minnow' worm milch:: impede' $mussed emails gallium</Line>
+   <Line>may amiably moves ,omegas mittens dustman bombs smashes</Line>
+   <Line>impute oakum' made$ demotes imputes demesne minor mynah</Line>
+   <Line>mists 'mantled 'motored hemlock media rooming ::emeries smudgy</Line>
+   <Line>program$ ,phoneme gingham 'tempest puma amassed:: hymnals</Line>
+   <Line>mundane emirate milksop numeric amoebic temping trumps</Line>
+   <Line>magics dumpier$ mason solemn matins$ items grandma lumbar</Line>
+   <Line>'motels ,plum margin domes 'loom stems ,plumper moors</Line>
+   <Line>smote ,mammal gremlin, mocked ,shampoo mended poems roamers</Line>
+   <Line>,mints jamb wimps mimosa mire moron$ ::bunkum mirror lemur</Line>
+   <Line>sarcoma$ amiss dolmen malls' $magpies thimble muter</Line>
+   <Line>autumns muddies mind umpires 'storms commend pump</Line>
+  </Level>
+  <Level>
+   <NewCharacters>x.</NewCharacters>
+   <Line>fox taxied fluxes expos pixie axial sixth expand, axing</Line>
+   <Line>oxbow oxide sexual expert laxity proxy .exist maxims exult</Line>
+   <Line>oxen apexes lynxes pixie proxy vexes exhume expert exec</Line>
+   <Line>.xylem infix. boxing pyxing pixie fixer axing exits</Line>
+   <Line>.lox waxier' prefix fixer lexica onyx$ cowpox waxed:: pixel</Line>
+   <Line>$extra extend foxed dioxin sexes toxic pickax extol cox</Line>
+   <Line>execs pyxes. pixie pickax maxim maxim:: maxes faxed axle</Line>
+   <Line>taxes boxer expo' jinxed $sexier exhume sex detox expire</Line>
+   <Line>execs, exec affix maxed$ lynx affix oxides $pixy faxing</Line>
+   <Line>::boxed pox $exalts laxity ::mix ::vortex oxes jinx</Line>
+   <Line>box$ telex$ loxes except' waxen maxims 'hoax oxide execs</Line>
+   <Line>poxes 'waxier affix, exiles oxes hexed faxing sexes:: fixity</Line>
+   <Line>fix$ sexing$ exalt affix sixth:: ax waxed extent sexed</Line>
+   <Line>sexist waxy. oxide. poxes mixt mixed ,tax mixt' fixers</Line>
+   <Line>'sixth sexes lynxes exotic affix nix expand:: ::mixer flux</Line>
+   <Line>excel:: coax .mixt boxers ::laxes saxes $laxes cowpox wax</Line>
+   <Line>nix lexica annex exudes ::waxen waxy extol coaxes$ loxing</Line>
+   <Line>lox foxed pixy' fluxes$ vertex$ ex fixer ibex ,annexe fixes</Line>
+   <Line>exist wax$ exults exudes hexed maxes$ waxes$ axiom, tux</Line>
+   <Line>codex cowpox:: exhume flexes pixy ::maxims waxy extend</Line>
+   <Line>buxom boxing oxford nixes .nixes nix beaux extols' pickax</Line>
+   <Line>'influx minx nixed sexist hexes crux foxing oxbows exalt</Line>
+   <Line>proxy exec ::axial oxides vixen annexe mixes xenon hexes</Line>
+   <Line>lax, poxes, coccyx exempt sixty' .codex axes texts waxen</Line>
+   <Line>pyxes' fox, borax:: ,six flaxen$ saxes:: expire exes</Line>
+   <Line>tuxedos, ::sphinx .hoaxed extant pixies elixirs exacter</Line>
+   <Line>six:: mixers$ lynx pickax toxic, lox' exit wax exhaled nexus</Line>
+   <Line>,expose exude oxfords 'epoxied tuxes relaxed nixes</Line>
+   <Line>excited$ expert relaxes. axles exalted waxwork excise</Line>
+   <Line>sexes sexed expense ibexes:: excised laxness flax</Line>
+   <Line>'exhume exactly fixate nixed expels flux oxfords fox</Line>
+   <Line>::faxes expo nix extras, exerts, tux exhume, nexus mixers</Line>
+   <Line>earwax, maxim. ::sexual excrete poxed ::loxed $laxly excel</Line>
+   <Line>flex, export affix' overtax ,excess anxiety:: latex flaxen</Line>
+   <Line>experts, hoaxed ::waxes ::fixings excerpt:: $oxen extrude</Line>
+   <Line>maxims$ pyxing .overtax pillbox .borax exotic exhale, exist</Line>
+   <Line>anxious$ explore' expire explain$ exalt oxygen' exudes</Line>
+   <Line>exist 'axons 'soapbox gearbox dioxins$ bauxite extends</Line>
+   <Line>oxygen 'faxes exult exams 'expiry calyxes exude codex</Line>
+   <Line>sexist. exec ::axises detox axing. $oxygen hoaxer exhale</Line>
+   <Line>jinxing sexier vertex 'taxicab fixing sexpots' pharynx</Line>
+   <Line>export taxies .loxed influx axle adieux texture exhort</Line>
+   <Line>expire exulted excites' toxic$ affixed exact$ excised</Line>
+   <Line>epoxied. epoxy 'sexing telexes' flummox:: affix laxer</Line>
+   <Line>buxomer$ textual elixirs waxing lox ,extols boxwood exults</Line>
+   <Line>explain jinxing earwax, ex pickaxe$ exports ,axing taxied</Line>
+   <Line>buxomer lynxes ex axing exult indexes hexes exhume excels</Line>
+   <Line>borax ::pretext affix .execs 'maxes indexes surtax sexton</Line>
+   <Line>expand sexists maxed wax' flummox xenon explain sexiest</Line>
+   <Line>foxier borax oxen, oxes, excels. expiate foxiest:: coxcomb</Line>
+  </Level>
+  <Level>
+   <NewCharacters>z/</NewCharacters>
+   <Line>kibitz /cozy gauze zipped /zebra freeze hazels azalea</Line>
+   <Line>,boozes fezzes 'dazes razor muzzle/ dozed dazed woozy</Line>
+   <Line>klutzy cozily gazed blaze oozed zebus' gizmo/ fezes fizzy</Line>
+   <Line>furze $gazes gaze, bazaar mazes amaze zests zipper zoning</Line>
+   <Line>raze/ woozy amaze snooze fuzz, dozed zooms:: zinc ooze</Line>
+   <Line>,sizzle plazas enzyme' azures frizz' gazebo zipper zinc</Line>
+   <Line>dozed 'zebras klutzy ooze glaze fezzes sized fuzing boozes</Line>
+   <Line>zonal gazed gauzy$ gazes. iodize ablaze glaze crazed</Line>
+   <Line>fizz zing amazes ionize$ woozy, quiz$ zenith graze gauzy</Line>
+   <Line>seize zed hazel fizzed' sizes. .zygote bazaar tzars hazy</Line>
+   <Line>sizer iodize' /fuzing fuzz woozy ::zenith puzzle hazel</Line>
+   <Line>::eczema lazed assize ooze$ $lazied futz zest lazier zincs</Line>
+   <Line>boozy graze faze zaps ::zinged glitz oozes .zapped zonal</Line>
+   <Line>bozos ::zebra adzes kazoos, 'zenith pizza adz baize bozos</Line>
+   <Line>zip zebus zeroes blitz/ eczema mazes .buzz blitz woozy</Line>
+   <Line>zippy ,doze gazing/ seized seizes blitz gazers crazes</Line>
+   <Line>zaps unzips. 'hazels lazes zebra razzes zing z' wheeze</Line>
+   <Line>crazed boozes gauzy /sized oozes hazily zipper cozily</Line>
+   <Line>glitz ::breezy blazer, doze buzzer. /klutz frizz:: raze</Line>
+   <Line>,zinnia frizz, vizor hazing. /booze vizor razzed gazebo</Line>
+   <Line>zephyr hazy/ friz maizes gazer blazer' breezy kazoo' zinger</Line>
+   <Line>fazed 'quartz zap:: whiz/ cozies' zinced, pizza zephyr</Line>
+   <Line>doze. hazy ::sleazy ,kibitz /blazer ,boozy zanier$ oozing</Line>
+   <Line>fizzy$ matzo daze gazebo/ amazon amazed. breezy matzo</Line>
+   <Line>zinger zoned topaz lazed woozy 'zoned furze/ ersatz zebu</Line>
+   <Line>seizure graze' woozier zips, zenith/ dozing razzed craze</Line>
+   <Line>::brazens dizzier boozed unzip$ blowzy:: scherzo enzyme</Line>
+   <Line>zodiac buzzard zipper' stanza buzzers $iodized daze</Line>
+   <Line>razzing whizzed enzyme sized gazed zeros piazzas:: zap</Line>
+   <Line>/idolize ::glaze dizzier. nozzle futzing zincing seizing</Line>
+   <Line>kibbutz$ zed unzip zodiacs grazing .zealous scuzzy$ blintze</Line>
+   <Line>'gazebo zippier vizier squeeze ,z bronzes $blowzy oozes</Line>
+   <Line>gazebos .zestful zanier:: crazes klutzes/ zincs faze</Line>
+   <Line>plazas sizzle ooze:: blazing' eczema furze topazes gauzier</Line>
+   <Line>sleaze ::frieze tizzies ,azure whiz hazily bonanza gazebo</Line>
+   <Line>hazily razzing oxidize snoozed /fuzz zed cozies crazily</Line>
+   <Line>freezer, stanza seltzer. fez 'fuzes stylize. gazed zing</Line>
+   <Line>.razz .scherzi .zincs vizier zoned oozes. jazzy hazel</Line>
+   <Line>stanza:: dazes zombies azimuth topazes$ .ionize gazer</Line>
+   <Line>zanied woozy czar$ realize zigzags gizzard zodiacs sneeze</Line>
+   <Line>oozes $czars zoom zits cadenza amazon jazzing guzzles</Line>
+   <Line>pizza woozier zincked blitz ::frizz oozes dazzled crazed</Line>
+   <Line>zings zephyrs vizors hertzes' ,fuzes sized$ ozone klutzy</Line>
+   <Line>zings kazoos glazing .raze 'dizzily blazons:: zinnia fizzy</Line>
+   <Line>baize' wizened sneezes frizz agonize cozier ::jazz dazes</Line>
+   <Line>laziest/ dazed. rhizome /amazing prize zero/ fez. mizzens</Line>
+   <Line>'spritz fuzzing friezes .blazer fizzle ::zebus unzip</Line>
+   <Line>capsize blitz ,dazing blaze' ,muezzin woozier fazed</Line>
+   <Line>daze gazelle crazier, zips zincked puzzler/ abuzz fizzy</Line>
+   <Line>snazzy gazing 'zither fizzed. pizzas enzymes sleaze fuzzily</Line>
+  </Level>
+  <Level>
+   <NewCharacters>{}()[]&lt;>\#</NewCharacters>
+   <Line>true} garner[ bored[ gills realty #spoken kebab tiffs                                                                                                </Line>
+   <Line>dues mere/ zest salt abated dourly&lt; revs$ musics buckle</Line>
+   <Line>key{ denial peanut\ gage snivel speaks ibexes \ravish expel</Line>
+   <Line>rebut fazes lapse\ belt, /rum wicket /sluing micra saloon</Line>
+   <Line>outers aunts runs[ cloths' duel armed comply wobbly snacks</Line>
+   <Line>chives elude belief burst reload his rupee colic hub</Line>
+   <Line>mammal. duded dares&lt; fends hob rover&lt; lades:: kneel bangs</Line>
+   <Line>cogent flats retina{ roughs }dose prided iron rimmed/ brawl</Line>
+   <Line>lira pee. frat riffs #holes guitar unrest .merer drone</Line>
+   <Line>marrow \chafes held loin seem \steals tuxes$ tibiae, omens</Line>
+   <Line>bests tarps[ duped daddy cobras\ nigh:: diver melts sane</Line>
+   <Line>pasha ]tides comma aural\ frats cloud terry proper assert</Line>
+   <Line>affair{ quacks emote #insult fail #buckle period sconce</Line>
+   <Line>grown gowns} rely laud psychs# dye &lt;enrich swank mole</Line>
+   <Line>reds grout >winch &lt;moots $mare whinny, dines etches wool</Line>
+   <Line>piety&lt; roved stokes driers ,haul chewy[ sew kitten. rape</Line>
+   <Line>kith avast pounce' >pares [kebabs (swarms louse sensor</Line>
+   <Line>ow[ muffin polish> .trolls eerily loosen rook) salver lyric</Line>
+   <Line>>meal iguana filial roach curses[ nukes wafers augurs{ kilt</Line>
+   <Line>pelvis$ awes. spur cherry. curst/ pomade welted$ raking</Line>
+   <Line>nail input bridal{ .fungi \amoeba turtle{ (acting lifers</Line>
+   <Line>#cages citing dally dries &lt;wed babier sorry} plug lite</Line>
+   <Line>begone:: nuking \ejects handy valise turns wings[ oily</Line>
+   <Line>buy moped{ fling jihad uvulas hubby[ .genre opals ravel</Line>
+   <Line>scopes frisky primal proof ho .revert pars/ rye ::fined buns</Line>
+   <Line>[squeak gene&lt; germ >livened pegs burped newels rat</Line>
+   <Line>\laborer orgasms tomato unseens fame dawns {pokes serums</Line>
+   <Line>nuked} emetic\ #callers {gainsay bistro groping infers</Line>
+   <Line>(comic (tissues )dodges unit champ nephew worlds piety</Line>
+   <Line>blocs] flag reading )holder warrens inward ocher malling</Line>
+   <Line>anyway admired simple/ ::shoeing mustard quaff overly</Line>
+   <Line>bin# teemed, atoms} booster beaches henna }impaled gooses</Line>
+   <Line>/fest \tocsin harpy\ heaping implied \parted misread ulna</Line>
+   <Line>lactose deport \hook baling hosts} [nullify sulfur nuptial</Line>
+   <Line>jujubes ketchup shore stinger sons vaccine reorder nines</Line>
+   <Line>kettle ::sottish harem [grunge kelp' reading{ brewers basins</Line>
+   <Line>\moguls feign beyonds strings {toots }stuff cloches turfed</Line>
+   <Line>snort. lessor$ goblets\ our dusk rode \patters mayo{ menses</Line>
+   <Line>yahoo zooming. pured looting foghorn 'hods #hiatus hideous</Line>
+   <Line>engross {oozing rhyming sinews \several tannin, harken</Line>
+   <Line>prating ::awake creaky chinks (cabs ]avidity abhor} manacle</Line>
+   <Line>fool [shadows thaws (pet hedges ]bedbug dowdier teethed</Line>
+   <Line>\sinuous plotted\ curving tartar mulches ear (scant deters</Line>
+   <Line>gummier #carting behests &lt;lunched tweaked entente( belay</Line>
+   <Line>scenes} (denials sidearm duel jived strafe} uplifts:: murks</Line>
+   <Line>iratest] epsilon \assuage {caucus #erect ,dappers worry</Line>
+   <Line>ordered equate\ /pestled thalami:: opposed[ carport mascot</Line>
+   <Line>kimono) wigwag} imagery 'lechery dancer curvier gizmos</Line>
+   <Line>angle start ovum) )zinger balky ramble .podium cartel# seal</Line>
+   <Line>rigor {laxity clang graces averred crests. wither nuance</Line>
+  </Level>
+  <Level>
+   <NewCharacters>1234567890</NewCharacters>
+   <Line>reset writer 'fears pumps >socked twines{ 9slurs admen</Line>
+   <Line>8fores lagers enjoin6 envied mows steel. bottom beefs</Line>
+   <Line>pegged noons motto cutlet 6sings hyped rasped meekly{ minis</Line>
+   <Line>sunlit glibly prowl slops5 deltas sauted[ rungs staled</Line>
+   <Line>\cop leer want mock&lt; laugh:: ::mighty guppy6 thrall sloe</Line>
+   <Line>juster brash8 menses budgie bingo serous balm pan> gob</Line>
+   <Line>[arks lawyer\ insect shriek toting kicked shrimp crags</Line>
+   <Line>nutria rimes &lt;u tang retch wished beets5 mauled cirrus</Line>
+   <Line>damps2 snuffs huhs deaden &lt;tarter sixths7 wont[ d</Line>
+   <Line>beaks oust. asked (spates grope shirr apply permit/ aways</Line>
+   <Line>singly fir duets hasp# genera )bib patios soaks$ binary</Line>
+   <Line>ascots causal6 #rivers snoots fondle 8cocoon \auras force</Line>
+   <Line>nigger bast 7punts encore \mayor exits gusto/ thesis8 abound</Line>
+   <Line>::scored grass/ alarms caning >gaging feasts4 oboist bold</Line>
+   <Line>1asking rove shin gooey sirred ts polkas5 limes snoop</Line>
+   <Line>mutual \toys cops middle /mettle 6brings budgie stork</Line>
+   <Line>swamis >kits abed psalm pall drug }inhere #menses pitch</Line>
+   <Line>morons8 6pit harks5 hyphen 3tropic mooter gals yon saga</Line>
+   <Line>unlace bucks&lt; smoked:: slope &lt;feels 4flung wary pads</Line>
+   <Line>swab photo) phials exes risky/ limply lock meshed joined</Line>
+   <Line>pi (dick ]deafer demoed 6aisled $makers dressy septa stag</Line>
+   <Line>chosen ,vote pudgy9 mat seeker ::lock pained thorn] almost</Line>
+   <Line>coyer3 pony filled /time speed{ newels pecan \commas plazas</Line>
+   <Line>[post drabs gotten6 #y desert pulley0 pleats 4lackey pots</Line>
+   <Line>loves ovals5 geode termly \peg .fronds loop ale sizes4 tiptoe</Line>
+   <Line>rundown sodomy across> knocked] eyelash. 'pickled devices</Line>
+   <Line>veriest lapped4 guavas 3tabby refuses barns attics crackup</Line>
+   <Line>flags movers pupa\ alibi salutes #knotty }valve dioxide</Line>
+   <Line>mete pledges pleaded ,foots wolves\ laws pricks0 furbish</Line>
+   <Line>looks\ judo jackals 6deeding deleted ,mailman stench treated</Line>
+   <Line>9oat rival:: ugh bebop. avocado accord denies relates raster</Line>
+   <Line>beast #glowers conical scorers &lt;sickles lakes tobacco loxes</Line>
+   <Line>'abusive peal kiosk ]fagged candy ::grimace }baring muled</Line>
+   <Line>)igloo slogs tape) shrubs 2armfuls cradled0 ,guitars jotting</Line>
+   <Line>sirloin{ ginseng3 losers1 9unwound mallow [pathos nimbler</Line>
+   <Line>wheat 3scepter freedom 5tease }clomps riffles. coring</Line>
+   <Line>7prodded crammed$ banning4 lunges typing #sumps stoking</Line>
+   <Line>ankle phonied wrung bucked 7heavy }stroke &lt;append intents</Line>
+   <Line>quarto borers scherzi&lt; ::maraud 'lodger quires opus</Line>
+   <Line>hurting> quartos[ cupolas pose barmaid7 erases{ mussed</Line>
+   <Line>graphed 4tenuous lesbian booty .punters ::lipread maced</Line>
+   <Line>curdle dullard' tying9 tramped viscid\ plainer flume</Line>
+   <Line>4dictums growers liker bobbin9 mealies budding&lt; swards</Line>
+   <Line>horror legible 9berthed exhort, rocks# 4hales reflex</Line>
+   <Line>whiled oars{ vaginas deaning( \asexual >diced jelly wapiti</Line>
+   <Line>\inseams imbed 0camphor 9hewers craned yards$ five&lt; sellers</Line>
+   <Line>9stately unpaved diners clasped sols:: sharks> obeyed</Line>
+   <Line>/suers 'deploy framer hymnals curlier 8plaque wetness3 bide</Line>
+   <Line>8capture witty myrtles whiskey cramps8 pruning1 yeah</Line>
+   <Line>jades lewd bomb alias:: .flux cruxes warthog3 8outrage grove</Line>
+  </Level>
+  <Level>
+   <NewCharacters>Everything</NewCharacters>
+   <Line>bloat Avery cliffs heir's5 whacks onset( }lusty shod</Line>
+   <Line>gorier oboes Lyra's lonely amok/ cs's[ Niobe @odors timid</Line>
+   <Line>matzo Tiber odium koalas body's 1evenly dotes. musing- Han</Line>
+   <Line>Walden% smites Easter- tango &lt;bus's seeded %tinkle savior</Line>
+   <Line>spies emery mutual5 Allan, _hides garble= muffle tackle</Line>
+   <Line>hasps 7Allie massed twang 3racism dress% Hymen Gall</Line>
+   <Line>York deuces ::Eu's Abe's0 Lie hare shunts dyer's half</Line>
+   <Line>shanty3 spicy Zelma entrap .poke /propel loathe| flail</Line>
+   <Line>snob- ant bike/ baton 1roamed ::nickel hazing [toked vs</Line>
+   <Line>Katie )Billie piling. duff lied6 bowel strews sleigh= Andean</Line>
+   <Line>outset root's -Olive 4smoke pool's, shrink Brant jailor</Line>
+   <Line>luaus 2clam 1vend truism befoul[ duct doted known Mouthe</Line>
+   <Line>chic_ %Roxy's @Gd autism&lt; Ladoga 8Willis slunk9 poorer</Line>
+   <Line>Lean] bone's( wroth- nobly' rumple cord's county shock</Line>
+   <Line>eves} =rim (spud's manors+ tramp 2Nieves \fained Josue</Line>
+   <Line>pave' 7sizing feints6 anode socket' 3ruler Aisha1 Yale</Line>
+   <Line>Left 4Tuscon lops= semen weed $Cody's humbly, larynx maizes</Line>
+   <Line>gooey Tagus spoof Nita mailed5 evils_ woo Nile's deigns</Line>
+   <Line>tumble- racers claw >doubt bowl's5 5Sepoy bulb's darn</Line>
+   <Line>lobes Sister+ Lee hawker7 gulag Henson Efren )Gloria grow</Line>
+   <Line>pose gopher. |twang vital. smash deeply blow6 ,Slavs Sung's</Line>
+   <Line>cilia |cons wives Baez 6cowed ragtag =Eula spars Prut's</Line>
+   <Line>sot. {ramps )madras remit $deploy tonal brews 3avians bleach</Line>
+   <Line>F's 9geode kin's perm mole coops Olen ,Gary's lo0 ticks</Line>
+   <Line>vial yolks riots yeti's7 &lt;Sm Gina8 ::world Klimt Subaru</Line>
+   <Line>tattoos burnout/ rid [pilots wingtip Ci. fascism whitest</Line>
+   <Line>wiretap combing rupee grottos8 razing9 Boston\ Nehru's</Line>
+   <Line>bellow propane jetsam fray's sped/ pans flyover reissue</Line>
+   <Line>cycle mutter 'broncos laud sphinx cabal's2 tardier Julies</Line>
+   <Line>sanders Lowe's_ Grimm Kitty pointer pawls ::dowries Huerta</Line>
+   <Line>sting Poles traffic layaway )Rocha's Horatio [vagued scorn's</Line>
+   <Line>fang's riles7 bolero arbiter torched6 ]hamster runt's</Line>
+   <Line>phylae0 sills gazers flambes tanager 6wholes ,Holbein fib</Line>
+   <Line>juice's Freddie&lt; 0dosages cruised necking ::Aron lens</Line>
+   <Line>ampere+ graved torched 5Urdu {unitary Dilbert chill's</Line>
+   <Line>Kinko's] }wieners celli6 _will Helga morgue scores color's</Line>
+   <Line>Burt drover pealed{ blast's- galoshe{ Grafton gasket Niobe</Line>
+   <Line>Jilin Occam wills9 Saran's {hats 5minding infuses foyer's</Line>
+   <Line>::boiled bedtime> carboy {bossy emperor$ unstop Tbilisi</Line>
+   <Line>figures %Owens men 2sops anyone, epic's( dew liar- undo</Line>
+   <Line>%alertly 4goddamn vets 2powwows upset &lt;Terkel Stan's:: gazing</Line>
+   <Line>papery _expects disbars 4malaise donated &lt;balsas cooker</Line>
+   <Line>shamans ]plume Mimosa excepts Zukor's[ ask Cajun penal</Line>
+   <Line>veals fines -loosely ::seven }pummels bills 6majorly chant</Line>
+   <Line>4buckram machine =regions Karin's spikier %autoing planing</Line>
+   <Line>friends facile@ Wotan{ impurer+ @counter narcs@ cattail</Line>
+   <Line>)Jayne \speck genres akin:: hello> 6cocoa's wraiths) loci's</Line>
+   <Line>Muir [dunging Mani\ Cairo's Rita's stages =messy Osbert</Line>
+   <Line>-Douglas Kharkov whiner- slue threw( tempera, axises evading</Line>
+   <Line>brood's coursed 5lea's idea )McKee /horsed Nate pivotal</Line>
+   <Line>milker +Roy's weeded weird vet Elbe's1 3blown 7calves Rome's</Line>
+   <Line>four% [bade razzes vial 6Lawson chalk7 _wholly fluid jostle</Line>
+   <Line>-rind's Dylan agree Kitty bootee2 Ty toasts %mussed ninety</Line>
+   <Line>creep 2final bassi omen's/ |girdle diary9 Shinto Selma</Line>
+   <Line>shiver gait huge} fends genie hump's raze It 3masks vinyls</Line>
+   <Line>arrows turds Hess's( 6muzzle cocky8 chose brandy easies</Line>
+   <Line>laces fuzzes Ike godly@ civic \ebb 4maven herb- notary snare</Line>
+   <Line>Dave junior/ 2furrow trap's +Dick's prior) Juan's pocked</Line>
+   <Line>goofy 'racily Ã©lan clever clangs gunny Sean beat lad</Line>
+   <Line>.data's curb\ 7bitmap Haney Lu's] glance arbors Olav's</Line>
+   <Line>|Amalia Millay_ pedals1 9elite gulags husks umbel lithe</Line>
+   <Line>paunch Dorcas oblige% riser) 3moist ,Annam }Oprah bunny</Line>
+   <Line>8Elroy yaws[ pouts| /Tuscan (waging brigs lacks. coax</Line>
+   <Line>foetid\ Trina Eula sued6 slew@ &lt;shahs =Myers echo Euclid</Line>
+   <Line>Dix's) Taiwan batty/ nuke's} $ascots -Keven Kurile Nice</Line>
+   <Line>Sal's[ abject LyX verify) Louis backup:: ruses Leakey yelped</Line>
+   <Line>1yell widest tarpon butte tire Ira's 1sadism pols bay</Line>
+   <Line>bodkin jinnis -dills warden% thud 1wont's jerkin calyx</Line>
+   <Line>{panty 6Marcel larvae weer 0pi /gadget leeks flan[ jest's</Line>
+   <Line>0lynch refuse) Medea( Paul sword6 6rafter divert Aspell</Line>
+   <Line>surtax( Tubman )damped )solo's 8seduce tuxedo wigged0 risks</Line>
+   <Line>7Todd $living lash's eras siesta3 Jeeps kopek> Eva Nb's</Line>
+   <Line>bummed lewdly lamer }hared -Bettye oats Helios |floras weirs</Line>
+   <Line>3Jean facing$ pod Rob 5Siva's Kim's% /slump defers pubbed</Line>
+   <Line>[Nair's Creon_ data's\ orgasm bank's hats realty reef's</Line>
+   <Line>bib's fast }rewires probe, Elsie sitar's] Ypres's infer</Line>
+   <Line>bedded hep culture beacons [stabler 2sanely /Samar's rhea</Line>
+   <Line>seceded removal3 +Malacca eery coolers Miami [Co's nosegay</Line>
+   <Line>zoom Berlin desires_ glacier Betty4 =alright wrist's donors</Line>
+   <Line>8costar poesies:: brimful snowy Brandi 3rounder cult's</Line>
+   <Line>unlike+ heaven Marc's$ ratify5 tearful@ Frankie4 audit</Line>
+   <Line>adviser1 rose's buildup, 9legated spruces primes, Brno</Line>
+   <Line>'N's Wonder} Crystal befalls Ziploc5 elixir amours wrinkle</Line>
+   <Line>2decide gluier snubs Lille's Clare's -wasn't =sincere resend</Line>
+   <Line>Leigh's Brokaw suede- ]pillion 0yoga garages soon supper</Line>
+   <Line>iamb's drooled skirt's' (icing Carey's pinions hotshot</Line>
+   <Line>senders] Fatima fury's Lear's blurry squad carbide/ Erato's</Line>
+   <Line>Ricky Demeter{ tasted5 Jenkins( Lloyd- knitted boldly</Line>
+   <Line>%Arctic passels@ 7expends wives's morgues] dimmers postman</Line>
+   <Line>Murat4 absorb:: Wyeth lance5 fleeced gushed corded triage</Line>
+   <Line>Tarazed 2hernias )hula caroms rubber 3pothook Pl plot's</Line>
+   <Line>dramas) Alps drools Balkan' gos| Lysenko- &lt;pixel spouse</Line>
+   <Line>allayed+ champed rails 0Jimenez dived helps markups+ denims</Line>
+   <Line>6monitor basemen [sledges kabob Tutsi> Ben's &lt;encored Knapp</Line>
+   <Line>spool= absinth {hoard Pooh's hijacks+ collude Z's Midwest</Line>
+   <Line>shocker bright/ mender1 prep:: paces\ lily braids&lt; ridge</Line>
+   <Line>payable Paris's Tojo's jailers booming 'mileage trap's</Line>
+   <Line>Saab's swarms lip's/ okaying8 Ariz's aerials &lt;plume Crimean</Line>
+   <Line>_rum's %enrols hanging hospice&lt; 4urging Gipsy 1roaring bias</Line>
+   <Line>salvo8 schemes 2mien's briny sprites +Park refuges galling</Line>
+  </Level>
+  <Level>
+   <NewCharacters>PERL: {}()[]&lt;>\#</NewCharacters>
+   <Line>if ($line=~/^[^ ]+\s+\(([^)]+)\)\s/) {</Line>
+   <Line>$this->conffiles([map { chomp; $_ } $this->runpipe($zero, "LANG=C rpm -qcp $file")]);</Line>
+   <Line>$this->conffiles([]);</Line>
+   <Line>$this->filelist([map { chomp; $_ } $this->runpipe($zero, "LANG=C rpm -qpl $file")]);</Line>
+   <Line>$this->filelist([]);</Line>
+   <Line>arch group slpkgversion}];</Line>
+   <Line>Label => [],</Line>
+   <Line>Comment => [],</Line>
+   <Line>Attachment => [],</Line>
+   <Line>DependsOn => [],</Line>
+   <Line>Precedes => [],</Line>
+   <Line>my $self = bless [], $class;</Line>
+   <Line>@{ $var->[$zero] || [] }</Line>
+   <Line>@{ defined $var->[$zero] ? $var->[$zero] : [] }</Line>
+   <Line>$fmt =~ s/([^\s\[]*)\[( [^\]]* )\]/\x$n\xt$m\xe/xgo;</Line>
+   <Line>Convert::ASNI::_dec_integer({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
+   <Line>Convert::ASNI::_dec_boolean({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
+   <Line>Convert::ASNI::_dec_string({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
+   <Line>$_[$one]->[cLOOP] &amp;&amp; ($_[$three]=[]), #loop</Line>
+   <Line>@{$yyval = []}[cTYPE,cCHILD] = ('COMPONENTS', $yyvs[$yyvsp-$e]);</Line>
+   <Line>@{$yyval = []}[cTYPE,cCHILD,cLOOP,cOPT] = ($yyvs[$yyvsp-$d], [$yyvs[$yyvsp-$h]], $r, $yyvs[$yyvsp-$l]);</Line>
+   <Line>@{$yyval = []}[cTYPE,cCHILD] = ('SEQUENCE', $yyvs[$yyvsp-$c]);</Line>
+   <Line>@{$yyval = []}[cTYPE,cCHILD] = ('SET', $yyvs[$yyvsp-$b]);</Line>
+   <Line>@{$yyval = []}[cTYPE,cCHILD] = ('CHOICE', $yyvs[$yyvsp-$a]);</Line>
+   <Line>@{$yyval = []}[cTYPE] = ('ENUM');</Line>
+   <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$a];</Line>
+   <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$b];</Line>
+   <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$c];</Line>
+   <Line>@{$yyval = []}[cTYPE,cCHILD,cDEFINE] = ('ANY',undef,$yyvs[$yyvsp-$z]);</Line>
+   <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$d];</Line>
+   <Line>{ $yyval = [];</Line>
+   <Line>([,{}]|::=)</Line>
+   <Line>io => [qw(asn_recv asn_send asn_read asn_write asn_get asn_ready)],</Line>
+   <Line>debug => [qw(asn_dump asn_hexdump)],</Line>
+   <Line>ASN_PRIMITIVE ASN_CONSTRUCTOR ASN_LONG_LEN ASN_EXTENSION_ID ASN_BIT)],</Line>
+   <Line>tag => [qw(asn_tag asn_decode_tag asn_decode_tag asn_encode_tag asn_decode_length asn_encode_length)]</Line>
+   <Line>eval { _encode($self->{options}, $self->{script}, $stash, [], $buf) }</Line>
+   <Line>my $me = ref($pkg) ? $pkg : bless [];</Line>
+   <Line>my $me = ref($pkg) ? $pkg : bless [], $pkg;</Line>
+   <Line>bless [], $type;</Line>
+   <Line>$$self{'data'}{'sections'}{'events'} = [];</Line>
+   <Line>$$self{'data'}{'sections'}{'holidays'} = [];</Line>
+   <Line>$$self{'data'}{'sections'}{$sect} = [];</Line>
+   <Line>'date' => [], # the parsed date split</Line>
+   <Line>'offset' => [], # The offset from GMT</Line>
+   <Line>'gmt' => [], # the date converted to GMT</Line>
+   <Line>'loc' => [], # the date converted to local timezone</Line>
+   <Line>$$dmb{'data'}{'holidays'}{'hols'} = [];</Line>
+   <Line>return [];</Line>
+  </Level>
+  <Level>
+   <NewCharacters>PERL: {}()[]&lt;>\# + 0123456789</NewCharacters>
+   <Line>if ($path !~ m|^/[^;\(\)]+|) {</Line>
+   <Line>if ($line =~ m/^tcp:\s+\[(\S+)\]\s+\S+\s+(\S+)\s*$/) {</Line>
+   <Line>my $storage_list = [];</Line>
+   <Line>my $cmd = ['/sbin/vgchange', '-aln', $scfg->{vgname}];</Line>
+   <Line>my $slist = [];</Line>
+   <Line>my $devlist = [];</Line>
+   <Line>while ($tmpl =~ m/([^{]+)?({([^}]+)})?/g) {</Line>
+   <Line>#'et' => [], # Ethopia or Estonia ??</Line>
+   <Line>#'th' => [],</Line>
+   <Line>my $kvmkeymaparray = [];</Line>
+   <Line>return $str ? [ Text::ParseWords::shellwords($str) ] : [];</Line>
+   <Line>my $lines = [];</Line>
+   <Line>my $cmd = ['lvremove', '-f', $di->{snapdev}];</Line>
+   <Line>return [];</Line>
+   <Line>my $res = [];</Line>
+   <Line>$skiplist = [] if !$skiplist;</Line>
+   <Line>my $bklist = [];</Line>
+   <Line>my $tasklist = [];</Line>
+   <Line>$task->{disks} = [];</Line>
+   <Line>my $vollist = [];</Line>
+   <Line>=item B&lt;shell_quote> [I&lt;string>]...</Line>
+   <Line>=item B&lt;shell_quote_best_effort> [I&lt;string>]...</Line>
+   <Line>=item B&lt;shell_comment_quote> [I&lt;string>]</Line>
+   <Line>RFC2732 => qr/[^A-Za-z0-9\-_.!~*'()]/,</Line>
+   <Line>return $1 if $_[0] =~ s,^\\\\([^\\]+),,; # UNC</Line>
+   <Line>return $1 if $_[0] =~ s,^\\\\([^\\]+),,; # UNC</Line>
+   <Line>return $path =~ m,^[a-zA-Z]:, || $path =~ m,^[/\\],;</Line>
+   <Line># gopher://&lt;host>[:&lt;port>]/&lt;gopher-path></Line>
+   <Line>'us' => [qw(www.ACME.gov www.ACME.mil)],</Line>
+   <Line>'gb' => [qw(www.ACME.co.uk www.ACME.org.uk www.ACME.ac.uk)],</Line>
+   <Line>'au' => [qw(www.ACME.com.au www.ACME.org.au www.ACME.edu.au)],</Line>
+   <Line>'il' => [qw(www.ACME.co.il www.ACME.org.il www.ACME.net.il)],</Line>
+   <Line>m,^[a-zA-Z]:[/\\],) # dosish file name</Line>
+   <Line>$reserved = q(;/?:@&amp;=+$,[]);</Line>
+   <Line>$u->query_param($key, []);</Line>
+   <Line>$key =~ s/([;\/?:@&amp;=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg;</Line>
+   <Line>$val =~ s/([;\/?:@&amp;=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg;</Line>
+   <Line>for (@copy) { s/([;\/?:@&amp;=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg; }</Line>
+   <Line>$old =~ s{^\[(.*)\]$}{$1}; # remove brackets around IPv6 (RFC 3986 3.2.2)</Line>
+   <Line>bless [URI::file->new_abs(shift)], $class;</Line>
+   <Line>return eval { $thingy->can( 'as_string' ) } ? $thingy->as_string([]) : $thingy;</Line>
+   <Line>my $self = bless [], $class;</Line>
+   <Line>return [] if $string eq '[]';</Line>
+   <Line>$hash->{$key} = [];</Line>
+   <Line>$lines[-1] .= ' []';</Line>
+   <Line>$string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g;</Line>
+   <Line>$line .= ' []';</Line>
+   <Line>$line .= ' []';</Line>
+   <Line>and mappings, support for the constructs [] (empty sequence) and {}</Line>
+   <Line>--- []</Line>
+  </Level>
+ </Levels>
+</KTouchLecture>
diff --git a/keyboard/ergodox/addons/etc/layout/xkb/symbols.dir.workman b/keyboard/ergodox/addons/etc/layout/xkb/symbols.dir.workman
new file mode 100644 (file)
index 0000000..247cc48
--- /dev/null
@@ -0,0 +1,5 @@
+-dp----- a------- workman(wkm)
+--p----- a------- workman(wco)
+--p----- a------- workman(wcp)
+--p----- a------- workman(wce)
+--p----- a------- workman(wdp)
diff --git a/keyboard/ergodox/addons/etc/layout/xkb/workman b/keyboard/ergodox/addons/etc/layout/xkb/workman
new file mode 100644 (file)
index 0000000..313a4a0
--- /dev/null
@@ -0,0 +1,180 @@
+// workman layouts
+// see http://viralintrospection.wordpress.com/2010/09/06/a-different-philosophy-in-designing-keyboard-layouts/
+
+// xkb keymap prepared by Oleg Kostyuk <cub@cub.org.ua>
+// copyright 2012, bsd license
+
+
+// to use, copy to /usr/share/X11/xkb/symbols/workman and add the following
+// lines to /usr/share/X11/xkb/symbols.dir:
+//
+//     -dp----- a------- workman(wkm)
+//     --p----- a------- workman(wcp)
+//     --p----- a------- workman(wco)
+//     --p----- a------- workman(wdp)
+//
+// then load with, e.g.
+//
+//     setxkbmap workman                            # default layout
+//     setxkbmap -layout workman -variant wdp       # to select other variants
+
+
+default
+partial alphanumeric_keys
+xkb_symbols "wkm" {
+
+    name[Group1] = "The Workman Keyboard Layout";
+
+    include "latin"
+    include "latin(nodeadkeys)"
+
+    name[Group1] = "QFMLWY - full optimization, QWERTY lettermask";
+
+    //              Unmodified  Shift       AltGr                   Shift+AltGr
+    key <AD01> { [ q,          Q,          at,                     Greek_OMEGA          ] };
+    key <AD02> { [ d,          D,          dstroke,                ordfeminine          ] };
+    key <AD03> { [ r,          R,          mu,                     masculine            ] };
+    key <AD04> { [ w,          W,          lstroke,                Lstroke              ] };
+    key <AD05> { [ b,          B,          lstroke,                Lstroke              ] };
+    key <AD06> { [ j,          J,          leftarrow,              yen                  ] };
+    key <AD07> { [ f,          F,          downarrow,              uparrow              ] };
+    key <AD08> { [ u,          U,          oslash,                 Ooblique             ] };
+    key <AD09> { [ p,          P,          rightdoublequotemark,   rightsinglequotemark ] };
+    key <AD10> { [ semicolon,  colon,      rightdoublequotemark,   rightsinglequotemark ] };
+
+    //              Unmodified  Shift       AltGr                   Shift+AltGr
+    key <AC01> { [ a,          A,          eth,                    ETH                  ] };
+    key <AC02> { [ s,          S,          ssharp,                 section              ] };
+    key <AC03> { [ h,          H,          tslash,                 Tslash               ] };
+    key <AC04> { [ t,          T                                                        ] };
+    key <AC05> { [ g,          G,          paragraph,              registered           ] };
+    key <AC06> { [ y,          Y,          rightarrow,             idotless             ] };
+    key <AC07> { [ n,          N,          ae,                     AE                   ] };
+    key <AC08> { [ e,          E,          EuroSign                                     ] };
+    key <AC09> { [ o,          O,          hstroke,                Hstroke              ] };
+    key <AC10> { [ i,          I,          hstroke,                Hstroke              ] };
+
+    //              Unmodified  Shift       AltGr                   Shift+AltGr
+    key <AB01> { [ z,          Z,          guillemotleft,          less                 ] };
+    key <AB02> { [ x,          X,          leftdoublequotemark,    leftsinglequotemark  ] };
+    key <AB03> { [ m,          M,          eng,                    ENG                  ] };
+    key <AB04> { [ c,          C,          cent,                   copyright            ] };
+    key <AB05> { [ v,          V,          guillemotright,         greater              ] };
+    key <AB06> { [ k,          K,          thorn,                  THORN                ] };
+    key <AB07> { [ l,          L,          kra,                    ampersand            ] };
+
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "wco" {
+
+    include "workman(wkm)"
+
+    name[Group1] = "Workman for Programmers, with light modifications from cub@uanic (old)";
+
+    //             Unmodified       Shift           AltGr            Shift+AltGr
+    // symbols row, left side
+    key <TLDE> { [ asciitilde,      grave,          dead_grave                  ]      };
+    key <AE01> { [ exclam,          1,              exclamdown                  ]      };
+    key <AE02> { [ braceleft,       2,              currency                    ]      };
+    key <AE03> { [ numbersign,      3,              cent                        ]      };
+    key <AE04> { [ semicolon,       4,              yen                         ]      };
+    key <AE05> { [ braceright,      5,              EuroSign                    ]      };
+    key <AE06> { [ bracketleft,     6,              sterling                    ]      };
+
+    // symbols row, right side
+    key <AE07> { [ ampersand,       7                                           ]      };
+    key <AE08> { [ asterisk,        8,              onehalf                     ]      };
+    key <AE09> { [ parenleft,       9                                           ]      };
+    key <AE10> { [ parenright,      0                                           ]      };
+    key <AE11> { [ bracketright,    percent                                     ]      };
+    key <AE12> { [ equal,           plus                                        ]      };
+    key <BKSP> { [ BackSpace                                                    ]      };
+
+    // upper row, right side
+    key <AD10> { [ dollar,          at,             dead_acute, dead_doubleacute ]     };
+    key <AD11> { [ colon,           asciicircum,    dead_circumflex, dead_caron  ]     };
+    key <AD12> { [ apostrophe,      quotedbl                                     ]     };
+
+    // home row, right side
+    key <AC11> { [ minus,           underscore,     hyphen                      ]      };
+
+    // lower row, left side
+    key <LSGT> { [ greater,         less,           bar,            brokenbar   ]      };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "wcp" {
+
+    include "workman(wco)"
+
+    name[Group1] = "Workman for Programmers, with light modifications from cub@uanic";
+
+    //             Unmodified       Shift           AltGr            Shift+AltGr
+    // symbols row, left side
+    key <AE01> { [ semicolon,       1,              exclamdown                  ]      };
+    key <AE02> { [ exclam,          2,              currency                    ]      };
+    key <AE04> { [ braceleft,       4,              yen                         ]      };
+
+    // symbols row, right side
+    key <AE07> { [ bracketright,    7                                           ]      };
+    key <AE11> { [ ampersand,       percent                                     ]      };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "wce" {
+
+    include "workman(wcp)"
+
+    name[Group1] = "Workman for Programmers, with light modifications from cub@uanic, for Ergodox";
+
+    //             Unmodified       Shift           AltGr            Shift+AltGr
+    key <BKSL> { [ apostrophe,      quotedbl                                    ]      };
+    key <AE11> { [ asciicircum,     backslash                                   ]      };
+    key <AD11> { [ colon,           percent                                     ]      };
+    key <AC11> { [ minus,           underscore,     hyphen                      ]      };
+    key <AD12> { [ bar,             ampersand                                   ]      };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "wdp" {
+
+    include "workman(wkm)"
+
+    name[Group1] = "Workman for Programmers, with modifications from Dvorak for programmers";
+
+    //             Unmodified       Shift           AltGr            Shift+AltGr
+    // symbols row, left side
+    key <TLDE> { [ asciitilde,      grave,          dead_grave                  ]      };
+    key <AE01> { [ semicolon,       ampersand                                   ]      };
+    key <AE02> { [ bracketleft,     7,              currency                    ]      };
+    key <AE03> { [ braceleft,       5,              cent                        ]      };
+    key <AE04> { [ braceright,      3,              yen                         ]      };
+    key <AE05> { [ parenleft,       1,              EuroSign                    ]      };
+    key <AE06> { [ equal,           9,              sterling                    ]      };
+
+    // symbols row, right side
+    key <AE07> { [ asterisk,        0                                           ]      };
+    key <AE08> { [ parenright,      2,              onehalf                     ]      };
+    key <AE09> { [ plus,            4                                           ]      };
+    key <AE10> { [ bracketright,    6                                           ]      };
+    key <AE11> { [ percent,         8                                           ]      };
+    key <AE12> { [ exclam,          numbersign,     exclamdown                  ]      };
+    key <BKSP> { [ BackSpace                                                    ]      };
+
+    // upper row, right side
+    key <AD10> { [ dollar,          at,             dead_acute, dead_doubleacute ]     };
+    key <AD11> { [ colon,           asciicircum,    dead_circumflex, dead_caron  ]     };
+    key <AD12> { [ apostrophe,      quotedbl                                     ]     };
+
+    // home row, right side
+    key <AC11> { [ minus,           underscore,     hyphen                      ]      };
+
+    // lower row, left side
+    key <LSGT> { [ greater,         less,           bar,            brokenbar   ]      };
+};
+
diff --git a/keyboard/ergodox/config.h b/keyboard/ergodox/config.h
new file mode 100644 (file)
index 0000000..191efa4
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+This work is heavily based on initial firmware for Ergodox keyboard.
+Copyright (c) 2012, 2013 Ben Blazak <benblazak.dev@gmail.com>
+Released under The MIT License (see "doc/licenses/MIT.md")
+Project located at <https://github.com/benblazak/ergodox-firmware>
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0x1307
+#define DEVICE_VER      0x0001
+#define MANUFACTURER    TMK/Cub
+#define PRODUCT         Ergodox
+#define DESCRIPTION     t.m.k. keyboard firmware for Ergodox
+
+#define MATRIX_ROWS 14
+#define MATRIX_COLS 6
+
+#define MOUSEKEY_DELAY          100
+#define MOUSEKEY_INTERVAL       20
+#define MOUSEKEY_MAX_SPEED      3
+#define MOUSEKEY_TIME_TO_MAX    10
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+/*
+ * This constant define not debouncing time in msecs, but amount of matrix
+ * scan loops which should be made to get stable debounced results.
+ *
+ * On Ergodox matrix scan rate is relatively low, because of slow I2C.
+ * Now it's only 317 scans/second, or about 3.15 msec/scan.
+ * According to Cherry specs, debouncing time is 5 msec.
+ *
+ * And so, there is no sense to have DEBOUNCE higher than 2.
+ */
+#define DEBOUNCE        2
+#define TAPPING_TERM    230
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+    keyboard_report->mods == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) || \
+    keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \
+)
+
+
+
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+//#define DEBUG_MATRIX_SCAN_RATE
+
+#endif
diff --git a/keyboard/ergodox/ergodox.c b/keyboard/ergodox/ergodox.c
new file mode 100644 (file)
index 0000000..a88772c
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+This work is heavily based on initial firmware for Ergodox keyboard.
+Copyright (c) 2012, 2013 Ben Blazak <benblazak.dev@gmail.com>
+Released under The MIT License (see "doc/licenses/MIT.md")
+Project located at <https://github.com/benblazak/ergodox-firmware>
+
+Most used files are located at
+<https://github.com/benblazak/ergodox-firmware/tree/partial-rewrite/firmware/keyboard/ergodox/controller>
+
+*/
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+#include "action.h"
+#include "command.h"
+#include "print.h"
+#include "debug.h"
+#include "ergodox.h"
+#include "i2cmaster.h"
+
+bool i2c_initialized = 0;
+uint8_t mcp23018_status = 0x20;
+
+bool ergodox_left_led_1 = 0;  // left top
+bool ergodox_left_led_2 = 0;  // left middle
+bool ergodox_left_led_3 = 0;  // left bottom
+
+
+void init_ergodox(void)
+{
+    // keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md")
+    TCCR1A = 0b10101001;  // set and configure fast PWM
+    TCCR1B = 0b00001001;  // set and configure fast PWM
+
+    // (tied to Vcc for hardware convenience)
+    DDRB  &= ~(1<<4);  // set B(4) as input
+    PORTB &= ~(1<<4);  // set B(4) internal pull-up disabled
+
+    // unused pins - C7, D4, D5, D7, E6
+    // set as input with internal pull-ip enabled
+    DDRC  &= ~(1<<7);
+    DDRD  &= ~(1<<7 | 1<<5 | 1<<4);
+    DDRE  &= ~(1<<6);
+    PORTC |=  (1<<7);
+    PORTD |=  (1<<7 | 1<<5 | 1<<4);
+    PORTE |=  (1<<6);
+}
+
+void ergodox_blink_all_leds(void)
+{
+    ergodox_led_all_off();
+    ergodox_led_all_set(LED_BRIGHTNESS_HI);
+    ergodox_led_all_on();
+    _delay_ms(333);
+    ergodox_led_all_off();
+}
+
+uint8_t init_mcp23018(void) {
+    mcp23018_status = 0x20;
+
+    // I2C subsystem
+    if (i2c_initialized == 0) {
+        i2c_init();  // on pins D(1,0)
+        i2c_initialized++;
+        _delay_ms(1000);
+    }
+
+    // set pin direction
+    // - unused  : input  : 1
+    // - input   : input  : 1
+    // - driving : output : 0
+    mcp23018_status = i2c_start(I2C_ADDR_WRITE);    if (mcp23018_status) goto out;
+    mcp23018_status = i2c_write(IODIRA);            if (mcp23018_status) goto out;
+    mcp23018_status = i2c_write(0b00000000);        if (mcp23018_status) goto out;
+    mcp23018_status = i2c_write(0b00111111);        if (mcp23018_status) goto out;
+    i2c_stop();
+
+    // set pull-up
+    // - unused  : on  : 1
+    // - input   : on  : 1
+    // - driving : off : 0
+    mcp23018_status = i2c_start(I2C_ADDR_WRITE);    if (mcp23018_status) goto out;
+    mcp23018_status = i2c_write(GPPUA);             if (mcp23018_status) goto out;
+    mcp23018_status = i2c_write(0b00000000);        if (mcp23018_status) goto out;
+    mcp23018_status = i2c_write(0b00111111);        if (mcp23018_status) goto out;
+
+out:
+    i2c_stop();
+
+    if (!mcp23018_status) mcp23018_status = ergodox_left_leds_update();
+
+    return mcp23018_status;
+}
+
+uint8_t ergodox_left_leds_update(void) {
+    if (mcp23018_status) { // if there was an error
+        return mcp23018_status;
+    }
+
+    // set logical value (doesn't matter on inputs)
+    // - unused  : hi-Z : 1
+    // - input   : hi-Z : 1
+    // - driving : hi-Z : 1
+    mcp23018_status = i2c_start(I2C_ADDR_WRITE);    if (mcp23018_status) goto out;
+    mcp23018_status = i2c_write(OLATA);             if (mcp23018_status) goto out;
+    mcp23018_status = i2c_write(0b11111111
+            & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
+          );                                        if (mcp23018_status) goto out;
+    mcp23018_status = i2c_write(0b11111111
+            & ~(ergodox_left_led_2<<LEFT_LED_2_SHIFT)
+            & ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT)
+          );                                        if (mcp23018_status) goto out;
+
+out:
+    i2c_stop();
+    return mcp23018_status;
+}
diff --git a/keyboard/ergodox/ergodox.h b/keyboard/ergodox/ergodox.h
new file mode 100644 (file)
index 0000000..67d43c3
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+Copyright (c) 2012, 2013 Ben Blazak <benblazak.dev@gmail.com>
+Released under The MIT License (see "doc/licenses/MIT.md")
+Project located at <https://github.com/benblazak/ergodox-firmware>
+
+Most used files are located at
+<https://github.com/benblazak/ergodox-firmware/tree/partial-rewrite/firmware/keyboard/ergodox/controller>
+
+*/
+
+#ifndef ERGODOX_H
+#define ERGODOX_H
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include "i2cmaster.h"
+
+#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
+#define CPU_16MHz       0x00
+
+// I2C aliases and register addresses (see "mcp23018.md")
+#define I2C_ADDR        0b0100000
+#define I2C_ADDR_WRITE  ( (I2C_ADDR<<1) | I2C_WRITE )
+#define I2C_ADDR_READ   ( (I2C_ADDR<<1) | I2C_READ  )
+#define IODIRA          0x00            // i/o direction register
+#define IODIRB          0x01
+#define GPPUA           0x0C            // GPIO pull-up resistor register
+#define GPPUB           0x0D
+#define GPIOA           0x12            // general purpose i/o port register (write modifies OLAT)
+#define GPIOB           0x13
+#define OLATA           0x14            // output latch register
+#define OLATB           0x15
+
+extern uint8_t mcp23018_status;
+
+void init_ergodox(void);
+void ergodox_blink_all_leds(void);
+uint8_t init_mcp23018(void);
+uint8_t ergodox_left_leds_update(void);
+
+#define LED_BRIGHTNESS_LO       31
+#define LED_BRIGHTNESS_HI       255
+
+#define LEFT_LED_1_SHIFT        7       // in MCP23018 port B
+#define LEFT_LED_2_SHIFT        6       // in MCP23018 port B
+#define LEFT_LED_3_SHIFT        7       // in MCP23018 port A
+
+extern bool ergodox_left_led_1;         // left top
+extern bool ergodox_left_led_2;         // left middle
+extern bool ergodox_left_led_3;         // left bottom
+
+static inline void ergodox_board_led_on(void)      { DDRD |=  (1<<6); PORTD |=  (1<<6); }
+static inline void ergodox_right_led_1_on(void)    { DDRB |=  (1<<5); PORTB |=  (1<<5); }
+static inline void ergodox_right_led_2_on(void)    { DDRB |=  (1<<6); PORTB |=  (1<<6); }
+static inline void ergodox_right_led_3_on(void)    { DDRB |=  (1<<7); PORTB |=  (1<<7); }
+static inline void ergodox_left_led_1_on(void)     { ergodox_left_led_1 = 1; }
+static inline void ergodox_left_led_2_on(void)     { ergodox_left_led_2 = 1; }
+static inline void ergodox_left_led_3_on(void)     { ergodox_left_led_3 = 1; }
+
+static inline void ergodox_board_led_off(void)     { DDRD &= ~(1<<6); PORTD &= ~(1<<6); }
+static inline void ergodox_right_led_1_off(void)   { DDRB &= ~(1<<5); PORTB &= ~(1<<5); }
+static inline void ergodox_right_led_2_off(void)   { DDRB &= ~(1<<6); PORTB &= ~(1<<6); }
+static inline void ergodox_right_led_3_off(void)   { DDRB &= ~(1<<7); PORTB &= ~(1<<7); }
+static inline void ergodox_left_led_1_off(void)    { ergodox_left_led_1 = 0; }
+static inline void ergodox_left_led_2_off(void)    { ergodox_left_led_2 = 0; }
+static inline void ergodox_left_led_3_off(void)    { ergodox_left_led_3 = 0; }
+
+static inline void ergodox_led_all_on(void)
+{
+    ergodox_board_led_on();
+    ergodox_right_led_1_on();
+    ergodox_right_led_2_on();
+    ergodox_right_led_3_on();
+    ergodox_left_led_1_on();
+    ergodox_left_led_2_on();
+    ergodox_left_led_3_on();
+    ergodox_left_leds_update();
+}
+
+static inline void ergodox_led_all_off(void)
+{
+    ergodox_board_led_off();
+    ergodox_right_led_1_off();
+    ergodox_right_led_2_off();
+    ergodox_right_led_3_off();
+    ergodox_left_led_1_off();
+    ergodox_left_led_2_off();
+    ergodox_left_led_3_off();
+    ergodox_left_leds_update();
+}
+
+static inline void ergodox_right_led_1_set(uint8_t n)    { OCR1A = n; }
+static inline void ergodox_right_led_2_set(uint8_t n)    { OCR1B = n; }
+static inline void ergodox_right_led_3_set(uint8_t n)    { OCR1C = n; }
+
+static inline void ergodox_led_all_set(uint8_t n)
+{
+    ergodox_right_led_1_set(n);
+    ergodox_right_led_2_set(n);
+    ergodox_right_led_3_set(n);
+}
+
+#endif
diff --git a/keyboard/ergodox/i2cmaster.h b/keyboard/ergodox/i2cmaster.h
new file mode 100644 (file)
index 0000000..8e5d146
--- /dev/null
@@ -0,0 +1,178 @@
+#ifndef _I2CMASTER_H
+#define _I2CMASTER_H
+/************************************************************************* 
+* Title:    C include file for the I2C master interface 
+*           (i2cmaster.S or twimaster.c)
+* Author:   Peter Fleury <pfleury@gmx.ch>
+* File:     $Id: i2cmaster.h,v 1.12 2015/09/16 09:27:58 peter Exp $
+* Software: AVR-GCC 4.x
+* Target:   any AVR device
+* Usage:    see Doxygen manual
+**************************************************************************/
+
+/**
+ @file
+ @defgroup pfleury_ic2master I2C Master library
+ @code #include <i2cmaster.h> @endcode
+  
+ @brief I2C (TWI) Master Software Library
+
+ Basic routines for communicating with I2C slave devices. This single master 
+ implementation is limited to one bus master on the I2C bus. 
+
+ This I2c library is implemented as a compact assembler software implementation of the I2C protocol 
+ which runs on any AVR (i2cmaster.S) and as a TWI hardware interface for all AVR with built-in TWI hardware (twimaster.c).
+ Since the API for these two implementations is exactly the same, an application can be linked either against the
+ software I2C implementation or the hardware I2C implementation.
+
+ Use 4.7k pull-up resistor on the SDA and SCL pin.
+ Adapt the SCL and SDA port and pin definitions and eventually the delay routine in the module 
+ i2cmaster.S to your target when using the software I2C implementation ! 
+ Adjust the  CPU clock frequence F_CPU in twimaster.c or in the Makfile when using the TWI hardware implementaion.
+
+ @note 
+    The module i2cmaster.S is based on the Atmel Application Note AVR300, corrected and adapted 
+    to GNU assembler and AVR-GCC C call interface.
+    Replaced the incorrect quarter period delays found in AVR300 with 
+    half period delays. 
+    
+ @author Peter Fleury pfleury@gmx.ch  http://tinyurl.com/peterfleury
+ @copyright (C) 2015 Peter Fleury, GNU General Public License Version 3
+ @par API Usage Example
+  The following code shows typical usage of this library, see example test_i2cmaster.c
+
+ @code
+
+ #include <i2cmaster.h>
+
+
+ #define Dev24C02  0xA2      // device address of EEPROM 24C02, see datasheet
+
+ int main(void)
+ {
+     unsigned char ret;
+
+     i2c_init();                             // initialize I2C library
+
+     // write 0x75 to EEPROM address 5 (Byte Write) 
+     i2c_start_wait(Dev24C02+I2C_WRITE);     // set device address and write mode
+     i2c_write(0x05);                        // write address = 5
+     i2c_write(0x75);                        // write value 0x75 to EEPROM
+     i2c_stop();                             // set stop conditon = release bus
+
+
+     // read previously written value back from EEPROM address 5 
+     i2c_start_wait(Dev24C02+I2C_WRITE);     // set device address and write mode
+
+     i2c_write(0x05);                        // write address = 5
+     i2c_rep_start(Dev24C02+I2C_READ);       // set device address and read mode
+
+     ret = i2c_readNak();                    // read one byte from EEPROM
+     i2c_stop();
+
+     for(;;);
+ }
+ @endcode
+
+*/
+
+
+/**@{*/
+
+#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
+#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
+#endif
+
+#include <avr/io.h>
+
+/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */
+#define I2C_READ    1
+
+/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */
+#define I2C_WRITE   0
+
+
+/**
+ @brief initialize the I2C master interace. Need to be called only once 
+ @return none
+ */
+extern void i2c_init(void);
+
+
+/** 
+ @brief Terminates the data transfer and releases the I2C bus 
+ @return none
+ */
+extern void i2c_stop(void);
+
+
+/** 
+ @brief Issues a start condition and sends address and transfer direction 
+  
+ @param    addr address and transfer direction of I2C device
+ @retval   0   device accessible 
+ @retval   1   failed to access device 
+ */
+extern unsigned char i2c_start(unsigned char addr);
+
+
+/**
+ @brief Issues a repeated start condition and sends address and transfer direction 
+
+ @param   addr address and transfer direction of I2C device
+ @retval  0 device accessible
+ @retval  1 failed to access device
+ */
+extern unsigned char i2c_rep_start(unsigned char addr);
+
+
+/**
+ @brief Issues a start condition and sends address and transfer direction 
+   
+ If device is busy, use ack polling to wait until device ready 
+ @param    addr address and transfer direction of I2C device
+ @return   none
+ */
+extern void i2c_start_wait(unsigned char addr);
+
+/**
+ @brief Send one byte to I2C device
+ @param    data  byte to be transfered
+ @retval   0 write successful
+ @retval   1 write failed
+ */
+extern unsigned char i2c_write(unsigned char data);
+
+
+/**
+ @brief    read one byte from the I2C device, request more data from device 
+ @return   byte read from I2C device
+ */
+extern unsigned char i2c_readAck(void);
+
+/**
+ @brief    read one byte from the I2C device, read is followed by a stop condition 
+ @return   byte read from I2C device
+ */
+extern unsigned char i2c_readNak(void);
+
+/** 
+ @brief    read one byte from the I2C device
+ Implemented as a macro, which calls either @ref i2c_readAck or @ref i2c_readNak
+ @param    ack 1 send ack, request more data from device<br>
+               0 send nak, read is followed by a stop condition 
+ @return   byte read from I2C device
+ */
+extern unsigned char i2c_read(unsigned char ack);
+#define i2c_read(ack)  (ack) ? i2c_readAck() : i2c_readNak(); 
+
+
+
+/**@}*/
+#endif
diff --git a/keyboard/ergodox/keymap_blazak.c b/keyboard/ergodox/keymap_blazak.c
new file mode 100644 (file)
index 0000000..233ab04
--- /dev/null
@@ -0,0 +1,186 @@
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+#include <util/delay.h>
+#include "bootloader.h"
+#include "keymap_common.h"
+
+// Aliases for shifted symbols
+// Names from QMK
+#define KC_TILD KC_FN11
+#define KC_EXLM KC_FN12
+#define KC_AT   KC_FN13
+#define KC_HASH KC_FN14
+#define KC_DLR  KC_FN15
+#define KC_PERC KC_FN16
+#define KC_CIRC KC_FN17
+#define KC_AMPR KC_FN18
+#define KC_ASTR KC_FN19
+#define KC_LPRN KC_FN20
+#define KC_RPRN KC_FN21
+#define KC_UNDS KC_FN22
+#define KC_PLUS KC_FN23
+#define KC_LCBR KC_FN24
+#define KC_RCBR KC_FN25
+#define KC_LABK KC_FN26
+#define KC_RABK KC_FN27
+#define KC_COLN KC_FN28
+#define KC_PIPE KC_FN29
+#define KC_QUES KC_FN30
+#define KC_DQT  KC_FN31
+
+const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    KEYMAP(  // layer 0 : default
+        // left hand
+        EQL, 1,   2,   3,   4,   5,   ESC,
+        BSLS,Q,   W,   E,   R,   T,   FN2,
+        TAB, A,   S,   D,   F,   G,
+        LSFT,Z,   X,   C,   V,   B,   FN1,
+        LGUI,GRV, BSLS,LEFT,RGHT,
+                                      LCTL,LALT,
+                                           HOME,
+                                 BSPC,DEL, END,
+        // right hand
+             FN3, 6,   7,   8,   9,   0,   MINS,
+             LBRC,Y,   U,   I,   O,   P,   RBRC,
+                  H,   J,   K,   L,   SCLN,QUOT,
+             FN1, N,   M,   COMM,DOT, SLSH,RSFT,
+                       LEFT,DOWN,UP,  RGHT,RGUI,
+        RALT,RCTL,
+        PGUP,
+        PGDN,ENT, SPC
+    ),
+
+    KEYMAP(  // layer 1 : function and symbol keys
+        // left hand
+        NO,  F1,  F2,  F3,  F4,  F5,  F11,
+        TRNS,LCBR,RCBR,LBRC,RBRC,NO,  FN4,
+        TRNS,SCLN,SLSH,MINS,P0,  COLN,
+        TRNS,P6,  P7,  P8,  P9,  PLUS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             F12, F6,  F7,  F8,  F9,  F10, PWR,
+             TRNS,NO,  MINS,LABK,RABK,DLR ,VOLU,
+                  BSLS,P1,  LPRN,RPRN,PLUS,VOLD,
+             TRNS,ASTR,P2,  P3,  P4,  P5,  MUTE,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    KEYMAP(  // layer 2 : keyboard functions
+        // left hand
+        FN0, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             FN4, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+                  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    KEYMAP(  // layer 3: numpad
+        // left hand
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             TRNS,NLCK,PSLS,PAST,PAST,PMNS,BSPC,
+             TRNS,NO,  P7,  P8,  P9,  PMNS,BSPC,
+                  NO,  P4,  P5,  P6,  PPLS,PENT,
+             TRNS,NO,  P1,  P2,  P3,  PPLS,PENT,
+                       P0,  PDOT,SLSH,PENT,PENT,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+};
+
+/* id for user defined functions */
+enum function_id {
+    TEENSY_KEY,
+};
+
+/*
+ * Fn action definition
+ */
+const action_t PROGMEM fn_actions[] = {
+    ACTION_FUNCTION(TEENSY_KEY),                    // FN0 - Teensy key
+    ACTION_LAYER_MOMENTARY(1),                      // FN1 - switch to Layer1
+    ACTION_LAYER_SET(2, ON_PRESS),                  // FN2 - set Layer2
+    ACTION_LAYER_TOGGLE(3),                         // FN3 - toggle Layer3 aka Numpad layer
+    ACTION_LAYER_SET(0, ON_PRESS),                  // FN4 - set Layer0
+    // Reserved for user actions
+    ACTION_NO,
+    ACTION_NO,
+    ACTION_NO,
+    ACTION_NO,
+    ACTION_NO,
+    ACTION_NO,
+    // Shifted keys
+    ACTION_MODS_KEY(MOD_LSFT, KC_GRV),              // FN11 - ~
+    ACTION_MODS_KEY(MOD_LSFT, KC_1),                // FN12 - !
+    ACTION_MODS_KEY(MOD_LSFT, KC_2),                // FN13 - @
+    ACTION_MODS_KEY(MOD_LSFT, KC_3),                // FN14 - #
+    ACTION_MODS_KEY(MOD_LSFT, KC_4),                // FN15 - $
+    ACTION_MODS_KEY(MOD_LSFT, KC_5),                // FN16 - %
+    ACTION_MODS_KEY(MOD_LSFT, KC_6),                // FN17 - ^
+    ACTION_MODS_KEY(MOD_LSFT, KC_7),                // FN18 - &
+    ACTION_MODS_KEY(MOD_LSFT, KC_8),                // FN19 - *
+    ACTION_MODS_KEY(MOD_LSFT, KC_9),                // FN20 - (
+    ACTION_MODS_KEY(MOD_LSFT, KC_0),                // FN21 - )
+    ACTION_MODS_KEY(MOD_LSFT, KC_MINS),             // FN22 - _
+    ACTION_MODS_KEY(MOD_LSFT, KC_EQL),              // FN23 - +
+    ACTION_MODS_KEY(MOD_LSFT, KC_LBRC),             // FN24 - {
+    ACTION_MODS_KEY(MOD_LSFT, KC_RBRC),             // FN25 - }
+    ACTION_MODS_KEY(MOD_LSFT, KC_COMM),             // FN26 - <
+    ACTION_MODS_KEY(MOD_LSFT, KC_DOT),              // FN27 - >
+    ACTION_MODS_KEY(MOD_LSFT, KC_SCLN),             // FN28 - :
+    ACTION_MODS_KEY(MOD_LSFT, KC_BSLS),             // FN29 - |
+    ACTION_MODS_KEY(MOD_LSFT, KC_SLSH),             // FN30 - ?
+    ACTION_MODS_KEY(MOD_LSFT, KC_QUOT),             // FN31 - "
+};
+
+void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
+{
+    if (id == TEENSY_KEY) {
+        clear_keyboard();
+        print("\n\nJump to bootloader... ");
+        _delay_ms(250);
+        bootloader_jump(); // should not return
+        print("not supported.\n");
+    }
+}
diff --git a/keyboard/ergodox/keymap_colemak.c b/keyboard/ergodox/keymap_colemak.c
new file mode 100644 (file)
index 0000000..bf91d95
--- /dev/null
@@ -0,0 +1,203 @@
+/*
+Copyright 2016 Paul Williamson <squarefrog@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+#include <util/delay.h>
+#include "bootloader.h"
+#include "keymap_common.h"
+
+
+const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+    /*
+     * Keymap 0: Default Colemak Layer
+     *
+     * This is a general purpose Colemak layout which should serve as a good
+     * basis for your own custom layout. Mac users may want to swap the
+     * position of the Alt and GUI keys.
+     *
+     * ,--------------------------------------------------.           ,--------------------------------------------------.
+     * |  Esc   |   1  |   2  |   3  |   4  |   5  |  ~   |           |  -   |   6  |   7  |   8  |   9  |   0  |   +    |
+     * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+     * |  Tab   |   Q  |   W  |   F  |   P  |   G  |  [   |           |  ]   |   J  |   L  |   U  |   Y  |   ;  |   \    |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * | CpsLk  |   A  |   R  |   S  |   T  |   D  |------|           |------|   H  |   N  |   E  |   I  |   O  |   '    |
+     * |--------+------+------+------+------+------| +L2  |           |      |------+------+------+------+------+--------|
+     * | LShift |   Z  |   X  |   C  |   V  |   B  |      |           |      |   K  |   M  |   ,  |   .  |   /  | RShift |
+     * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+     *   | LCtrl| LGui | LAlt | Left | Rght |                                       |  Up  |  Dn  | RAlt | RGui | RCtrl |
+     *   `----------------------------------'                                       `----------------------------------'
+     *                                        ,-------------.       ,-------------.
+     *                                        |CpsLck| Del  |       | PgUp | PgDn |
+     *                                 ,------|------|------|       |------+------+------.
+     *                                 |      |      | LAlt |       | RAlt |      |      |
+     *                                 | BkSp | ~L1  |------|       |------| Enter| Space|
+     *                                 |      |      | LCtrl|       | RCtrl|      |      |
+     *                                 `--------------------'       `--------------------'
+     */
+
+    KEYMAP(
+        // left hand
+        ESC, 1,   2,   3,   4,   5,   GRV,
+        TAB, Q,   W,   F,   P,   G,   LBRC,
+        CAPS,A,   R,   S,   T,   D,
+        LSFT,Z,   X,   C,   V,   B,   FN2,
+        LCTL,LGUI,LALT,LEFT,RGHT,
+                                      CAPS,DEL,
+                                           LALT,
+                                 BSPC,FN1, LCTL,
+        // right hand
+             MINS,6,   7,   8,   9,   0,   EQL,
+             RBRC,J,   L,   U,   Y,   SCLN,BSLS,
+                  H,   N,   E,   I,   O,   QUOT,
+             NO,  K,   M,   COMM,DOT, SLSH,RSFT,
+                       UP,  DOWN,RALT,RGUI,RCTL,
+        PGUP,PGDN,
+        RALT,
+        RCTL,ENT, SPC
+    ),
+
+    /*
+     * Layer 1: Function keys
+     *
+     * This layer contains function keys, and media keys. Additionally, there
+     * are QWERTY-style Vim arrow keys. I could never get used to Colemak's
+     * rearranged Vim arrow placements.
+     *
+     * Most of the non-modifier keys are marked as NO, so it's immediately
+     * obvious if you start typing on a secondary layer.
+     *
+     * ,--------------------------------------------------.           ,--------------------------------------------------.
+     * | Teensy |  F1  |  F2  |  F3  |  F4  |  F5  |  F11 |           |  F12 |  F6  |  F7  |  F8  |  F9  |  F10 |  TRNS  |
+     * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+     * |   TRNS |      |      |      |      |      | TRNS |           | TRNS |      |      |      |      |      |  TRNS  |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * |   TRNS |      |      |      |      |      |------|           |------| Left | Down |  Up  | Right|      |  TRNS  |
+     * |--------+------+------+------+------+------| +L2  |           |      |------+------+------+------+------+--------|
+     * |   TRNS |      |      |      |      |      |      |           |      |      |      |      |      |      |  TRNS  |
+     * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+     *   | TRNS | TRNS | Play |  RW  |  FF  |                                       | Mute | Vol- | Vol+ | TRNS | TRNS |
+     *   `----------------------------------'                                       `----------------------------------'
+     *                                        ,-------------.       ,-------------.
+     *                                        |      |      |       | HOME |  END |
+     *                                 ,------|------|------|       |------+------+------.
+     *                                 |      |      | TRNS |       | TRNS |      |      |
+     *                                 | TRNS |      |------|       |------| TRNS | TRNS |
+     *                                 |      |      | TRNS |       | TRNS |      |      |
+     *                                 `--------------------'       `--------------------'
+     */
+
+    KEYMAP(
+        // left hand
+        FN31,F1,  F2,  F3,  F4,  F5,  F11,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,NO,  NO,  NO,  NO,  NO,
+        TRNS,NO,  NO,  NO,  NO,  NO,  FN2,
+        TRNS,TRNS,MPLY,MPRV,MNXT,
+                                      NO,  NO,
+                                           TRNS,
+                                 TRNS,NO,  TRNS,
+        // right hand
+             F12, F6,  F7,  F8,  F9,  F10, TRNS,
+             TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+                  LEFT,DOWN,UP,  RGHT,NO,  TRNS,
+             NO,  NO,  NO,  NO,  NO,  NO,  TRNS,
+                       MUTE,VOLD,VOLU,TRNS,TRNS,
+        HOME,END,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    /*
+    * Layer 2: Number Pad
+    *
+    * This layer has a number pad for quicker number entry. As with layer 1,
+    * most of the non-modifier keys are marked as NO, so it's immediately
+    * obvious if you start typing on a secondary layer.
+    *
+    * Inspired by Ben Blazak QWERTY num pad.
+    * https://git.io/voIeY
+    *
+    * ,--------------------------------------------------.           ,--------------------------------------------------.
+    * |   ESC  |      |      |      |      |      |      |           |      |      | NmLk |   /  |   *  |   -  | Bkspc  |
+    * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+    * |   TRNS |      |      |      |      |      | TRNS |           | TRNS |      |   7  |   8  |   9  |   +  | Bkspc  |
+    * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+    * |   TRNS |      |      |      |      |      |------|           |------|      |   4  |   5  |   6  |   +  | Enter  |
+    * |--------+------+------+------+------+------|      |           | -L0  |------+------+------+------+------+--------|
+    * |   TRNS |      |      |      |      |      |      |           |      |      |   1  |   2  |   3  | Enter| Enter  |
+    * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+    *   | TRNS | TRNS | LALT |      |      |                                       |   0  |   0  |   .  | Enter| Enter|
+    *   `----------------------------------'                                       `----------------------------------'
+    *                                        ,-------------.       ,-------------.
+    *                                        |      |      |       | TRNS | TRNS |
+    *                                 ,------|------|------|       |------+------+------.
+    *                                 |      |      | TRNS |       | TRNS |      |      |
+    *                                 | Bkspc|      |------|       |------| Enter|      |
+    *                                 |      |      | TRNS |       | TRNS |      |      |
+    *                                 `--------------------'       `--------------------'
+    */
+
+    KEYMAP(
+        // left hand
+        ESC, NO,  NO,  NO,  NO,  NO,  NO,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,NO,  NO,  NO,  NO,  NO,
+        TRNS,NO,  NO,  NO,  NO,  NO,  NO,
+        TRNS,TRNS,LALT,NO,  NO,
+                                      NO,  NO,
+                                           TRNS,
+                                 BSPC,NO,  TRNS,
+        // right hand
+             NO,  NO,  NLCK,SLSH,PAST,PMNS,BSPC,
+             TRNS,NO,  P7,  P8,  P9,  PPLS,BSPC,
+                  NO,  P4,  P5,  P6,  PPLS,PENT,
+             FN0, NO,  P1,  P2,  P3,  PENT,PENT,
+                       P0,  P0,  PDOT,PENT,PENT,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,ENT, TRNS
+    ),
+};
+
+/* id for user defined functions */
+enum function_id {
+    TEENSY_KEY,
+};
+
+/*
+ * Fn action definition
+ */
+const action_t PROGMEM fn_actions[] = {
+    // Layer shifting
+    [0] = ACTION_LAYER_SET(0, ON_PRESS),           // Switch to Layer 0
+    [1] = ACTION_LAYER_MOMENTARY(1),               // Momentarily switch to layer 1
+    [2] = ACTION_LAYER_SET(2, ON_PRESS),           // Switch to Layer 2
+
+    // Teensy
+    [31] = ACTION_FUNCTION(TEENSY_KEY),
+};
+
+void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
+{
+    if (id == TEENSY_KEY) {
+        clear_keyboard();
+        print("\n\nJump to bootloader... ");
+        _delay_ms(250);
+        bootloader_jump(); // should not return
+        print("not supported.\n");
+    }
+}
+
diff --git a/keyboard/ergodox/keymap_common.c b/keyboard/ergodox/keymap_common.c
new file mode 100644 (file)
index 0000000..5bae063
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+Copyright 2016 Mark Sikora <marknsikora@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "keymap_common.h"
+
+/* translates key to keycode */
+__attribute__ ((weak))
+uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
+{
+    return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
+}
+
+/* translates Fn keycode to action */
+__attribute__ ((weak))
+action_t keymap_fn_to_action(uint8_t keycode)
+{
+    return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) };
+}
diff --git a/keyboard/ergodox/keymap_common.h b/keyboard/ergodox/keymap_common.h
new file mode 100644 (file)
index 0000000..39c4d6b
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+Copyright 2016 Mark Sikora <marknsikora@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+#ifndef KEYMAP_COMMON_H
+#define KEYMAP_COMMON_H
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/pgmspace.h>
+#include "keycode.h"
+#include "action.h"
+#include "action_macro.h"
+#include "report.h"
+#include "host.h"
+#include "print.h"
+#include "debug.h"
+#include "keymap.h"
+
+
+extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
+extern const action_t fn_actions[];
+
+
+/* ErgoDox keymap definition macro */
+#define KEYMAP(                                                 \
+                                                                \
+    /* left hand, spatial positions */                          \
+    k00,k01,k02,k03,k04,k05,k06,                                \
+    k10,k11,k12,k13,k14,k15,k16,                                \
+    k20,k21,k22,k23,k24,k25,                                    \
+    k30,k31,k32,k33,k34,k35,k36,                                \
+    k40,k41,k42,k43,k44,                                        \
+                            k55,k56,                            \
+                                k54,                            \
+                        k53,k52,k51,                            \
+                                                                \
+    /* right hand, spatial positions */                         \
+        k07,k08,k09,k0A,k0B,k0C,k0D,                            \
+        k17,k18,k19,k1A,k1B,k1C,k1D,                            \
+            k28,k29,k2A,k2B,k2C,k2D,                            \
+        k37,k38,k39,k3A,k3B,k3C,k3D,                            \
+                k49,k4A,k4B,k4C,k4D,                            \
+    k57,k58,                                                    \
+    k59,                                                        \
+    k5C,k5B,k5A )                                               \
+                                                                \
+   /* matrix positions */                                       \
+   {                                                            \
+    { KC_##k00,KC_##k10,KC_##k20,KC_##k30,KC_##k40,KC_NO   },   \
+    { KC_##k01,KC_##k11,KC_##k21,KC_##k31,KC_##k41,KC_##k51},   \
+    { KC_##k02,KC_##k12,KC_##k22,KC_##k32,KC_##k42,KC_##k52},   \
+    { KC_##k03,KC_##k13,KC_##k23,KC_##k33,KC_##k43,KC_##k53},   \
+    { KC_##k04,KC_##k14,KC_##k24,KC_##k34,KC_##k44,KC_##k54},   \
+    { KC_##k05,KC_##k15,KC_##k25,KC_##k35,KC_NO,   KC_##k55},   \
+    { KC_##k06,KC_##k16,KC_NO,   KC_##k36,KC_NO,   KC_##k56},   \
+                                                                \
+    { KC_##k07,KC_##k17,KC_NO,   KC_##k37,KC_NO,   KC_##k57},   \
+    { KC_##k08,KC_##k18,KC_##k28,KC_##k38,KC_NO,   KC_##k58},   \
+    { KC_##k09,KC_##k19,KC_##k29,KC_##k39,KC_##k49,KC_##k59},   \
+    { KC_##k0A,KC_##k1A,KC_##k2A,KC_##k3A,KC_##k4A,KC_##k5A},   \
+    { KC_##k0B,KC_##k1B,KC_##k2B,KC_##k3B,KC_##k4B,KC_##k5B},   \
+    { KC_##k0C,KC_##k1C,KC_##k2C,KC_##k3C,KC_##k4C,KC_##k5C},   \
+    { KC_##k0D,KC_##k1D,KC_##k2D,KC_##k3D,KC_##k4D,KC_NO   }    \
+   }
+
+#endif
diff --git a/keyboard/ergodox/keymap_cub.c b/keyboard/ergodox/keymap_cub.c
new file mode 100644 (file)
index 0000000..f9ef825
--- /dev/null
@@ -0,0 +1,602 @@
+#include <util/delay.h>
+#include "action_layer.h"
+#include "action_util.h"
+#include "bootloader.h"
+#include "keymap_common.h"
+
+
+const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    /*
+     * Keymap: Default Layer in QWERTY
+     *
+     * ,--------------------------------------------------.           ,--------------------------------------------------.
+     * |   ~    |   1  |   2  |   3  |   4  |   5  |   \  |           |   -  |   6  |   7  |   8  |   9  |   0  |   =    |
+     * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+     * | Tab    |   Q  |   W  |   E  |   R  |   T  | ~L5  |           | ~L6  |   Y  |   U  |   I  |   O  |   P  |   [    |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * | Tab/Shf|   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   ;  |   '    |
+     * |--------+------+------+------+------+------|  L0  |           | ~L7  |------+------+------+------+------+--------|
+     * | LCtrl  |   Z  |   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |   /  |   ]    |
+     * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+     *   | ~L5  | ~L2  | Caps | LAlt | LGui |                                       |  Lft |  Up  |  Dn  | Rght | ~L6  |
+     *   `----------------------------------'                                       `----------------------------------'
+     *                                        ,-------------.       ,-------------.
+     *                                        | +L2  | Home |       | PgUp | Del  |
+     *                                 ,------|------|------|       |------+------+------.
+     *                                 |      |      |  End |       | PgDn |      |      |
+     *                                 | BkSp |  ESC |------|       |------| Enter| Space|
+     *                                 |      |      |  Spc |       | Ins  |      |      |
+     *                                 `--------------------'       `--------------------'
+     *
+     *
+     *
+     ****************************************************************************************************
+     *
+     * Under XOrg, I use my own mapping from QWERTY to "Workman for Programmers"
+     * See XOrg files in ./addons/ subdirectory.
+     *
+     * I have to do so, because of two things:
+     * 1) my native language is Russian, and XOrg keymap for it is based on QWERTY layout
+     * 2) I want to have non-standart shifted keys, like $ (as normal) and @ (as shifted), or _ and -
+     *
+     * And even if (2) could be solved using FN* keys (but there is limit in firmware for only 32 such
+     * keys), then (1) can't be solved at firmware level at all.
+     *
+     * So, I have to stick with QWERTY as my main layout + my own XOrg keyboard layout for English.
+     * But sometimes I have to input something when XOrg is not active - for example, in Linux console,
+     * or in firmware console (while debugging firmware), or when keyboard is connected to not my computer.
+     *
+     * For such cases I have Layer1 :)
+     * // hint: switch to Layer1 is only at Layer6
+     *
+     ****************************************************************************************************
+     *
+     *
+     *
+     * Keymap: Default Layer in Workman
+     *
+     * ,--------------------------------------------------.           ,--------------------------------------------------.
+     * |  ~     |   ;  |   !  |   #  |   {  |   }  |   '  |           |   ^  |   [  |   ]  |   *  |   (  |   )  |   =    |
+     * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+     * | Tab    |   Q  |   D  |   R  |   W  |   B  |  NO  |           | ~L7  |   J  |   F  |   U  |   P  |   $  |   :    |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * | Tab/Shf|   A  |   S  |   H  |   T  |   G  |------|           |------|   Y  |   N  |   E  |   O  |   I  |   -    |
+     * |--------+------+------+------+------+------| Home |           | End  |------+------+------+------+------+--------|
+     * | LCtrl  |   Z  |   X  |   M  |   C  |   V  |      |           |      |   K  |   L  |   ,  |   .  |   /  |   |    |
+     * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+     *   | ~L5  | ~L2  | Caps | LAlt | LGui |                                       |  Lft |  Up  |  Dn  | Rght | ~L6  |
+     *   `----------------------------------'                                       `----------------------------------'
+     *                                        ,-------------.       ,-------------.
+     *                                        |  L0  |  +L2 |       | PgUp | Del  |
+     *                                 ,------|------|------|       |------+------+------.
+     *                                 |      |      |  NO  |       | PgDn |      |      |
+     *                                 | BkSp |  ESC |------|       |------| Enter| Space|
+     *                                 |      |      |  Spc |       | Ins  |      |      |
+     *                                 `--------------------'       `--------------------'
+     *
+     * Keymap: Default Layer in Workman / with Shift
+     *
+     * ,--------------------------------------------------.           ,--------------------------------------------------.
+     * |  `     |   1  |   2  |   3  |   4  |   5  |   "  |           |   \  |   6  |   7  |   8  |   9  |   0  |   +    |
+     * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+     * | Tab    |   Q  |   D  |   R  |   W  |   B  |  NO  |           | ~L7  |   J  |   F  |   U  |   P  |   @  |   %    |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * | Tab/Shf|   A  |   S  |   H  |   T  |   G  |------|           |------|   Y  |   N  |   E  |   O  |   I  |   _    |
+     * |--------+------+------+------+------+------| Home |           | End  |------+------+------+------+------+--------|
+     * | LCtrl  |   Z  |   X  |   M  |   C  |   V  |      |           |      |   K  |   L  |   ,  |   .  |   /  |   &    |
+     * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+     *   | ~L5  | ~L2  | Caps | LAlt | LGui |                                       |  Lft |  Up  |  Dn  | Rght | ~L6  |
+     *   `----------------------------------'                                       `----------------------------------'
+     *                                        ,-------------.       ,-------------.
+     *                                        |  L0  |  +L2 |       | PgUp | Del  |
+     *                                 ,------|------|------|       |------+------+------.
+     *                                 |      |      |  NO  |       | PgDn |      |      |
+     *                                 | BkSp |  ESC |------|       |------| Enter| Space|
+     *                                 |      |      |  Spc |       | Ins  |      |      |
+     *                                 `--------------------'       `--------------------'
+     *
+     */
+
+    KEYMAP(  // Layer0: default, leftled:none
+        // left hand
+        GRV, 1,   2,   3,   4,   5,   BSLS,
+        FN2, Q,   W,   E,   R,   T,   FN23,
+        FN11,FN28,FN29,FN30,FN31,G,
+        FN12,FN24,FN25,FN26,FN27,B,   HOME,
+        FN21,FN20,CAPS,FN13,FN14,
+                                      FN17,FN19,
+                                           NO,
+                                 FN5, FN6, FN7,
+        // right hand
+             MINS,6,   7,   8,   9,   0,   EQL,
+             FN23,Y,   U,   I,   O,   P,   LBRC,
+                  H,   J,   K,   L,   SCLN,FN15,
+             END, N,   M,   COMM,DOT, SLSH,FN16,
+                       LEFT,UP,  DOWN,RGHT,FN22,
+        PGUP,DEL,
+        PGDN,
+        FN8, FN9, FN10
+    ),
+
+    KEYMAP(  // Layer1: Workman layout, leftled:all
+        // left hand
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,Q,   D,   R,   W,   B,   TRNS,
+        TRNS,A,   S,   H,   T,   G,
+        TRNS,Z,   X,   M,   C,   V,   TRNS,
+        TRNS,TRNS,FN17,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,J,   F,   U,   P,   4,   TRNS,
+                  Y,   N,   E,   O,   I,   TRNS,
+             TRNS,K,   L,   TRNS,TRNS,TRNS,TRNS,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    KEYMAP(  // Layer2: numpad, leftled:mid/blue
+        // left hand
+        TRNS,NO,  NO,  NO,  NO,  PAUS,PSCR,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,NO,  NO,  NO,  TRNS,NO,
+        TRNS,NO,  NO,  NO,  TRNS,NO,  TRNS,
+        TRNS,TRNS,FN17,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             SLCK,NLCK,PSLS,PAST,PAST,PMNS,BSPC,
+             TRNS,NO,  P7,  P8,  P9,  PMNS,PGUP,
+                  NO,  P4,  P5,  P6,  PPLS,PGDN,
+             TRNS,NO,  P1,  P2,  P3,  PPLS,PENT,
+                       P0,  PDOT,SLSH,PENT,PENT,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    KEYMAP(  // Layer3: F-keys + PgUp/PgDn on right hand, leftled:bot/green
+        // left hand
+        TRNS,NO,  NO,  NO,  NO,  NO,  NO,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,NO,  TRNS,NO,  NO,  NO,
+        TRNS,NO,  TRNS,NO,  NO,  NO,  TRNS,
+        TRNS,TRNS,TRNS,LALT,LGUI,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 LCTL,LSFT,TRNS,
+        // right hand
+             NO,  NO,  NO,  NO,  NO,  NO,  TRNS,
+             TRNS,NO,  F1,  F2,  F3,  F4,  PGUP,
+                  NO,  F5,  F6,  F7,  F8,  PGDN,
+             TRNS,NO,  F9,  F10, F11, F12, APP,
+                       RGUI,RALT,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,RSFT,RCTL
+    ),
+
+    KEYMAP(  // Layer4: unconvenient keys on right hand, leftled:top/white
+        // left hand
+        TRNS,NO,  NO,  NO,  NO,  NO,  NO,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,TRNS,NO,  NO,  NO,  NO,
+        TRNS,TRNS,NO,  NO,  NO,  NO,  TRNS,
+        TRNS,TRNS,TRNS,LALT,LGUI,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+
+        /* in Workman right hand will be:
+                { } ( ) +
+              ^ ! ?     =
+              ' ! $ " ; \
+              # [ < > ] \
+        */
+
+        // right hand
+             NO,  NO,  4,   5,   9,   0,   PPLS,
+             TRNS,MINS,2,   FN5, 9,   0,   EQL,
+                  BSLS,2,   P,   FN1, 1,   FN2,
+             TRNS,3,   6,   FN3, FN4, 7,   FN2,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    KEYMAP(  // Layer5: F-keys instead of numbers, leftled:top/white
+        // left hand
+        TRNS,F1,  F2,  F3,  F4,  F5,  F6,
+        TRNS,P1,  P2,  P3,  P4,  P5,  TRNS,
+        TRNS,TRNS,TRNS,E,   TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             F7,  F8,  F9,  F10, F11, F12, TRNS,
+             TRNS,P6,  P7,  P8,  P9,  P0,  TRNS,
+                  TRNS,U,   TRNS,TRNS,TRNS,TRNS,
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    KEYMAP(  // Layer6: F-keys + utils(Teensy, Workman-layer switch), leftled:top/white+onboard
+        // left hand
+        FN0, F1,  F2,  F3,  F4,  F5,  F6,
+        TRNS,P1,  P2,  P3,  P4,  P5,  TRNS,
+        TRNS,TRNS,TRNS,E,   TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        FN18,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             F7,  F8,  F9,  F10, F11, F12, FN0,
+             TRNS,P6,  P7,  P8,  P9,  P0,  TRNS,
+                  TRNS,U,   TRNS,TRNS,TRNS,TRNS,
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    //
+    // rarely used
+    //
+
+    KEYMAP(  // Layer7: F-keys only, leftled:top/white
+        // left hand
+        FN0, NO,  NO,  NO,  NO,  NO,  NO,
+        FN1, F13, F14, F15, F16, NO,  TRNS,
+        TRNS,F17, F18, F19, F20, NO,
+        TRNS,F21, F22, F23, F24, NO,  TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             NO,  NO,  NO,  NO,  NO,  NO,  TRNS,
+             TRNS,NO,  F1,  F2,  F3,  F4,  TRNS,
+                  NO,  F5,  F6,  F7,  F8,  TRNS,
+             TRNS,NO,  F9,  F10, F11, F12, TRNS,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        SLEP,TRNS,TRNS
+    ),
+
+    KEYMAP(  // Layer8: mouse and navigation, leftled:mid/blue+bot/green
+        // left hand
+        TRNS,NO,  NO,  NO,  NO,  NO,  NO,
+        TRNS,NO,  NO,  NO,  ACL0,NO,  TRNS,
+        TRNS,NO,  NO,  TRNS,ACL1,NO,
+        TRNS,NO,  NO,  TRNS,ACL2,NO,  TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+
+        // right hand
+             F16, MPLY,MPRV,MNXT,VOLD,VOLU,MUTE,
+             F14, BTN2,WH_L,WH_U,WH_D,WH_R,PGUP,
+                  BTN1,MS_L,MS_U,MS_D,MS_R,PGDN,
+             F15, BTN3,HOME,END, DEL, INS, NO,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    KEYMAP(  // Layer9: application-specific shortcuts (mostly browser), leftled:top/white+bot/green
+        // left hand
+        TRNS,NO,  NO,  NO,  NO,  NO,  NO,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,NO,  NO,  NO,  NO,  NO,
+        TRNS,NO,  NO,  NO,  TRNS,NO,  TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             NO,  NO,  NO,  NO,  NO,  NO,  TRNS,
+             TRNS,NO,  FN12,FN13,FN14,FN15,FN10,
+                  FN1, FN2, FN3, FN4, FN5, FN11,
+             TRNS,TRNS,FN6, FN7, FN8, FN9, FN0,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+/*
+    // templates to copy from
+
+    KEYMAP(  // LayerN: transparent on edges + hard-defined thumb keys, all others are empty
+        // left hand
+        TRNS,NO,  NO,  NO,  NO,  NO,  NO,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,NO,  NO,  NO,  NO,  NO,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,TRNS,TRNS,LALT,LGUI,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 LCTL,LSFT,TRNS,
+        // right hand
+             NO,  NO,  NO,  NO,  NO,  NO,  TRNS,
+             TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+                  NO,  NO,  NO,  NO,  NO,  TRNS,
+             TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+                       RGUI,RALT,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,RSFT,RCTL
+    ),
+    KEYMAP(  // LayerN: fully transparent
+        // left hand
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+                  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+*/
+
+};
+
+/* id for user defined functions & macros */
+enum function_id {
+    TEENSY_KEY,
+    CUSTOM_KEY,
+    L_CTRL_ALT_ENT,
+    R_CTRL_ALT_ENT,
+};
+
+enum macro_id {
+    XMONAD_RESET,
+    PASSWORD1,
+    PASSWORD2,
+    PASSWORD3,
+};
+
+/*
+ * Fn action definition
+ */
+const action_t PROGMEM fn_actions[] = {
+    [0] =   ACTION_FUNCTION(TEENSY_KEY),                    // FN0  - Teensy key
+
+    [1] =   ACTION_MODS_KEY(MOD_LSFT, KC_BSLS),             // FN1  = Shifted BackSlash // " in Workman
+    [2] =   ACTION_MODS_KEY(MOD_LSFT, KC_MINS),             // FN2  = Shifted Minus     // \ in Workman
+    [3] =   ACTION_MODS_KEY(MOD_LSFT, KC_COMM),             // FN3  = Shifted comma     // < in Workman
+    [4] =   ACTION_MODS_KEY(MOD_LSFT, KC_DOT),              // FN4  = Shifted dot       // > in Workman
+
+    [5] =   ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPC),         // FN5  = LShift with tap BackSpace
+    [6] =   ACTION_MODS_TAP_KEY(MOD_LSFT, KC_DEL),          // FN6  = LCtrl  with tap Delete
+    [7] =   ACTION_MODS_TAP_KEY(MOD_LALT, KC_ESC),          // FN7  = LAlt   with tap Escape
+    [8] =   ACTION_MODS_TAP_KEY(MOD_RGUI, KC_INS),          // FN8  = RGui   with tap Ins
+    [9] =   ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT),          // FN9  = RShift with tap Enter
+    [10] =  ACTION_MODS_TAP_KEY(MOD_RCTL, KC_SPC),          // FN10 = RCtrl  with tap Space
+
+    [11] =  ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB),          // FN11 = LShift with tap Tab
+    [12] =  ACTION_MODS_TAP_KEY(MOD_LCTL, KC_GRV),          // FN12 = LCtrl  with tap Tilda
+    [13] =  ACTION_MODS_TAP_KEY(MOD_LALT, KC_SPC),          // FN13 = LAlt   with tap Space
+    [14] =  ACTION_MODS_TAP_KEY(MOD_LGUI, KC_ESC),          // FN14 = LGui   with tap Escape
+    [15] =  ACTION_MODS_TAP_KEY(MOD_RSFT, KC_QUOT),         // FN15 = RShift with tap quotes
+    [16] =  ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RBRC),         // FN16 = RCtrl  with tap ]
+
+    [17] =  ACTION_LAYER_SET(0, ON_BOTH),                   // FN17 - set Layer0
+    [18] =  ACTION_LAYER_SET(1, ON_BOTH),                   // FN18 - set Layer1, to use Workman layout at firmware level
+    [19] =  ACTION_LAYER_SET(2, ON_BOTH),                   // FN19 - set Layer2, to use with Numpad keys
+
+    [21] =  ACTION_FUNCTION_TAP(L_CTRL_ALT_ENT),            // FN21 - momentary Layer5+CTRL+ALT on Enter, to use with F* keys on top row
+    [22] =  ACTION_FUNCTION_TAP(R_CTRL_ALT_ENT),            // FN22 - momentary Layer6+CTRL+ALT on Enter, to use with F* keys on top row + utils
+
+    [28] =  ACTION_LAYER_TAP_KEY(4, KC_A),                  // FN28 = momentary Layer4 on A key, to use with unconvenient keys
+    [29] =  ACTION_LAYER_TAP_KEY(3, KC_S),                  // FN29 = momentary Layer3 on S key, to use with F* keys
+    [30] =  ACTION_LAYER_TAP_KEY(8, KC_D),                  // FN30 = momentary Layer8 on D key, to use with mouse and navigation keys
+    [31] =  ACTION_LAYER_TAP_KEY(2, KC_F),                  // FN31 = momentary Layer2 on F key, to use with Numpad keys
+
+    // i'd like to remove this - will try to get used to live without this and convert them to usual keys
+    [20] =  ACTION_LAYER_MOMENTARY(2),                      // FN20 - momentary Layer2, to use with Numpad keys
+// or
+//  [20] =  ACTION_FUNCTION_TAP(CUSTOM_KEY),                // FN20 - use custom key, with tapping support
+
+    [23] =  ACTION_LAYER_TAP_KEY(7, KC_BSLS),               // FN23 - momentary Layer7 on ' , to use with F* keys (F1-F24)
+
+    [24] =  ACTION_LAYER_TAP_KEY(4, KC_Z),                  // FN24 = momentary Layer4 on Z key, to use with unconvenient keys
+    [25] =  ACTION_LAYER_TAP_KEY(3, KC_X),                  // FN25 = momentary Layer3 on X key, to use with F* keys
+    [26] =  ACTION_LAYER_TAP_KEY(8, KC_C),                  // FN26 = momentary Layer8 on C key, to use with mouse and navigation keys
+    [27] =  ACTION_LAYER_TAP_KEY(9, KC_V),                  // FN27 = momentary Layer9 on V key, to use with application-specific shortcuts
+};
+
+const action_t PROGMEM fn_actions_4[] = {
+    [1]  =  ACTION_MODS_KEY(MOD_LSFT, KC_BSLS),             // FN1  = Shifted BackSlash // " in Workman
+    [2]  =  ACTION_MODS_KEY(MOD_LSFT, KC_MINS),             // FN2  = Shifted Minus     // \ in Workman
+    [3]  =  ACTION_MODS_KEY(MOD_LSFT, KC_COMM),             // FN3  = Shifted comma     // < in Workman
+    [4]  =  ACTION_MODS_KEY(MOD_LSFT, KC_DOT),              // FN4  = Shifted dot       // > in Workman
+    [5]  =  ACTION_MODS_KEY(MOD_LSFT, KC_SLSH),             // FN5  = Shifted slash     // ? in Workman
+};
+
+const action_t PROGMEM fn_actions_7[] = {
+    [0]  =  ACTION_MACRO(XMONAD_RESET),                     // FN0  = xmonad-reanimator
+    [1]  =  ACTION_MACRO(PASSWORD1),                        // FN1  = default password
+    [2]  =  ACTION_MACRO(PASSWORD1),                        // FN2  = other password
+    [3]  =  ACTION_MACRO(PASSWORD1),                        // FN3  = mega password
+};
+
+const action_t PROGMEM fn_actions_9[] = {
+    [0]  =  ACTION_MODS_KEY(MOD_LCTL,          KC_P0),      // FN0  = Ctrl+0
+    [1]  =  ACTION_MODS_KEY(MOD_LALT,          KC_P1),      // FN1  = Alt+1
+    [2]  =  ACTION_MODS_KEY(MOD_LALT,          KC_P2),      // FN2  = Alt+2
+    [3]  =  ACTION_MODS_KEY(MOD_LALT,          KC_P3),      // FN3  = Alt+3
+    [4]  =  ACTION_MODS_KEY(MOD_LALT,          KC_P4),      // FN4  = Alt+4
+    [5]  =  ACTION_MODS_KEY(MOD_LALT,          KC_P5),      // FN5  = Alt+5
+    [6]  =  ACTION_MODS_KEY(MOD_LALT,          KC_P6),      // FN6  = Alt+6
+    [7]  =  ACTION_MODS_KEY(MOD_LALT,          KC_P7),      // FN7  = Alt+7
+    [8]  =  ACTION_MODS_KEY(MOD_LALT,          KC_P8),      // FN8  = Alt+8
+    [9]  =  ACTION_MODS_KEY(MOD_LALT,          KC_P9),      // FN9  = Alt+9
+    [10] =  ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_TAB),     // FN10 = Ctrl+Shift+Tab
+    [11] =  ACTION_MODS_KEY(MOD_LCTL,          KC_TAB),     // FN11 = Ctrl+Tab
+    [12] =  ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_PGUP),    // FN12 = Ctrl+Shift+PgUp
+    [13] =  ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_PGDN),    // FN13 = Ctrl+Shift+PgDn
+    [14] =  ACTION_MODS_KEY(MOD_LCTL,          KC_PMNS),    // FN14 = Ctrl+Pad Minus
+    [15] =  ACTION_MODS_KEY(MOD_LCTL,          KC_PPLS),    // FN15 = Ctrl+Pad Plus
+};
+
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+    // print("action_function called\n");
+    // print("id  = "); phex(id); print("\n");
+    // print("opt = "); phex(opt); print("\n");
+
+    if (id == TEENSY_KEY) {
+        clear_keyboard();
+        print("\n\nJump to bootloader... ");
+        _delay_ms(50);
+        bootloader_jump(); // should not return
+        print("not supported.\n");
+    }
+
+    if (id == L_CTRL_ALT_ENT || id == R_CTRL_ALT_ENT) {
+        if (record->tap.count == 0 || record->tap.interrupted) {
+            uint8_t weak_mods;
+            uint8_t layer;
+
+            if (id == L_CTRL_ALT_ENT) {
+                weak_mods = MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT);
+                layer     = 5;
+            } else {
+                weak_mods = MOD_BIT(KC_RCTL) | MOD_BIT(KC_RALT);
+                layer     = 6;
+            }
+
+            if (record->event.pressed) {
+                layer_on(layer);
+                add_weak_mods(weak_mods);
+            } else {
+                del_weak_mods(weak_mods);
+                layer_off(layer);
+            }
+        } else {
+            if (record->event.pressed) {
+                add_key(KC_ENT);
+                send_keyboard_report();
+            } else {
+                del_key(KC_ENT);
+                send_keyboard_report();
+            }
+        }
+    }
+
+
+/*
+ * just an example of custom key implementation
+ * not really needed with custom keymap_fn_to_action(),
+ * because it will allow you to have 32 FN** keys on EACH layer
+ */
+
+/*
+    keyevent_t event = record->event;
+
+    if (id == CUSTOM_KEY) {
+        uint8_t layer = biton32(layer_state);
+        uint8_t col = event.key.col;
+        uint8_t row = event.key.row;
+        uint8_t handled = 0;
+
+        if (event.pressed) {
+            if (layer == XXX && col == XXX && row == XXX) {
+                    action_macro_play(
+                        MACRO(
+                            ...........
+                        END)
+                    );
+                    handled++;
+                }
+            }
+        }
+
+        if (!handled) {
+            print("custom key not handled");
+            print(": layer "); pdec(layer);
+            print(", col "); pdec(col);
+            print(", row "); pdec(row);
+            print("\n");
+        }
+    }
+*/
+
+}
+
+#include "keymap_passwords.h"
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
+    if (record->event.pressed) {
+        switch (id) {
+            case XMONAD_RESET:  return MACRO_XMONAD_RESET;
+            case PASSWORD1:     return MACRO_PASSWORD1;
+        }
+    }
+    return MACRO_NONE;
+}
+
+#define FN_ACTIONS_SIZE     (sizeof(fn_actions)   / sizeof(fn_actions[0]))
+#define FN_ACTIONS_4_SIZE   (sizeof(fn_actions_4) / sizeof(fn_actions_4[0]))
+#define FN_ACTIONS_7_SIZE   (sizeof(fn_actions_7) / sizeof(fn_actions_7[0]))
+#define FN_ACTIONS_9_SIZE   (sizeof(fn_actions_9) / sizeof(fn_actions_9[0]))
+
+/*
+ * translates Fn keycode to action
+ * for some layers, use different translation table
+ */
+action_t keymap_fn_to_action(uint8_t keycode)
+{
+    uint8_t layer = biton32(layer_state);
+
+    action_t action;
+    action.code = ACTION_NO;
+
+    if (layer == 4 && FN_INDEX(keycode) < FN_ACTIONS_4_SIZE) {
+        action.code = pgm_read_word(&fn_actions_4[FN_INDEX(keycode)]);
+    }
+
+    if (layer == 7 && FN_INDEX(keycode) < FN_ACTIONS_7_SIZE) {
+        action.code = pgm_read_word(&fn_actions_7[FN_INDEX(keycode)]);
+    }
+
+    if (layer == 9 && FN_INDEX(keycode) < FN_ACTIONS_9_SIZE) {
+        action.code = pgm_read_word(&fn_actions_9[FN_INDEX(keycode)]);
+    }
+
+    // by default, use fn_actions from default layer 0
+    // this is needed to get mapping for same key, that was used switch to some layer,
+    // to have possibility to switch layers back
+    if (action.code == ACTION_NO && FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
+        action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
+    }
+
+    return action;
+}
+
diff --git a/keyboard/ergodox/keymap_dvorak.c b/keyboard/ergodox/keymap_dvorak.c
new file mode 100644 (file)
index 0000000..e64378c
--- /dev/null
@@ -0,0 +1,232 @@
+#include "bootloader.h"
+#include "keymap_common.h"
+
+const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    /*
+     * Keymap: Default Layer in Dvorak (Layer 0)
+     *
+     * ,--------------------------------------------------.           ,--------------------------------------------------.
+     * |   +    |   1  |   2  |   3  |   4  |   5  |  Esc |           |  ESC |   6  |   7  |   8  |   9  |   0  |   -    |
+     * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+     * | Tab    |   '  |   ,  |   .  |   Y  |   Y  |(Null)|           |(Null)|   F  |   G  |   C  |   R  |   L  |   /    |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * | CapsLk |   A  |   O  |   E  |   U  |   I  |------|           |------|   D  |   H  |   T  |   N  |   S  |   \    |
+     * |--------+------+------+------+------+------| FN1  |           | FN2  |------+------+------+------+------+--------|
+     * | LShift |   Z  |   X  |   C  |   V  |   X  |      |           |      |   B  |   M  |   W  |   V  |   Z  | RShift |
+     * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+     *   | LGUI |   `  |  INS | Left | Rght |                                       |  Up  |  Dn  |   [  |   ]  | RGUI |
+     *   `----------------------------------'                                       `----------------------------------'
+     *                                        ,-------------.       ,-------------.
+     *                                        | LCtr | LAlt |       | Ralt | RCtr |
+     *                                 ,------|------|------|       |------+------+------.
+     *                                 |      |      | Home |       | PgUp |      |      |
+     *                                 | BkSp | Del  |------|       |------| Enter| Space|
+     *                                 |      |      | End  |       | PgDn |      |      |
+     *                                 `--------------------'       `--------------------'
+     *
+     *
+     *****************************************************************************************************
+     * This Dvorak keyboard layout stems from my early Kinesis years, using the Contour PS/2 with a Dvorak
+     * software layout. Because of this, the RBRC and LBRC were on opposite sides of the board in the cor-
+     * ner keys. I've decided to continue using this layout with my ErgoDox.
+     */
+
+    KEYMAP(  // layer 0 : default
+        // left hand
+        EQL,    1,    2,   3,   4,   5,   ESC,
+        TAB, QUOT, COMM, DOT,   P,   Y,    NO,
+        CAPS,   A,    O,   E,   U,   I,
+        LSFT, SCLN,   Q,   J,   K,   X,   FN1,
+        LGUI,  GRV, INS,LEFT,RGHT,
+                                      LCTL,LALT,
+                                           HOME,
+                                 BSPC,DEL, END,
+        // right hand
+             ESC,  6,   7,   8,   9,   0,  MINS,
+             NO,   F,   G,   C,   R,   L,  SLSH,
+                   D,   H,   T,   N,   S,  BSLS,
+             FN2,  B,   M,   W,   V,   Z,  RSFT,
+                        UP,DOWN,RBRC,LBRC,  RGUI,
+        RALT,RCTL,
+        PGUP,
+        PGDN,ENT, SPC
+    ),
+
+
+    /* 
+     * Keymap: Function and Media Keys Layer (Layer 1)
+     * 
+     * ,--------------------------------------------------.           ,--------------------------------------------------.
+     * | TEENSY |  F1  |  F2  |  F3  |  F4  |  F5  | F11  |           |  F12 |  F6  |  F7  |  F8  |  F9  |  F10 |  Mute  |
+     * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+     * |        |      |      |      |      |      | FN4  |           |  FN6 |      | PrSc | ScLk | Paus |      | Vol Up |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * |        |      |      |      |      |      |------|           |------| Stop | Prev | Play | Next | Sel  | Vol Dn |
+     * |--------+------+------+------+------+------| FN4  |           |  FN7 |------+------+------+------+------+--------|
+     * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+     * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+     *   |      |      |      |      |      |                                       |      |      |      |      |      |
+     *   `----------------------------------'                                       `----------------------------------'
+     *                                        ,-------------.       ,-------------.
+     *                                        |      |      |       |      |      |
+     *                                 ,------|------|------|       |------+------+------.
+     *                                 |      |      |      |       |      |      |      |
+     *                                 |      |      |------|       |------|      |      |
+     *                                 |      |      |      |       |      |      |      |
+     *                                 `--------------------'       `--------------------'
+     * 
+     * 
+     */
+
+    KEYMAP(  // layer 1 : function and media keys
+        // left hand
+        FN0, F1,  F2,  F3,  F4,  F5,  F11,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN4,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN4,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             F12, F6,  F7,  F8,  F9,  F10, MUTE,
+             FN6, TRNS,PSCR,SLCK,PAUS,TRNS,VOLU,
+                  MSTP,MPRV,MPLY,MNXT,MSEL,VOLD,
+             FN7, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+
+    /* 
+     * Keymap: Numpad Layer (Layer 2)
+     * 
+     * ,--------------------------------------------------.           ,--------------------------------------------------.
+     * | Power  |      |      |      |      |      |      |           |      |      | NmLk | KP / | KP * | KP - |        |
+     * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+     * | Sleep  |      |      |      |      |      | FN5  |           |  FN4 |      | KP 7 | KP 8 | KP 9 | KP + |        |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * | Wake   |      |      |      |      |      |------|           |------|      | KP 4 | KP 5 | KP 6 | KP + |        |
+     * |--------+------+------+------+------+------| FN7  |           |  FN4 |------+------+------+------+------+--------|
+     * |        |      |      |      |      |      |      |           |      |      | KP 1 | KP 2 | KP 3 |KP Ent|        |
+     * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+     *   |      |      |      |      |      |                                       | KP 0 |      | KP . |KP Ent|      |
+     *   `----------------------------------'                                       `----------------------------------'
+     *                                        ,-------------.       ,-------------.
+     *                                        |      |      |       |      |      |
+     *                                 ,------|------|------|       |------+------+------.
+     *                                 |      |      |      |       |      |      |      |
+     *                                 |      |      |------|       |------|      |      |
+     *                                 |      |      |      |       |      |      |      |
+     *                                 `--------------------'       `--------------------'
+     * 
+     */
+
+    KEYMAP(  // layer 2: numpad
+        // left hand
+        PWR, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        SLEP,TRNS,TRNS,TRNS,TRNS,TRNS, FN5,
+        WAKE,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, FN7,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             TRNS,TRNS,NLCK,PSLS,PAST,PMNS,TRNS,
+              FN4,NO,  P7,  P8,  P9,  PPLS,TRNS,
+                  NO,  P4,  P5,  P6,  PPLS,TRNS,
+              FN4,NO,  P1,  P2,  P3,  PENT,TRNS,
+                       P0,  TRNS,PDOT,PENT,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+
+    /* 
+     * Keymap: QWERTY Gaming Layer (Layer 3)
+     * 
+     * ,--------------------------------------------------.           ,--------------------------------------------------.
+     * |   =    |   1  |   2  |   3  |   4  |   5  | ESC  |           | ESC  |   6  |   7  |   8  |   9  |   0  |   -    |
+     * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+     * | Tab    |   Q  |   W  |   E  |   R  |   T  | Fn4  |           | Fn4  |   Y  |   U  |   I  |   O  |   P  |   [    |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * | CapsLk |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   ;  |   '    |
+     * |--------+------+------+------+------+------| Fn1  |           | Fn2  |------+------+------+------+------+--------|
+     * | LShift |   Z  |   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |   /  | RShift |
+     * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+     *   | LGUI |   `  |  INS | Left | Rght |                                       |  Up  |  Dn  |   [  |   ]  | RGUI |
+     *   `----------------------------------'                                       `----------------------------------'
+     *                                        ,-------------.       ,-------------.
+     *                                        | LCtr | LAlt |       | Ralt | RCtr |
+     *                                 ,------|------|------|       |------+------+------.
+     *                                 |      |      | Home |       | PgUp |      |      |
+     *                                 | BkSp | Del  |------|       |------| Enter| Space|
+     *                                 |      |      | End  |       | PgDn |      |      |
+     *                                 `--------------------'       `--------------------'
+     * 
+     */
+
+    KEYMAP(  // layer 3 : QWERTY Gaming
+        // left hand
+        EQL, 1,   2,   3,   4,   5,   ESC,
+        TAB, Q,   W,   E,   R,   T,   FN4,
+        CAPS,A,   S,   D,   F,   G,
+        LSFT,Z,   X,   C,   V,   B,   FN1,
+        LGUI,GRV, INS,LEFT,RGHT,
+                                      LCTL,LALT,
+                                           HOME,
+                                 BSPC,DEL, END,
+        // right hand
+             ESC, 6,   7,   8,   9,   0,   MINS,
+             FN4, Y,   U,   I,   O,   P,   BSLS,
+                  H,   J,   K,   L,   SCLN,QUOT,
+             FN2, N,   M,   COMM,DOT, SLSH,RSFT,
+                       UP,DOWN,LBRC,RBRC,RGUI,
+        RALT,RCTL,
+        PGUP,
+        PGDN,ENT, SPC
+    ),
+
+};
+
+/* id for user defined functions & macros */
+enum function_id {
+    TEENSY_KEY,
+};
+
+/*
+ * Fn action definition
+ */
+const action_t PROGMEM fn_actions[] = {
+    ACTION_FUNCTION(TEENSY_KEY),                    // FN0 - Teensy key
+    ACTION_LAYER_MOMENTARY(1),                      // FN1 - switch to Layer1
+    ACTION_LAYER_MOMENTARY(2),                      // FN2 - switch to Layer2
+    ACTION_LAYER_MOMENTARY(3),                      // FN3 - switch to Layer3
+    ACTION_LAYER_SET_CLEAR(0),                      // FN4 - set Layer0
+    ACTION_LAYER_SET(1, ON_PRESS),                  // FN5 - set Layer1
+    ACTION_LAYER_SET(2, ON_PRESS),                  // FN6 - set Layer2
+    ACTION_LAYER_SET(3, ON_PRESS),                  // FN7 - set Layer3
+};
+
+/*
+ * Defining the Teensy Key action_function
+ */
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+    // print("action_function called\n");
+    // print("id  = "); phex(id); print("\n");
+    // print("opt = "); phex(opt); print("\n");
+
+    if (id == TEENSY_KEY) {
+        clear_keyboard();
+        print("\n\nJump to bootloader... ");
+        _delay_ms(50);
+        bootloader_jump(); // should not return
+        print("not supported.\n");
+    }
+
+}
diff --git a/keyboard/ergodox/keymap_micro.c b/keyboard/ergodox/keymap_micro.c
new file mode 100644 (file)
index 0000000..8036630
--- /dev/null
@@ -0,0 +1,428 @@
+//
+// Inspired by MicroDox:
+// http://geekhack.org/index.php?topic=42231.msg1062851#msg1062851
+// https://www.massdrop.com/ext/ergodox/?referer=CTL63V&hash=9ff8ddbb75e03e517aaa39acabc81669
+//
+#include <util/delay.h>
+#include "bootloader.h"
+#include "keymap_common.h"
+
+
+const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    /*
+     * Keymap: Default Layer in QWERTY
+     *
+     * ,--------------------------------------------------.           ,--------------------------------------------------.
+     * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+     * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+     * | Tab    |   Q  |   W  |   E  |   R  |   T  |      |           |      |   Y  |   U  |   I  |   O  |   P  |   [    |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * | Tab/Shf|   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   ;  |   '    |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * | LCtrl/~|   Z  |   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |   /  |   ]    |
+     * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+     *   |      |      | Caps | LAlt | LGui |                                       | RGui |      |      |      |      |
+     *   |      |      |      | Spc  | Esc  |                                       |      |      |      |      |      |
+     *   `----------------------------------'                                       `----------------------------------'
+     *                                        ,-------------.       ,-------------.
+     *                                        |      |      |       |      |      |
+     *                                 ,------|------|------|       |------+------+------.
+     *                                 |      |      |      |       |      |      |      |
+     *                                 | BkSp |  Del |------|       |------| Enter| Space|
+     *                                 |      |      |  Esc |       | Ins  |      |      |
+     *                                 | LCtl | LSft | LAlt |       | RAlt | RSft | RCtl |
+     *                                 `--------------------'       `--------------------'
+     *
+     *
+     *
+     ****************************************************************************************************
+     *
+     * Under XOrg, I use my own mapping from QWERTY to "Workman for Programmers"
+     * See XOrg files in ./addons/ subdirectory.
+     *
+     * I have to do so, because of two things:
+     * 1) my native language is Russian, and XOrg keymap for it is based on QWERTY layout
+     * 2) I want to have non-standart shifted keys, like $ (as normal) and @ (as shifted), or _ and -
+     *
+     * And even if (2) could be solved using FN* keys (but there is limit in firmware for only 32 such
+     * keys), then (1) can't be solved at firmware level at all.
+     *
+     * So, I have to stick with QWERTY as my main layout + my own XOrg keyboard layout for English.
+     * But sometimes I have to input something when XOrg is not active - for example, in Linux console,
+     * or in firmware console (while debugging firmware), or when keyboard is connected to not my computer.
+     *
+     * For such cases I have Layer1 :)
+     * // hint: switch to Layer1 is only at Layer6
+     *
+     ****************************************************************************************************
+     *
+     *
+     *
+     * Keymap: Default Layer in Workman
+     *
+     * ,--------------------------------------------------.           ,--------------------------------------------------.
+     * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+     * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+     * | Tab    |   Q  |   D  |   R  |   W  |   B  |      |           |      |   J  |   F  |   U  |   P  |   $  |   :    |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * | Tab/Shf|   A  |   S  |   H  |   T  |   G  |------|           |------|   Y  |   N  |   E  |   O  |   I  |   -    |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * | LCtrl  |   Z  |   X  |   M  |   C  |   V  |      |           |      |   K  |   L  |   ,  |   .  |   /  |   |    |
+     * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+     *   |      |      | Caps | LAlt | LGui |                                       | RGui |      |      |      |      |
+     *   |      |      |      | Spc  | Esc  |                                       |      |      |      |      |      |
+     *   `----------------------------------'                                       `----------------------------------'
+     *                                        ,-------------.       ,-------------.
+     *                                        |      |      |       |      |      |
+     *                                 ,------|------|------|       |------+------+------.
+     *                                 |      |      |      |       |      |      |      |
+     *                                 | BkSp |  Del |------|       |------| Enter| Space|
+     *                                 |      |      |  Esc |       | Ins  |      |      |
+     *                                 | LCtl | LSft | LAlt |       | RAlt | RSft | RCtl |
+     *                                 `--------------------'       `--------------------'
+     *
+     * Keymap: Default Layer in Workman / with Shift
+     *
+     * ,--------------------------------------------------.           ,--------------------------------------------------.
+     * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+     * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+     * | Tab    |   Q  |   D  |   R  |   W  |   B  |      |           |      |   J  |   F  |   U  |   P  |   @  |   %    |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * | Tab/Shf|   A  |   S  |   H  |   T  |   G  |------|           |------|   Y  |   N  |   E  |   O  |   I  |   _    |
+     * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+     * | LCtrl  |   Z  |   X  |   M  |   C  |   V  |      |           |      |   K  |   L  |   ,  |   .  |   /  |   &    |
+     * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+     *   |      |      | Caps | LAlt | LGui |                                       | RGui |      |      |      |      |
+     *   |      |      |      | Spc  | Esc  |                                       |      |      |      |      |      |
+     *   `----------------------------------'                                       `----------------------------------'
+     *                                        ,-------------.       ,-------------.
+     *                                        |      |      |       |      |      |
+     *                                 ,------|------|------|       |------+------+------.
+     *                                 |      |      |      |       |      |      |      |
+     *                                 | BkSp |  Del |------|       |------| Enter| Space|
+     *                                 |      |      |  Esc |       | Ins  |      |      |
+     *                                 | LCtl | LSft | LAlt |       | RAlt | RSft | RCtl |
+     *                                 `--------------------'       `--------------------'
+     *
+     * |  ~     |   ;  |   !  |   #  |   {  |   }  |   '  |           |   ^  |   [  |   ]  |   *  |   (  |   )  |   =    |
+     * |  `     |   1  |   2  |   3  |   4  |   5  |   "  |           |   \  |   6  |   7  |   8  |   9  |   0  |   +    |
+     */
+
+    KEYMAP(  // Layer0: default, leftled:none
+        // left hand
+        NO,  NO,  NO,  NO,  NO,  NO,  NO,
+        TAB, Q,   W,   E,   R,   T,   NO,
+        FN11,FN28,FN29,FN30,FN21,G,
+        FN12,FN24,FN25,FN26,FN27,B,   NO,
+        NO,  NO,  CAPS,FN13,FN14,
+                                      NO,  NO,
+                                           NO,
+                                 FN5, FN6, FN7,
+        // right hand
+             NO,  NO,  NO,  NO,  NO,  NO,  NO,
+             NO,  Y,   U,   I,   O,   P,   LBRC,
+                  H,   J,   K,   L,   FN22,FN15,
+             NO,  N,   M,   COMM,DOT, SLSH,FN16,
+                       RGUI,FN17,NO,  NO,  NO,
+        NO,  NO,
+        NO,
+        FN8, FN9, FN10
+    ),
+
+    KEYMAP(  // Layer1: Workman layout, leftled:all
+        // left hand
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,Q,   D,   R,   W,   B,   TRNS,
+        TRNS,A,   S,   H,   T,   G,
+        TRNS,Z,   X,   M,   C,   V,   TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,J,   F,   U,   P,   4,   TRNS,
+                  Y,   N,   E,   O,   I,   TRNS,
+             TRNS,K,   L,   TRNS,TRNS,TRNS,TRNS,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    KEYMAP(  // Layer2: numpad, leftled:blue
+        // left hand
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,NO,  NO,  NO,  TRNS,NO,
+        TRNS,NO,  NO,  NO,  TRNS,NO,  TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,NLCK,P7,  P8,  P9,  PMNS,PGUP,
+                  PAST,P4,  P5,  P6,  PPLS,PGDN,
+             TRNS,FN17,P1,  P2,  P3,  PSLS,PENT,
+                       P0,  PDOT,SLSH,NO,  NO,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    KEYMAP(  // Layer3: F-keys + PgUp/PgDn on right hand, leftled:green
+        // left hand
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,NO,  TRNS,NO,  NO,  NO,
+        TRNS,NO,  TRNS,NO,  NO,  NO,  TRNS,
+        TRNS,TRNS,TRNS,LALT,LGUI,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 LCTL,LSFT,LALT,
+        // right hand
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,PSCR,F1,  F2,  F3,  F4,  PGUP,
+                  SLCK,F5,  F6,  F7,  F8,  PGDN,
+             TRNS,PAUS,F9,  F10, F11, F12, APP,
+                       RGUI,RALT,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        RALT,RSFT,RCTL
+    ),
+
+    KEYMAP(  // Layer4: unconvenient keys on right hand, leftled:red
+        // left hand
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,TRNS,NO,  NO,  NO,  NO,
+        TRNS,TRNS,NO,  NO,  NO,  NO,  TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+
+        /* in Workman right hand will be:
+         *
+         *    ^ { } ( ) +
+         *    ' ! $ " ; =
+         *    # [ < > ] \
+         */
+
+        // right hand
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,MINS,4,   5,   9,   0,   PPLS,
+                  BSLS,2,   P,   FN1, 1,   EQL,
+             TRNS,3,   6,   FN3, FN4, 7,   FN2,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    KEYMAP(  // Layer5: cursor, leftled:red
+        // left hand
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,NO,  NO,  NO,  TRNS,NO,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,PGUP,HOME,END, DEL, INS, PGUP,
+                  PGDN,LEFT,UP,  DOWN,RGHT,PGDN,
+             TRNS,NO,  HOME,END, DEL, INS, TRNS,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    KEYMAP(  // Layer6: F1-F10, Workman-layer switch, Teensy, layer switches, leftled:red+onboard
+        // left hand
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        FN0, F1,  F2,  F3,  F4,  F5,  TRNS,
+        TRNS,FN18,NO,  NO,  FN19,NO,
+        TRNS,NO,  NO,  NO,  FN19,NO,  TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,F6,  F7,  F8,  F9,  F10, FN0,
+                  FN0, NO,  NO,  NO,  TRNS,TRNS,
+             TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    //
+    // rarely used
+    //
+
+    KEYMAP(  // Layer7: F-keys only, leftled:red
+        // left hand
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,F13, F14, F15, F16, NO,  TRNS,
+        TRNS,F17, F18, F19, F20, NO,
+        TRNS,F21, F22, F23, F24, NO,  TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,NO,  F1,  F2,  F3,  F4,  TRNS,
+                  NO,  F5,  F6,  F7,  F8,  TRNS,
+             TRNS,NO,  F9,  F10, F11, F12, TRNS,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+    KEYMAP(  // Layer8: mouse and navigation, leftled:blue and green
+        // left hand
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,NO,  NO,  TRNS,NO,  NO,
+        TRNS,NO,  NO,  TRNS,NO,  NO,  TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+
+        // right hand
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,BTN2,WH_L,WH_U,WH_D,WH_R,PGUP,
+                  BTN1,MS_L,MS_U,MS_D,MS_R,PGDN,
+             TRNS,BTN3,HOME,END, DEL, INS, NO,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+
+/*
+    // templates to copy from
+
+    KEYMAP(  // LayerN: transparent on edges + hard-defined thumb keys, all others are empty
+        // left hand
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,NO,  NO,  NO,  NO,  NO,
+        TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+        TRNS,TRNS,TRNS,LALT,LGUI,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 LCTL,LSFT,TRNS,
+        // right hand
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+                  NO,  NO,  NO,  NO,  NO,  TRNS,
+             TRNS,NO,  NO,  NO,  NO,  NO,  TRNS,
+                       RGUI,RALT,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,RSFT,RCTL
+    ),
+    KEYMAP(  // LayerN: fully transparent
+        // left hand
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,TRNS,TRNS,TRNS,
+                                      TRNS,TRNS,
+                                           TRNS,
+                                 TRNS,TRNS,TRNS,
+        // right hand
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+                  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+             TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+                       TRNS,TRNS,TRNS,TRNS,TRNS,
+        TRNS,TRNS,
+        TRNS,
+        TRNS,TRNS,TRNS
+    ),
+*/
+
+};
+
+/* id for user defined functions */
+enum function_id {
+    TEENSY_KEY,
+};
+
+/*
+ * Fn action definition
+ */
+const action_t PROGMEM fn_actions[] = {
+    ACTION_FUNCTION(TEENSY_KEY),                    // FN0  - Teensy key
+
+    // Layer4: unconvenient keys on right hand
+    ACTION_MODS_KEY(MOD_LSFT, KC_BSLS),             // FN1  = Shifted BackSlash // " in Workman
+    ACTION_MODS_KEY(MOD_LSFT, KC_MINS),             // FN2  = Shifted Minus     // \ in Workman
+    ACTION_MODS_KEY(MOD_LSFT, KC_COMM),             // FN3  = Shifted comma     // < in Workman
+    ACTION_MODS_KEY(MOD_LSFT, KC_DOT),              // FN4  = Shifted dot       // > in Workman
+
+    // Dual-role keys on thumbs
+    ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPC),         // FN5  = LShift with tap BackSpace
+    ACTION_MODS_TAP_KEY(MOD_LSFT, KC_DEL),          // FN6  = LCtrl  with tap Delete
+    ACTION_MODS_TAP_KEY(MOD_LALT, KC_ESC),          // FN7  = LAlt   with tap Escape
+    ACTION_MODS_TAP_KEY(MOD_RALT, KC_INS),          // FN8  = RAlt   with tap Ins
+    ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT),          // FN9  = RShift with tap Enter
+    ACTION_MODS_TAP_KEY(MOD_RCTL, KC_SPC),          // FN10 = RCtrl  with tap Space
+
+    // Dual-role keys on pinkies
+    ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB),          // FN11 = LShift with tap Tab
+    ACTION_MODS_TAP_KEY(MOD_LCTL, KC_GRV),          // FN12 = LCtrl  with tap Tilda
+    ACTION_MODS_TAP_KEY(MOD_LALT, KC_SPC),          // FN13 = LAlt   with tap Space
+    ACTION_MODS_TAP_KEY(MOD_LGUI, KC_ESC),          // FN14 = LGui   with tap Escape
+    ACTION_MODS_TAP_KEY(MOD_RSFT, KC_QUOT),         // FN15 = RShift with tap quotes
+    ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RBRC),         // FN16 = RCtrl  with tap ]
+
+    // Layers switching
+    ACTION_LAYER_SET(0, ON_BOTH),                   // FN17 - set Layer0
+    ACTION_LAYER_SET(1, ON_BOTH),                   // FN18 - set Layer1, to use Workman layout at firmware level
+    ACTION_LAYER_SET(2, ON_BOTH),                   // FN19 - set Layer2, to use with Numpad keys
+
+    ACTION_LAYER_MOMENTARY(2),                      // UNUSED: FN20 - momentary Layer2, to use with Numpad keys
+    ACTION_LAYER_TAP_KEY(5, KC_F),                  // FN21 - momentary Layer5, to use with cursor
+    ACTION_LAYER_TAP_KEY(6, KC_SCLN),               // FN22 - tapping ; Layer6, to use with F1-F10, Workman-layer switch, Teensy, layer switches
+    ACTION_LAYER_MOMENTARY(7),                      // UNUSED: FN23 - momentary Layer7, to use with F* keys (F1-F24)
+
+    ACTION_LAYER_TAP_KEY(4, KC_Z),                  // FN24 = momentary Layer4 on Z key, to use with unconvenient keys
+    ACTION_LAYER_TAP_KEY(3, KC_X),                  // FN25 = momentary Layer3 on X key, to use with F* keys
+    ACTION_LAYER_TAP_KEY(8, KC_C),                  // FN26 = momentary Layer8 on C key, to use with mouse and navigation keys
+    ACTION_LAYER_TAP_KEY(2, KC_V),                  // FN27 = momentary Layer2 on V key, to use with Numpad keys
+
+    // i'd like to remove this - will try to get used to live without this and convert them to usual keys
+    ACTION_LAYER_TAP_KEY(4, KC_A),                  // FN28 = momentary Layer4 on A key, to use with unconvenient keys
+    ACTION_LAYER_TAP_KEY(3, KC_S),                  // FN29 = momentary Layer3 on S key, to use with F* keys
+    ACTION_LAYER_TAP_KEY(8, KC_D),                  // FN30 = momentary Layer8 on D key, to use with mouse and navigation keys
+    ACTION_LAYER_TAP_KEY(2, KC_F),                  // UNUSED: FN31 = momentary Layer2 on F key, to use with Numpad keys
+};
+
+void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
+{
+    print("action_function called\n");
+    print("id  = "); phex(id); print("\n");
+    print("opt = "); phex(opt); print("\n");
+    if (id == TEENSY_KEY) {
+        clear_keyboard();
+        print("\n\nJump to bootloader... ");
+        _delay_ms(250);
+        bootloader_jump(); // should not return
+        print("not supported.\n");
+    }
+}
+
diff --git a/keyboard/ergodox/keymap_passwords_example.h b/keyboard/ergodox/keymap_passwords_example.h
new file mode 100644 (file)
index 0000000..01398d9
--- /dev/null
@@ -0,0 +1,21 @@
+#define MACRO_XMONAD_RESET  MACRO( \
+                                I(15), \
+                                D(LCTL), D(LALT), T(F2), W(255), U(LALT), U(LCTL), W(255), \
+                                T(X), T(M), T(O), T(N), T(UP), T(ENT), W(255), \
+                                D(LCTL), D(LALT), T(F5), W(255), U(LALT), U(LCTL), W(255), \
+                            END) \
+
+#define MACRO_PASSWORD1     MACRO( \
+                                I(15), \
+                                T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
+                            END) \
+
+#define MACRO_PASSWORD2     MACRO( \
+                                I(15), \
+                                T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
+                            END) \
+
+#define MACRO_PASSWORD2     MACRO( \
+                                I(15), \
+                                T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
+                            END) \
diff --git a/keyboard/ergodox/led.c b/keyboard/ergodox/led.c
new file mode 100644 (file)
index 0000000..765386e
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdint.h>
+#include <avr/io.h>
+#include "print.h"
+#include "debug.h"
+#include "led.h"
+#include "ergodox.h"
+
+
+void led_set(uint8_t usb_led)
+{
+    // topmost - NumLock
+#ifndef INVERT_NUMLOCK
+    if (usb_led & (1<<USB_LED_NUM_LOCK)) {
+        ergodox_right_led_1_on();
+    } else {
+        ergodox_right_led_1_off();
+    }
+#else
+    if (usb_led & (1<<USB_LED_NUM_LOCK)) {
+        ergodox_right_led_1_off();
+    } else {
+        ergodox_right_led_1_on();
+    }
+#endif
+
+    // middle - CapsLock
+    if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+        ergodox_right_led_2_on();
+    } else {
+        ergodox_right_led_2_off();
+    }
+
+    // bottommost - ScrollLock
+    if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
+        ergodox_right_led_3_on();
+    } else {
+        ergodox_right_led_3_off();
+    }
+}
diff --git a/keyboard/ergodox/matrix.c b/keyboard/ergodox/matrix.c
new file mode 100644 (file)
index 0000000..cecfe57
--- /dev/null
@@ -0,0 +1,369 @@
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/*
+ * scan matrix
+ */
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <util/delay.h>
+#include "action_layer.h"
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+#include "ergodox.h"
+#include "i2cmaster.h"
+#ifdef DEBUG_MATRIX_SCAN_RATE
+#include  "timer.h"
+#endif
+
+#ifndef DEBOUNCE
+#   define DEBOUNCE    5
+#endif
+static uint8_t debouncing = DEBOUNCE;
+
+/* matrix state(1:on, 0:off) */
+static matrix_row_t matrix[MATRIX_ROWS];
+static matrix_row_t matrix_debouncing[MATRIX_ROWS];
+
+static matrix_row_t read_cols(uint8_t row);
+static void init_cols(void);
+static void unselect_rows(void);
+static void select_row(uint8_t row);
+
+static uint8_t mcp23018_reset_loop;
+
+#ifdef DEBUG_MATRIX_SCAN_RATE
+uint32_t matrix_timer;
+uint32_t matrix_scan_count;
+#endif
+
+inline
+uint8_t matrix_rows(void)
+{
+    return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void)
+{
+    return MATRIX_COLS;
+}
+
+void matrix_init(void)
+{
+    // initialize row and col
+    init_ergodox();
+    mcp23018_status = init_mcp23018();
+    ergodox_blink_all_leds();
+    unselect_rows();
+    init_cols();
+
+    // initialize matrix state: all keys off
+    for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+        matrix[i] = 0;
+        matrix_debouncing[i] = 0;
+    }
+
+#ifdef DEBUG_MATRIX_SCAN_RATE
+    matrix_timer = timer_read32();
+    matrix_scan_count = 0;
+#endif
+}
+
+uint8_t matrix_scan(void)
+{
+    if (mcp23018_status) { // if there was an error
+        if (++mcp23018_reset_loop == 0) {
+            // since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
+            // this will be approx bit more frequent than once per second
+            print("trying to reset mcp23018\n");
+            mcp23018_status = init_mcp23018();
+            if (mcp23018_status) {
+                print("left side not responding\n");
+            } else {
+                print("left side attached\n");
+                ergodox_blink_all_leds();
+            }
+        }
+    }
+
+#ifdef DEBUG_MATRIX_SCAN_RATE
+    matrix_scan_count++;
+
+    uint32_t timer_now = timer_read32();
+    if (TIMER_DIFF_32(timer_now, matrix_timer)>1000) {
+        print("matrix scan frequency: ");
+        pdec(matrix_scan_count);
+        print("\n");
+
+        matrix_timer = timer_now;
+        matrix_scan_count = 0;
+    }
+#endif
+
+#ifdef KEYMAP_CUB
+    uint8_t layer = biton32(layer_state);
+
+    ergodox_board_led_off();
+    ergodox_left_led_1_off();
+    ergodox_left_led_2_off();
+    ergodox_left_led_3_off();
+    switch (layer) {
+        case 1:
+            // all
+            ergodox_left_led_1_on();
+            ergodox_left_led_2_on();
+            ergodox_left_led_3_on();
+            break;
+        case 2:
+            // blue
+            ergodox_left_led_2_on();
+            break;
+        case 8:
+            // blue and green
+            ergodox_left_led_2_on();
+            // break missed intentionally
+        case 3:
+            // green
+            ergodox_left_led_3_on();
+            break;
+        case 6:
+            ergodox_board_led_on();
+            // break missed intentionally
+        case 4:
+        case 5:
+        case 7:
+            // white
+            ergodox_left_led_1_on();
+            break;
+        case 9:
+            // white+green
+            ergodox_left_led_1_on();
+            ergodox_left_led_3_on();
+            break;
+        default:
+            // none
+            break;
+    }
+
+    mcp23018_status = ergodox_left_leds_update();
+#endif
+
+    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+        select_row(i);
+        matrix_row_t cols = read_cols(i);
+        if (matrix_debouncing[i] != cols) {
+            matrix_debouncing[i] = cols;
+            if (debouncing) {
+                debug("bounce!: "); debug_hex(debouncing); debug("\n");
+            }
+            debouncing = DEBOUNCE;
+        }
+        unselect_rows();
+    }
+
+    if (debouncing) {
+        if (--debouncing) {
+            _delay_ms(1);
+        } else {
+            for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+                matrix[i] = matrix_debouncing[i];
+            }
+        }
+    }
+
+    return 1;
+}
+
+bool matrix_is_modified(void)
+{
+    if (debouncing) return false;
+    return true;
+}
+
+inline
+bool matrix_is_on(uint8_t row, uint8_t col)
+{
+    return (matrix[row] & ((matrix_row_t)1<<col));
+}
+
+inline
+matrix_row_t matrix_get_row(uint8_t row)
+{
+    return matrix[row];
+}
+
+void matrix_print(void)
+{
+    print("\nr/c 0123456789ABCDEF\n");
+    for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+        phex(row); print(": ");
+        pbin_reverse16(matrix_get_row(row));
+        print("\n");
+    }
+}
+
+uint8_t matrix_key_count(void)
+{
+    uint8_t count = 0;
+    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+        count += bitpop16(matrix[i]);
+    }
+    return count;
+}
+
+/* Column pin configuration
+ *
+ * Teensy
+ * col: 0   1   2   3   4   5
+ * pin: F0  F1  F4  F5  F6  F7
+ *
+ * MCP23018
+ * col: 0   1   2   3   4   5
+ * pin: B5  B4  B3  B2  B1  B0
+ */
+static void  init_cols(void)
+{
+    // init on mcp23018
+    // not needed, already done as part of init_mcp23018()
+
+    // init on teensy
+    // Input with pull-up(DDR:0, PORT:1)
+    DDRF  &= ~(1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<1 | 1<<0);
+    PORTF |=  (1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<1 | 1<<0);
+}
+
+static matrix_row_t read_cols(uint8_t row)
+{
+    if (row < 7) {
+        if (mcp23018_status) { // if there was an error
+            return 0;
+        } else {
+            uint8_t data = 0;
+            mcp23018_status = i2c_start(I2C_ADDR_WRITE);    if (mcp23018_status) goto out;
+            mcp23018_status = i2c_write(GPIOB);             if (mcp23018_status) goto out;
+            mcp23018_status = i2c_start(I2C_ADDR_READ);     if (mcp23018_status) goto out;
+            data = i2c_readNak();
+            data = ~data;
+        out:
+            i2c_stop();
+            return data;
+        }
+    } else {
+        _delay_us(30);  // without this wait read unstable value.
+        // read from teensy
+        return
+            (PINF&(1<<0) ? 0 : (1<<0)) |
+            (PINF&(1<<1) ? 0 : (1<<1)) |
+            (PINF&(1<<4) ? 0 : (1<<2)) |
+            (PINF&(1<<5) ? 0 : (1<<3)) |
+            (PINF&(1<<6) ? 0 : (1<<4)) |
+            (PINF&(1<<7) ? 0 : (1<<5)) ;
+    }
+}
+
+/* Row pin configuration
+ *
+ * Teensy
+ * row: 7   8   9   10  11  12  13
+ * pin: B0  B1  B2  B3  D2  D3  C6
+ *
+ * MCP23018
+ * row: 0   1   2   3   4   5   6
+ * pin: A0  A1  A2  A3  A4  A5  A6
+ */
+static void unselect_rows(void)
+{
+    // unselect on mcp23018
+    if (mcp23018_status) { // if there was an error
+        // do nothing
+    } else {
+        // set all rows hi-Z : 1
+        mcp23018_status = i2c_start(I2C_ADDR_WRITE);    if (mcp23018_status) goto out;
+        mcp23018_status = i2c_write(GPIOA);             if (mcp23018_status) goto out;
+        mcp23018_status = i2c_write( 0xFF
+                              & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
+                          );                            if (mcp23018_status) goto out;
+    out:
+        i2c_stop();
+    }
+
+    // unselect on teensy
+    // Hi-Z(DDR:0, PORT:0) to unselect
+    DDRB  &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3);
+    PORTB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3);
+    DDRD  &= ~(1<<2 | 1<<3);
+    PORTD &= ~(1<<2 | 1<<3);
+    DDRC  &= ~(1<<6);
+    PORTC &= ~(1<<6);
+}
+
+static void select_row(uint8_t row)
+{
+    if (row < 7) {
+        // select on mcp23018
+        if (mcp23018_status) { // if there was an error
+            // do nothing
+        } else {
+            // set active row low  : 0
+            // set other rows hi-Z : 1
+            mcp23018_status = i2c_start(I2C_ADDR_WRITE);        if (mcp23018_status) goto out;
+            mcp23018_status = i2c_write(GPIOA);                 if (mcp23018_status) goto out;
+            mcp23018_status = i2c_write( 0xFF & ~(1<<row)
+                                  & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
+                              );                                if (mcp23018_status) goto out;
+        out:
+            i2c_stop();
+        }
+    } else {
+        // select on teensy
+        // Output low(DDR:1, PORT:0) to select
+        switch (row) {
+            case 7:
+                DDRB  |= (1<<0);
+                PORTB &= ~(1<<0);
+                break;
+            case 8:
+                DDRB  |= (1<<1);
+                PORTB &= ~(1<<1);
+                break;
+            case 9:
+                DDRB  |= (1<<2);
+                PORTB &= ~(1<<2);
+                break;
+            case 10:
+                DDRB  |= (1<<3);
+                PORTB &= ~(1<<3);
+                break;
+            case 11:
+                DDRD  |= (1<<2);
+                PORTD &= ~(1<<3);
+                break;
+            case 12:
+                DDRD  |= (1<<3);
+                PORTD &= ~(1<<3);
+                break;
+            case 13:
+                DDRC  |= (1<<6);
+                PORTC &= ~(1<<6);
+                break;
+        }
+    }
+}
diff --git a/keyboard/ergodox/twimaster.c b/keyboard/ergodox/twimaster.c
new file mode 100644 (file)
index 0000000..3f9ccb3
--- /dev/null
@@ -0,0 +1,202 @@
+/*************************************************************************
+* Title:    I2C master library using hardware TWI interface
+* Author:   Peter Fleury <pfleury@gmx.ch>  http://jump.to/fleury
+* File:     $Id: twimaster.c,v 1.4 2015/01/17 12:16:05 peter Exp $
+* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3
+* Target:   any AVR device with hardware TWI 
+* Usage:    API compatible with I2C Software Library i2cmaster.h
+**************************************************************************/
+#include <inttypes.h>
+#include <compat/twi.h>
+
+#include <i2cmaster.h>
+
+
+/* define CPU frequency in hz here if not defined in Makefile */
+#ifndef F_CPU
+#define F_CPU 4000000UL
+#endif
+
+/* I2C clock in Hz */
+#define SCL_CLOCK  100000L
+
+
+/*************************************************************************
+ Initialization of the I2C bus interface. Need to be called only once
+*************************************************************************/
+void i2c_init(void)
+{
+  /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
+  
+  TWSR = 0;                         /* no prescaler */
+  TWBR = ((F_CPU/SCL_CLOCK)-16)/2;  /* must be > 10 for stable operation */
+
+}/* i2c_init */
+
+
+/*************************************************************************     
+  Issues a start condition and sends address and transfer direction.
+  return 0 = device accessible, 1= failed to access device
+*************************************************************************/
+unsigned char i2c_start(unsigned char address)
+{
+    uint8_t   twst;
+
+       // send START condition
+       TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
+
+       // wait until transmission completed
+       while(!(TWCR & (1<<TWINT)));
+
+       // check value of TWI Status Register. Mask prescaler bits.
+       twst = TW_STATUS & 0xF8;
+       if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
+
+       // send device address
+       TWDR = address;
+       TWCR = (1<<TWINT) | (1<<TWEN);
+
+       // wail until transmission completed and ACK/NACK has been received
+       while(!(TWCR & (1<<TWINT)));
+
+       // check value of TWI Status Register. Mask prescaler bits.
+       twst = TW_STATUS & 0xF8;
+       if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
+
+       return 0;
+
+}/* i2c_start */
+
+
+/*************************************************************************
+ Issues a start condition and sends address and transfer direction.
+ If device is busy, use ack polling to wait until device is ready
+ Input:   address and transfer direction of I2C device
+*************************************************************************/
+void i2c_start_wait(unsigned char address)
+{
+    uint8_t   twst;
+
+
+    while ( 1 )
+    {
+           // send START condition
+           TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
+    
+       // wait until transmission completed
+       while(!(TWCR & (1<<TWINT)));
+    
+       // check value of TWI Status Register. Mask prescaler bits.
+       twst = TW_STATUS & 0xF8;
+       if ( (twst != TW_START) && (twst != TW_REP_START)) continue;
+    
+       // send device address
+       TWDR = address;
+       TWCR = (1<<TWINT) | (1<<TWEN);
+    
+       // wail until transmission completed
+       while(!(TWCR & (1<<TWINT)));
+    
+       // check value of TWI Status Register. Mask prescaler bits.
+       twst = TW_STATUS & 0xF8;
+       if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) ) 
+       {           
+           /* device busy, send stop condition to terminate write operation */
+               TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
+               
+               // wait until stop condition is executed and bus released
+               while(TWCR & (1<<TWSTO));
+               
+           continue;
+       }
+       //if( twst != TW_MT_SLA_ACK) return 1;
+       break;
+     }
+
+}/* i2c_start_wait */
+
+
+/*************************************************************************
+ Issues a repeated start condition and sends address and transfer direction 
+
+ Input:   address and transfer direction of I2C device
+ Return:  0 device accessible
+          1 failed to access device
+*************************************************************************/
+unsigned char i2c_rep_start(unsigned char address)
+{
+    return i2c_start( address );
+
+}/* i2c_rep_start */
+
+
+/*************************************************************************
+ Terminates the data transfer and releases the I2C bus
+*************************************************************************/
+void i2c_stop(void)
+{
+    /* send stop condition */
+       TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
+       
+       // wait until stop condition is executed and bus released
+       while(TWCR & (1<<TWSTO));
+
+}/* i2c_stop */
+
+
+/*************************************************************************
+  Send one byte to I2C device
+  
+  Input:    byte to be transfered
+  Return:   0 write successful 
+            1 write failed
+*************************************************************************/
+unsigned char i2c_write( unsigned char data )
+{      
+    uint8_t   twst;
+    
+       // send data to the previously addressed device
+       TWDR = data;
+       TWCR = (1<<TWINT) | (1<<TWEN);
+
+       // wait until transmission completed
+       while(!(TWCR & (1<<TWINT)));
+
+       // check value of TWI Status Register. Mask prescaler bits
+       twst = TW_STATUS & 0xF8;
+       if( twst != TW_MT_DATA_ACK) return 1;
+       return 0;
+
+}/* i2c_write */
+
+
+/*************************************************************************
+ Read one byte from the I2C device, request more data from device 
+ Return:  byte read from I2C device
+*************************************************************************/
+unsigned char i2c_readAck(void)
+{
+       TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
+       while(!(TWCR & (1<<TWINT)));    
+
+    return TWDR;
+
+}/* i2c_readAck */
+
+
+/*************************************************************************
+ Read one byte from the I2C device, read is followed by a stop condition 
+ Return:  byte read from I2C device
+*************************************************************************/
+unsigned char i2c_readNak(void)
+{
+       TWCR = (1<<TWINT) | (1<<TWEN);
+       while(!(TWCR & (1<<TWINT)));
+       
+    return TWDR;
+
+}/* i2c_readNak */