summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel Barkhau <mbarkhau@gmail.com>2016-04-02 23:07:58 +0200
committerManuel Barkhau <mbarkhau@gmail.com>2016-04-02 23:12:38 +0200
commit381a9fd55319d1f29783748f5d6d5c5820e81636 (patch)
tree6824cd01c46adec7e4085f888defb5b90d77b1bc
parent77fa2b0056f10c079af541a746fb12cb96fabe72 (diff)
use action function for unicode
-rw-r--r--keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py273
-rw-r--r--keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex2862
-rw-r--r--keyboard/ergodox_ez/keymaps/german-manuneo/keymap.c1004
-rw-r--r--keyboard/ergodox_ez/keymaps/german-manuneo/keymap.md52
4 files changed, 1651 insertions, 2540 deletions
diff --git a/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py b/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py
index af68672226..3d26672762 100644
--- a/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py
+++ b/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py
@@ -20,6 +20,7 @@ import sys
import json
import unicodedata
import collections
+import itertools as it
PY2 = sys.version_info.major == 2
@@ -27,11 +28,6 @@ if PY2:
chr = unichr
-BASEPATH = os.path.abspath(os.path.join(
- os.path.dirname(__file__), "..", ".."
-))
-
-
KEYBOARD_LAYOUTS = {
# These map positions in the parsed layout to
# positions in the KEYMAP MATRIX
@@ -73,34 +69,33 @@ BLANK_LAYOUTS = [
# Wide Layout
"""
-.--------------------------------------------. .--------------------------------------------.
-| | | | | | | | ! | | | | | | |
-!------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+------!
-| | | | | | | | ! | | | | | | |
-!------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+------!
-| | | | | | |-------! !-------! | | | | | |
-!------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+------!
-| | | | | | | | ! | | | | | | |
-'------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+------'
- | | | | | | ! | | | | |
- '-----------------------------' '-----------------------------'
- .---------------. .---------------.
- | | | ! | |
- .-------+-------+-------! !-------+-------+-------.
- ! ! | | ! | ! !
- ! ! !-------! !-------! ! !
- | | | | ! | | |
- '-----------------------' '-----------------------'
+.---------------------------------------------. .---------------------------------------------.
+| | | | | | | | ! | | | | | | |
+!-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
+| | | | | | | | ! | | | | | | |
+!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
+| | | | | | |-------! !-------! | | | | | |
+!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
+| | | | | | | | ! | | | | | | |
+'-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
+ | | | | | | ! | | | | |
+ '------------------------------' '------------------------------'
+ .---------------. .---------------.
+ | | | ! | |
+ .-------+-------+-------! !-------+-------+-------.
+ ! ! | | ! | ! !
+ ! ! !-------! !-------! ! !
+ | | | | ! | | |
+ '-----------------------' '-----------------------'
""",
]
DEFAULT_CONFIG = {
- "includes_basedir": "quantum/",
"keymaps_includes": [
"keymap_common.h",
],
- 'filler': "-+.':x",
+ 'filler': "-+.'!:x",
'separator': "|",
'default_key_prefix': ["KC_"],
}
@@ -114,31 +109,34 @@ SECTIONS = [
# Markdown Parsing
+ONELINE_COMMENT_RE = re.compile(r"""
+ ^ # comment must be at the start of the line
+ \s* # arbitrary whitespace
+ // # start of the comment
+ (.*) # the comment
+ $ # until the end of line
+""", re.MULTILINE | re.VERBOSE
+)
+
+INLINE_COMMENT_RE = re.compile(r"""
+ ([\,\"\[\]\{\}\d]) # anythig that might end a expression
+ \s+ # comment must be preceded by whitespace
+ // # start of the comment
+ \s # and succeded by whitespace
+ (?:[^\"\]\}\{\[]*) # the comment (except things which might be json)
+ $ # until the end of line
+""", re.MULTILINE | re.VERBOSE)
+
+TRAILING_COMMA_RE = re.compile(r"""
+ , # the comma
+ (?:\s*) # arbitrary whitespace
+ $ # only works if the trailing comma is followed by newline
+ (\s*) # arbitrary whitespace
+ ([\]\}]) # end of an array or object
+""", re.MULTILINE | re.VERBOSE)
+
+
def loads(raw_data):
- ONELINE_COMMENT_RE = re.compile(r"""
- ^ # comment must be at the start of the line
- \s* # arbitrary whitespace
- // # start of the comment
- (.*) # the comment
- $ # until the end of line
- """, re.MULTILINE | re.VERBOSE)
-
- INLINE_COMMENT_RE = re.compile(r"""
- ([\,\"\[\]\{\}\d]) # anythig that might end a expression
- \s+ # comment must be preceded by whitespace
- // # start of the comment
- \s # and succeded by whitespace
- (?:[^\"\]\}\{\[]*) # the comment (except things which might be json)
- $ # until the end of line
- """, re.MULTILINE | re.VERBOSE)
-
- TRAILING_COMMA_RE = re.compile(r"""
- , # the comma
- (?:\s*) # arbitrary whitespace
- $ # only works if the trailing comma is followed by newline
- (\s*) # arbitrary whitespace
- ([\]\}]) # end of an array or object
- """, re.MULTILINE | re.VERBOSE)
if isinstance(raw_data, bytes):
raw_data = raw_data.decode('utf-8')
@@ -164,6 +162,8 @@ def parse_config(path):
name = line[2:]
elif line.startswith("## "):
name = line[3:]
+ else:
+ name = ""
name = name.strip().replace(" ", "_").lower()
if name in SECTIONS:
@@ -209,6 +209,7 @@ def parse_config(path):
pass
end_section()
+ assert 'layout' in config
return config
# header file parsing
@@ -218,16 +219,15 @@ IF0_RE = re.compile(r"""
#if 0
$.*?
#endif
- """, re.MULTILINE | re.DOTALL | re.VERBOSE
-)
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
COMMENT_RE = re.compile(r"""
/\*
.*?
\*/"
- """, re.MULTILINE | re.DOTALL | re.VERBOSE
-)
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
def read_header_file(path):
with io.open(path, encoding="utf-8") as fh:
@@ -237,7 +237,7 @@ def read_header_file(path):
return data
-def regex_partial(re_str_fmt, flags=re.MULTILINE | re.DOTALL | re.VERBOSE):
+def regex_partial(re_str_fmt, flags):
def partial(*args, **kwargs):
re_str = re_str_fmt.format(*args, **kwargs)
return re.compile(re_str, flags)
@@ -251,8 +251,7 @@ KEYDEF_REP = regex_partial(r"""
(?:{}) # the prefixes
(?:\w+) # the key name
) # capture group end
- """
-)
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
ENUM_RE = re.compile(r"""
@@ -264,8 +263,7 @@ ENUM_RE = re.compile(r"""
\}
;
) # capture group end
- """, re.MULTILINE | re.DOTALL | re.VERBOSE
-)
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
ENUM_KEY_REP = regex_partial(r"""
@@ -273,8 +271,8 @@ ENUM_KEY_REP = regex_partial(r"""
{} # the prefixes
\w+ # the key name
) # capture group end
- """
-)
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
def parse_keydefs(config, data):
prefix_options = "|".join(config['key_prefixes'])
@@ -289,26 +287,31 @@ def parse_keydefs(config, data):
yield key_match.groups()[0]
-def parse_valid_keys(config):
- valid_keycodes = set()
- paths = [
- os.path.join(BASEPATH, "tmk_core", "common", "keycode.h")
- ] + [
- os.path.join(
- BASEPATH, config['includes_dir'], include_path
- ) for include_path in config['keymaps_includes']
- ]
+def parse_valid_keys(config, out_path):
+ basepath = os.path.abspath(os.path.join(os.path.dirname(out_path)))
+ dirpaths = []
+ subpaths = []
+ while len(subpaths) < 6:
+ path = os.path.join(basepath, *subpaths)
+ dirpaths.append(path)
+ dirpaths.append(os.path.join(path, "tmk_core", "common"))
+ dirpaths.append(os.path.join(path, "quantum"))
+ subpaths.append('..')
+
+ includes = set(config['keymaps_includes'])
+ includes.add("keycode.h")
- for path in paths:
- path = path.replace("/", os.sep)
- # the config always uses forward slashe
- if os.path.exists(path):
- header_data = read_header_file(path)
+ valid_keycodes = set()
+ for dirpath, include in it.product(dirpaths, includes):
+ include_path = os.path.join(dirpath, include)
+ if os.path.exists(include_path):
+ header_data = read_header_file(include_path)
valid_keycodes.update(
parse_keydefs(config, header_data)
)
return valid_keycodes
+
# Keymap Parsing
def iter_raw_codes(layer_lines, filler, separator):
@@ -325,6 +328,7 @@ def iter_raw_codes(layer_lines, filler, separator):
def iter_indexed_codes(raw_codes, key_indexes):
key_rows = {}
key_indexes_flat = []
+
for row_index, key_indexes in enumerate(key_indexes):
for key_index in key_indexes:
key_rows[key_index] = row_index
@@ -384,8 +388,8 @@ def parse_code(raw_code, key_prefixes, valid_keycodes):
return raw_code, None, None
if MACRO_RE.match(raw_code):
- code = macro_id = raw_code[2:-1]
- return code, macro_id, None
+ macro_id = raw_code[2:-1]
+ return raw_code, macro_id, None
if UNICODE_RE.match(raw_code):
hex_code = raw_code[1:]
@@ -404,10 +408,17 @@ def parse_keymap(config, key_indexes, layer_lines, valid_keycodes):
layer_lines, config['filler'], config['separator']
))
indexed_codes = iter_indexed_codes(raw_codes, key_indexes)
+ key_prefixes = config['key_prefixes']
for raw_code, key_index, row_index in indexed_codes:
code, macro_id, uc_hex = parse_code(
- raw_code, config['key_prefixes'], valid_keycodes
+ raw_code, key_prefixes, valid_keycodes
+ )
+ # TODO: line numbers for invalid codes
+ err_msg = "Could not parse key '{}' on row {}".format(
+ raw_code, row_index
)
+ assert code is not None, err_msg
+ # print(repr(raw_code), repr(code), macro_id, uc_hex)
if macro_id:
config['macro_ids'].add(macro_id)
if uc_hex:
@@ -482,9 +493,64 @@ void matrix_scan_user(void) {
MACROCODE = """
#define UC_MODE_WIN 0
#define UC_MODE_LINUX 1
+#define UC_MODE_OSX 2
+// TODO: allow default mode to be configured
static uint16_t unicode_mode = UC_MODE_WIN;
+uint16_t hextokeycode(uint8_t hex) {{
+ if (hex == 0x0) {{
+ return KC_P0;
+ }}
+ if (hex < 0xA) {{
+ return KC_P1 + (hex - 0x1);
+ }}
+ return KC_A + (hex - 0xA);
+}}
+
+void unicode_action_function(uint16_t hi, uint16_t lo) {{
+ switch (unicode_mode) {{
+ case UC_MODE_WIN:
+ register_code(KC_LALT);
+
+ register_code(KC_PPLS);
+ unregister_code(KC_PPLS);
+
+ register_code(hextokeycode((hi & 0xF0) >> 4));
+ unregister_code(hextokeycode((hi & 0xF0) >> 4));
+ register_code(hextokeycode((hi & 0x0F)));
+ unregister_code(hextokeycode((hi & 0x0F)));
+ register_code(hextokeycode((lo & 0xF0) >> 4));
+ unregister_code(hextokeycode((lo & 0xF0) >> 4));
+ register_code(hextokeycode((lo & 0x0F)));
+ unregister_code(hextokeycode((lo & 0x0F)));
+
+ unregister_code(KC_LALT);
+ break;
+ case UC_MODE_LINUX:
+ register_code(KC_LCTL);
+ register_code(KC_LSFT);
+
+ register_code(KC_U);
+ unregister_code(KC_U);
+
+ register_code(hextokeycode((hi & 0xF0) >> 4));
+ unregister_code(hextokeycode((hi & 0xF0) >> 4));
+ register_code(hextokeycode((hi & 0x0F)));
+ unregister_code(hextokeycode((hi & 0x0F)));
+ register_code(hextokeycode((lo & 0xF0) >> 4));
+ unregister_code(hextokeycode((lo & 0xF0) >> 4));
+ register_code(hextokeycode((lo & 0x0F)));
+ unregister_code(hextokeycode((lo & 0x0F)));
+
+ unregister_code(KC_LCTL);
+ unregister_code(KC_LSFT);
+ break;
+ case UC_MODE_OSX:
+ break;
+ }}
+}}
+
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {{
if (!record->event.pressed) {{
return MACRO_NONE;
@@ -494,57 +560,35 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {{
case UM:
unicode_mode = (unicode_mode + 1) % 2;
break;
- {macro_cases}
+{macro_cases}
+{unicode_macro_cases}
default:
break;
}}
- if (unicode_mode == UC_MODE_WIN) {{
- switch(id) {{
- {win_macro_cases}
- default:
- break;
- }}
- }} else if (unicode_mode == UC_MODE_LINUX) {{
- switch(id) {{
- {linux_macro_cases}
- default:
- break;
- }}
- }}
return MACRO_NONE;
}};
"""
-WIN_UNICODE_MACRO_TEMPLATE = """
-case {0}:
- return MACRODOWN(
- D(LALT), T(KP_PLUS), {1}, U(LALT), END
- );
-"""
-LINUX_UNICODE_MACRO_TEMPLATE = """
-case {0}:
- return MACRODOWN(
- D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), {1}, T(KP_ENTER), END
- );
-"""
+UNICODE_MACRO_TEMPLATE = """
+case {macro_id}:
+ unicode_action_function(0x{hi:02x}, 0x{lo:02x});
+ break;
+""".strip()
-def macro_cases(config, mode):
- if mode == 'win':
- template = WIN_UNICODE_MACRO_TEMPLATE
- elif mode == 'linux':
- template = LINUX_UNICODE_MACRO_TEMPLATE
- else:
- raise ValueError("Invalid mode: ", mode)
- template = template.strip()
+def unicode_macro_cases(config):
for macro_id, uc_hex in config['unicode_macros'].items():
+ hi = int(uc_hex, 16) >> 8
+ lo = int(uc_hex, 16) & 0xFF
unimacro_keys = ", ".join(
"T({})".format(
"KP_" + digit if digit.isdigit() else digit
) for digit in uc_hex
)
- yield template.format(macro_id, unimacro_keys)
+ yield UNICODE_MACRO_TEMPLATE.format(
+ macro_id=macro_id, hi=hi, lo=lo
+ )
def iter_keymap_lines(keymap):
@@ -599,8 +643,7 @@ def iter_keymap_parts(config, keymaps):
# macros
yield MACROCODE.format(
macro_cases="",
- win_macro_cases="\n".join(macro_cases(config, mode='win')),
- linux_macro_cases="\n".join(macro_cases(config, mode='linux')),
+ unicode_macro_cases="\n".join(unicode_macro_cases(config)),
)
# TODO: dynamically create blinking lights
@@ -624,7 +667,7 @@ def main(argv=sys.argv[1:]):
out_path = os.path.join(dirname, "keymap.c")
config = parse_config(in_path)
- valid_keys = parse_valid_keys(config)
+ valid_keys = parse_valid_keys(config, out_path)
keymaps = parse_keymaps(config, valid_keys)
with io.open(out_path, mode="w", encoding="utf-8") as fh:
diff --git a/keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex b/keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex
index cb8b7fa8d4..ee1d30967d 100644
--- a/keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex
+++ b/keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex
@@ -1,1624 +1,1240 @@
-:100000000C94BD0F0C9401100C9401100C94011071
-:100010000C9401100C9401100C9401100C9401101C
-:100020000C9401100C9401100C94791B0C944B1C33
-:100030000C9401100C9401100C9401100C940110FC
-:100040000C9401100C94D6300C9401100C940110F7
-:100050000C9401100C94782A0C9401100C9401104B
-:100060000C9401100C9401100C9401100C940110CC
-:100070000C9401100C9401100C9401100C940110BC
-:100080000C9401100C9401100C9401100C940110AC
-:100090000C9401100C9401100C9401100C9401109C
-:1000A0000C9401100C9401100C940110AB107810FA
-:1000B0006310BD10E4101711F910FF1014113E1158
-:1000C0003511021138114E10F3102911321175102B
-:1000D0006C10BA10B11099106F103010C6101A11B0
-:1000E00023112F119F10CF10AE1048102011ED10CA
-:1000F0009010A5109C108410261193103910F01048
-:100100008A10C9106C12B410661054107E107B1047
-:10011000D210A2100E113F108D10B7102D10C0106C
-:100120000B111111DB105D10F6104B1072105710EF
-:10013000CC10FC103B113310A810C3100511D510C2
-:100140005A102C11EA10451096106010E110691039
-:1001500008114210D810E7103610511041111D112E
-:1001600081103C10DE108710D311A0118B11E51106
-:100170000C123F12211227123C1266125D122A1233
-:10018000601276111B1251125A129D119411E21134
-:10019000D911C11197115811EE1142124B12571279
-:1001A000C711F711D611701148121512B811CD11DF
-:1001B000C411AC114E12BB1161111812B211F11120
-:1001C0006F12DC118E117C11A611A311FA11CA1144
-:1001D00036126711B511DF115511E81133123912BA
-:1001E000031285111E1273119A117F11F41124123A
-:1001F00063125B11D011EB112D12FD1182115412FB
-:1002000012126D11BE1188110912911130126A116A
-:1002100000120F125E11791169124512A9116411B1
-:100220000612AF11B01CD21CBD1DD21CBD1D141D69
-:10023000371DBD1D8C1D9F1D8C208C20BA20BA201F
-:10024000FC203821382338235021382347224722E5
-:10025000122338233823262301E001E10118021874
-:1002600002E002E10162026201620262010502052E
-:1002700001070207015802580001E001E1011802DC
-:100280001802E002E101620262015B025B016102AD
-:1002900061015C025C015802580001E001E10118B3
-:1002A000021802E002E1015A025A01620262016090
-:1002B0000260015E025E015802580001E001E101A6
-:1002C00018021802E002E101620262015B025B01B6
-:1002D000610261015B025B015802580001E001E12B
-:1002E0000118021802E002E101620262015B025B96
-:1002F00001610261015D025D015802580001E001E7
-:10030000E10118021802E002E101620262015B02EF
-:100310005B0161026101060206015802580001E01A
-:1003200001E10118021802E002E101620262015BD0
-:10033000025B01040204015D025D015802580001E4
-:10034000E001E10118021802E002E1015A025A013B
-:10035000620262015F025F0109020901580258004E
-:1003600001E001E10118021802E002E1016202620B
-:10037000015B025B0161026101050205015802583F
-:100380000001E001E10118021802E002E10162024D
-:1003900062015B025B010502050161026101580215
-:1003A000580001E001E10118021802E002E10162D7
-:1003B0000262015B025B016102610160026001583F
-:1003C00002580001E001E10118021802E002E10117
-:1003D000620262015B025B01060206015F025F01CD
-:1003E0005802580001E001E10118021802E002E1A0
-:1003F0000162026201620262010502050106020653
-:10040000015802580001E001E10118021802E0025F
-:10041000E101620262015B025B01040204015C0211
-:100420005C015802580001E001E10118021802E0E5
-:1004300002E1015A025A015A025A01620262016241
-:100440000262015802580001E001E101180218029D
-:10045000E002E101620262015B025B01040204014D
-:100460005F025F015802580001E001E10118021823
-:1004700002E002E1015A025A015A025A015E025E8A
-:1004800001620262015802580001E001E101180214
-:100490001802E002E101620262015B025B010602F6
-:1004A00006015D025D015802580001E001E10118FA
-:1004B000021802E002E1015A025A015A025A01628C
-:1004C000026201610261015802580001E001E1018C
-:1004D00018021802E002E1015A025A0162026201A6
-:1004E0005F025F01620262015802580001E001E10F
-:1004F0000118021802E002E1015A025A0162026286
-:10050000015F025F01600260015802580001E001D2
-:10051000E10118021802E002E101620262015B02DD
-:100520005B01610261015F025F015802580001E056
-:1005300001E10118021802E002E101620262015BBE
-:10054000025B01610261015A025A0158025800011E
-:10055000E001E10118021802E002E1015A025A0129
-:1005600062026201600260015F025F01580258008E
-:1005700001E001E10118021802E002E101620262F9
-:10058000015B025B01610261015902590158025885
-:100590000001E001E10118021802E002E1015A0243
-:1005A0005A01620262016002600160026001580249
-:1005B000580001E001E10118021802E002E10162C5
-:1005C0000262015B025B01610261010402040158E5
-:1005D00002580001E001E10118021802E002E10105
-:1005E000620262015B025B0105020501060206016F
-:1005F0005802580001E001E10118021802E002E18E
-:1006000001620262015B025B01050205015C025CA2
-:10061000015802580001E001E10118021802E0024D
-:10062000E1015A025A01620262015F025F01610246
-:1006300061015802580001E001E10118021802E0CE
-:1006400002E1015A025A015902590161026101593C
-:100650000259015802580001E001E1011802180294
-:10066000E002E1015A025A015A025A016202620191
-:100670005D025D015802580001E001E10118021815
-:1006800002E002E10162026201620262010502050A
-:10069000015B025B015802580001E001E101180210
-:1006A0001802E002E10162026201620262010502D7
-:1006B0000501080208015802580001E001E1011893
-:1006C000021802E002E101620262016202620105B7
-:1006D000020501590259015802580001E001E101E7
-:1006E00018021802E002E1015A025A015A025A01A4
-:1006F000620262015B025B015802580001E001E105
-:100700000118021802E002E1015A025A0162026273
-:10071000015F025F015D025D015802580001E001C6
-:10072000E10118021802E002E101620262015B02CB
-:100730005B01060206015C025C015802580001E000
-:1007400001E10118021802E002E101620262015BAC
-:10075000025B01610261015E025E01580258000104
-:10076000E001E10118021802E002E1015A025A0117
-:100770006202620160026001590259015802580088
-:1007800001E001E10118021802E002E101620262E7
-:10079000015B025B01060206016102610158025819
-:1007A0000001E001E10118021802E002E101620229
-:1007B00062015B025B01040204015B025B015802FF
-:1007C000580001E001E10118021802E002E1015ABB
-:1007D000025A016202620160026001620262015813
-:1007E00002580001E001E10118021802E002E101F3
-:1007F0006202620162026201070207015F025F0199
-:100800005802580001E001E10118021802E002E17B
-:10081000015A025A015A025A0162026201600260E0
-:10082000015802580001E001E10118021802E0023B
-:10083000E101620262015B025B0161026101090286
-:1008400009015802580001E001E10118021802E014
-:1008500002E1015A025A015A025A01590259010889
-:100860000208015802580001E001E10118021802D3
-:10087000E002E101620262015B025B010602060125
-:100880005E025E015802580001E001E10118021801
-:1008900002E002E101620262015B025B0104020408
-:1008A000015E025E015802580001E001E1011802F8
-:1008B0001802E002E101620262015B025B010502D3
-:1008C0000501590259015802580001E001E10118DF
-:1008D000021802E002E1015A025A015A025A015C6E
-:1008E000025C015B025B015802580001E001E1017A
-:1008F00018021802E002E1015A025A016202620182
-:10090000600260015A025A015802580001E001E1F8
-:100910000118021802E002E101620262015B025B5F
-:1009200001050205015F025F015802580001E00164
-:10093000E10118021802E002E101620262015B02B9
-:100940005B0105020501600260015802580001E0E8
-:1009500001E10118021802E002E101620262015B9A
-:10096000025B01610261010802080158025800019E
-:10097000E001E10118021802E002E10162026201F5
-:100980005B025B01060206015A025A015802580036
-:1009900001E001E10118021802E002E101620262D5
-:1009A000015B025B01040204016202620158025809
-:1009B0000001E001E10118021802E002E1015A021F
-:1009C0005A01620262015F025F015F025F01580229
-:1009D000580001E001E10118021802E002E10162A1
-:1009E0000262015B025B0105020501040204015879
-:1009F00002580001E001E10118021802E002E101E1
-:100A0000620262015B025B01050205015D025D019C
-:100A10005802580001E001E10118021802E002E169
-:100A200001620262015B025B01050205015E025E7A
-:100A3000015802580001E001E10118021802E00229
-:100A4000E101620262015B025B010502050107022E
-:100A500007015802580001E001E10118021802E004
-:100A600002E1015A025A01590259015D025D015C1D
-:100A7000025C015802580001E001E101180218026D
-:100A8000E002E101620262015B025B010502050115
-:100A90005B025B015802580001E001E101180218F5
-:100AA00002E002E1015A025A01590259015D025D58
-:100AB00001610261015802580001E001E1011802E0
-:100AC0001802E002E101620262015B025B010602C0
-:100AD0000601590259015802580001E001E10118CC
-:100AE000021802E002E101620262015B025B0106A0
-:100AF0000206015B025B015802580001E001E101BE
-:100B000018021802E002E10162026201620262015F
-:100B1000090209015F025F015802580001E001E18A
-:100B20000118021802E002E101620262015B025B4D
-:100B30000161026101070207015802580001E0014A
-:100B4000E10118021802E002E1015A025A016202B0
-:100B50006201600260015C025C015802580001E021
-:100B600001E10118021802E002E101620262015B88
-:100B7000025B010402040160026001580258000196
-:100B8000E001E10118021802E002E10162026201E3
-:100B90005B025B010402040161026101580258001A
-:100BA00001E001E10118021802E002E101620262C3
-:100BB0000162026201050205015A025A01580258F7
-:100BC0000001E001E10118021802E002E101620205
-:100BD00062015B025B0106020601620262015802C9
-:100BE000580001E001E10118021802E002E1015A97
-:100BF000025A0159025901610261015B025B01580D
-:100C000002580001E001E10118021802E002E101CE
-:100C10005A025A01620262015F025F015E025E01D6
-:100C20005802580001E001E10118021802E002E157
-:100C3000015A025A0159025901610261015A025ACC
-:100C4000015802580001E001E10118021802E00217
-:100C5000E1015A025A01620262015F025F015C0215
-:100C60005C015802580001E001E10118021802E09D
-:100C700002E1015A025A01620262016002600161EE
-:100C80000261015802580001E001E1011802180256
-:100C9000E002E101620262015B025B010602060101
-:100CA000600260015802580001E001E101180218D9
-:100CB00002E002E1015A025A01590259015D025D46
-:100CC000015D025D015802580001E001E1011802D6
-:100CD0001802E002E101620262015B025B01610253
-:100CE0006101610261015802580001E001E101184F
-:100CF000021802E002E1015A025A01620262016036
-:100D00000260015D025D015802580001E001E1014D
-:100D100018021802E002E101620262015B025B015B
-:100D2000050205015A025A015802580001E001E18A
-:100D30000118021802E002E101620262016202622D
-:100D40000105020501610261015802580001E0013C
-:100D5000E10118021802E002E1015A025A015A02A6
-:100D60005A01620262015C025C015802580001E013
-:100D700001E10118021802E002E101620262015B76
-:100D8000025B010502050108020801580258000132
-:100D9000E001E10118021802E002E1015A025A01E1
-:100DA000590259015D025D015B025B015802580066
-:100DB00001E001E10118021802E002E101620262B1
-:100DC000015B025B0105020501050205015802589D
-:100DD0000001E001E10118021802E002E1015A02FB
-:100DE0005A01590259015D025D01050205015802CF
-:100DF000580001E001E10118021802E002E1015A85
-:100E0000025A0162026201600260015B025B0158EA
-:100E100002580001E001E10118021802E002E101BC
-:100E2000620262015B025B01040204015902590182
-:100E30005802580001E001E10118021802E002E145
-:100E4000015A025A015902590161026101620262AA
-:100E5000015802580001E001E10118021802E00205
-:100E6000E101620262015B025B0105020501090208
-:100E700009015802580001E201570257016202625B
-:100E800001620262010502050107020702E2000198
-:100E9000E20157025701620262015B025B016102DB
-:100EA00061015C025C02E20001E201570257015A53
-:100EB000025A0162026201600260015E025E02E2A9
-:100EC0000001E20157025701620262015B025B010D
-:100ED000610261015B025B02E20001E2015702571D
-:100EE00001620262015B025B01610261015D025D00
-:100EF00002E20001E20157025701620262015B0255
-:100F00005B016102610106020602E20001E2015793
-:100F1000025701620262015B025B01040204015D8F
-:100F2000025D02E20001E201570257015A025A0132
-:100F3000620262015F025F0109020902E20001E24E
-:100F40000157025701620262015B025B01610261AB
-:100F50000105020502E20001E201570257016202A7
-:100F600062015B025B010502050161026102E200B0
-:100F700001E20157025701620262015B025B0161FB
-:100F800002610160026002E20001E20157025701C2
-:100F9000620262015B025B01060206015F025F0200
-:100FA000E20001E20157025701620262016202623D
-:100FB000010502050106020602E20001E2015702F4
-:100FC0005701620262015B025B01040204015C02E0
-:100FD0005C02E20001E201570257015A025A015A2B
-:100FE000025A016202620162026202E20001E2014F
-:100FF00057025701620262015B025B0104020401B5
-:101000005F025F02E20001E201570257015A025AF1
-:10101000015A025A015E025E0162026202E20001AE
-:10102000E20157025701620262015B025B010602A4
-:1010300006015D025D02E20001E201570257015A1A
-:10104000025A015A025A016202620161026102E21D
-:101050000001E201570257015A025A01620262017D
-:101060005F025F0162026202E20001E20157025781
-:10107000015A025A01620262015F025F016002606E
-:1010800002E20001E20157025701620262015B02C3
-:101090005B01610261015F025F02E20001E2015750
-:1010A000025701620262015B025B01610261015A47
-:1010B000025A02E20001E201570257015A025A01A4
-:1010C00062026201600260015F025F02E20001E20F
-:1010D0000157025701620262015B025B016102611A
-:1010E0000159025902E20001E201570257015A0276
-:1010F0005A01620262016002600160026002E20065
-:1011000001E20157025701620262015B025B016169
-:1011100002610104020402E20001E20157025701E8
-:10112000620262015B025B01050205010602060222
-:10113000E20001E20157025701620262015B025BB9
-:1011400001050205015C025C02E20001E2015702B6
-:1011500057015A025A01620262015F025F01610295
-:101160006102E20001E201570257015A025A015995
-:101170000259016102610159025902E20001E201D2
-:10118000570257015A025A015A025A016202620179
-:101190005D025D02E20001E2015702570162026254
-:1011A0000162026201050205015B025B02E20001CD
-:1011B000E201570257016202620162026201050206
-:1011C000050108020802E20001E20157025701622C
-:1011D000026201620262010502050159025902E23E
-:1011E0000001E201570257015A025A015A025A01FC
-:1011F000620262015B025B02E20001E201570257F8
-:10120000015A025A01620262015F025F015D025DE2
-:1012100002E20001E20157025701620262015B0231
-:101220005B01060206015C025C02E20001E201577A
-:10123000025701620262015B025B01610261015EB1
-:10124000025E02E20001E201570257015A025A010E
-:10125000620262016002600159025902E20001E289
-:101260000157025701620262015B025B010602063E
-:101270000161026102E20001E201570257016202CC
-:1012800062015B025B01040204015B025B02E2009B
-:1012900001E201570257015A025A016202620160DB
-:1012A00002600162026202E20001E201570257019C
-:1012B0006202620162026201070207015F025F02CD
-:1012C000E20001E201570257015A025A015A025A3A
-:1012D000016202620160026002E20001E201570263
-:1012E0005701620262015B025B0161026101090256
-:1012F0000902E20001E201570257015A025A015A5B
-:10130000025A015902590108020802E20001E201F1
-:1013100057025701620262015B025B01060206018D
-:101320005E025E02E20001E20157025701620262C0
-:10133000015B025B01040204015E025E02E2000145
-:10134000E20157025701620262015B025B01050282
-:10135000050159025902E20001E201570257015A00
-:10136000025A015A025A015C025C015B025B02E212
-:101370000001E201570257015A025A01620262015A
-:10138000600260015A025A02E20001E2015702576C
-:1013900001620262015B025B01050205015F025FFF
-:1013A00002E20001E20157025701620262015B02A0
-:1013B0005B010502050160026002E20001E20157E3
-:1013C000025701620262015B025B01610261010876
-:1013D000020802E20001E2015702570162026201C3
-:1013E0005B025B01060206015A025A02E20001E2B8
-:1013F0000157025701620262015B025B01040204B1
-:101400000162026202E20001E201570257015A0240
-:101410005A01620262015F025F015F025F02E20045
-:1014200001E20157025701620262015B025B0105A2
-:1014300002050104020402E20001E2015702570121
-:10144000620262015B025B01050205015D025D0251
-:10145000E20001E20157025701620262015B025B96
-:1014600001050205015E025E02E20001E20157028F
-:101470005701620262015B025B010502050107027E
-:101480000702E20001E201570257015A025A0159CC
-:101490000259015D025D015C025C02E20001E201B1
-:1014A00057025701620262015B025B0105020501FE
-:1014B0005B025B02E20001E201570257015A025A45
-:1014C00001590259015D025D0161026102E2000100
-:1014D000E20157025701620262015B025B010602F0
-:1014E000060159025902E20001E201570257016266
-:1014F0000262015B025B01060206015B025B02E223
-:101500000001E201570257016202620162026201B8
-:10151000090209015F025F02E20001E2015702577E
-:1015200001620262015B025B016102610107020765
-:1015300002E20001E201570257015A025A01620217
-:101540006201600260015C025C02E20001E201579C
-:10155000025701620262015B025B01040204016046
-:10156000026002E20001E2015702570162026201D9
-:101570005B025B010402040161026102E20001E21C
-:10158000015702570162026201620262010502050F
-:10159000015A025A02E20001E201570257016202B7
-:1015A00062015B025B010602060162026202E20066
-:1015B00001E201570257015A025A015902590161C9
-:1015C0000261015B025B02E20001E2015702570186
-:1015D0005A025A01620262015F025F015E025E020C
-:1015E000E20001E201570257015A025A0159025919
-:1015F00001610261015A025A02E20001E20157024E
-:1016000057015A025A01620262015F025F015C02E5
-:101610005C02E20001E201570257015A025A0162DC
-:101620000262016002600161026102E20001E20106
-:1016300057025701620262015B025B01060206016A
-:1016400060026002E20001E201570257015A025AA9
-:1016500001590259015D025D015D025D02E2000176
-:10166000E20157025701620262015B025B01610203
-:10167000610161026102E20001E201570257015A71
-:10168000025A0162026201600260015D025D02E2D3
-:101690000001E20157025701620262015B025B0135
-:1016A000050205015A025A02E20001E201570257FF
-:1016B00001620262016202620105020501610261CA
-:1016C00002E20001E201570257015A025A015A028E
-:1016D0005A01620262015C025C02E20001E201570F
-:1016E000025701620262015B025B0105020501080B
-:1016F000020802E20001E201570257015A025A01B0
-:10170000590259015D025D015B025B02E20001E2E8
-:101710000157025701620262015B025B010502058B
-:101720000105020502E20001E201570257015A02D7
-:101730005A01590259015D025D0105020502E200EC
-:1017400001E201570257015A025A01620262016026
-:101750000260015B025B02E20001E20157025701F5
-:10176000620262015B025B01040204015902590238
-:10177000E20001E201570257015A025A0159025987
-:10178000016102610162026202E20001E2015702AC
-:101790005701620262015B025B0105020501090259
-:1017A0000902E200055204520152035201000000F6
-:1017B0001E001B0018002F00010029001F0013004D
-:1017C0000C003300E300E1002000090004003400B5
-:1017D000E2002A0021001A0008000600E00065006F
-:1017E00022000A0012001900000049002E004A00E1
-:1017F00000004D00000002542E02025400002B0095
-:1018000000005E0023000B001600050000004C00E5
-:1018100024000D0011001000E2004B0025000E0016
-:101820001500360001002C0026000F0017003700BD
-:1018300050002800270014000700520051004E00FD
-:1018400035001C002D001D004F00000001000100AC
-:1018500001000100010000001E02300238020100F8
-:10186000010001001F026414380030000100010073
-:101870002002240223022702010001000100241497
-:1018800025140100010001000100271426140100A5
-:101890000000010001000100000001000000010043
-:1018A0000100010000000100000001000100310002
-:1018B00021022D1400000100010064002502220213
-:1018C000010001000100640226023602010001004D
-:1018D00001000100301437023830010035021F02C8
-:1018E0003102553002300100010001002D020100DB
-:1018F0003D30000001000100010001000100000076
-:101900003A00010001000100010001003B0001005C
-:1019100001000100010001003C0001000100010084
-:10192000010001003D000100010001000100010073
-:101930003E00010001000100000001004400010020
-:1019400000000100000001004500010000005300FC
-:10195000000001003F000100010001000000010043
-:1019600040005F005C00590062000100410060001F
-:101970005D005A0085000100420061005E005B00CE
-:101980006300010043005500560057005800010055
-:101990006700540056005700580000000100010085
-:1019A00001000100010000004D30393001005B30C2
-:1019B00001000100513058303C303B300100010043
-:1019C0005030013014145D30010001004A305930AC
-:1019D00008145C30010001004930573004300030F9
-:1019E00000000100053001000000010000000100BE
-:1019F0000100010000000100000001004F305A30DA
-:101A000037301E02000001004E3001004B30010053
-:101A100001000100483056305430533001000100BD
-:101A20004C30010003303A30010001005230010017
-:101A3000010001000100010001000100010001009E
-:101A40000100000001000100010001000100000090
-:101A500042302030343001000100010046302E3089
-:101A6000263033300100010045302D301E3001009A
-:101A70000100010040302B30223001000100010044
-:101A80003F3025302C300100000001000100010032
-:101A90000000010000000100010001000000010041
-:101AA000000001004430233031301F3000000100BD
-:101AB000433035302A302930010001003E302730D4
-:101AC0003030010001000100413028303230010087
-:101AD0000100010047300100213001000100010038
-:101AE0000100363024302F300100000001000100D9
-:101AF0000100010001000000010008301B3001005E
-:101B000001000100010015300D301A300100010004
-:101B10000100143006300100010001000100123004
-:101B20000A3001000100010001000C3013300100F7
-:101B300000000100010001000000010000000100A0
-:101B400001000100000001000000010001000B3055
-:101B5000183007300000010001001C301130103037
-:101B60000100010001000E301730010001000100EA
-:101B700001000F30193001000100010001000100D7
-:101B8000093001000100010001001D300100163084
-:101B9000010000000100010001000100010000003F
-:101BA000010001000100010001000100010001002D
-:101BB000010001000100010001000100010001001D
-:101BC000010001000100010001000100010001000D
-:101BD00001000100010001000000010001000100FE
-:101BE00000000100000001000100010000000100F0
-:101BF00000000100010001000100010000000100DF
-:101C000001000100010001000100010001000100CC
-:101C100001000100010001000100010001000100BC
-:101C200001000100010001000100010001000100AC
-:101C3000010001000100010001000000010001009D
-:101C4000010001000100000001000100010001008D
-:101C5000010001000100010001000100010001007C
-:101C6000010001000100010001000100010001006C
-:101C7000010001000100010001000100010001005C
-:101C8000000001000100010000000100000001004F