summaryrefslogtreecommitdiff
path: root/console-client/xkb
diff options
context:
space:
mode:
Diffstat (limited to 'console-client/xkb')
-rw-r--r--console-client/xkb/Compose441
-rw-r--r--console-client/xkb/MISSING-FEATURES32
-rw-r--r--console-client/xkb/README177
-rw-r--r--console-client/xkb/TODO7
-rw-r--r--console-client/xkb/compose.c422
-rw-r--r--console-client/xkb/default.xkb1316
-rw-r--r--console-client/xkb/keysymdef.h2016
-rw-r--r--console-client/xkb/ks_tables.h2380
-rw-r--r--console-client/xkb/kstoucs.c317
-rw-r--r--console-client/xkb/lex.l367
-rw-r--r--console-client/xkb/makeconf.sh26
-rw-r--r--console-client/xkb/parser.y1529
-rw-r--r--console-client/xkb/symname.c96
-rw-r--r--console-client/xkb/xkb-data/keymap/hurd347
-rw-r--r--console-client/xkb/xkb-data/symbols/hurd125
-rw-r--r--console-client/xkb/xkb-data/types/hurd18
-rw-r--r--console-client/xkb/xkb.c1859
-rw-r--r--console-client/xkb/xkb.h435
-rw-r--r--console-client/xkb/xkbdata.c456
-rw-r--r--console-client/xkb/xkbdefaults.c1318
-rw-r--r--console-client/xkb/xkbtimer.c236
21 files changed, 13920 insertions, 0 deletions
diff --git a/console-client/xkb/Compose b/console-client/xkb/Compose
new file mode 100644
index 00000000..1a6d8836
--- /dev/null
+++ b/console-client/xkb/Compose
@@ -0,0 +1,441 @@
+# $TOG: fcd8859-15 /main/2 1998/06/17 15:53:45 kaleb $
+#
+# ISO 8859-15 (Latin1) Compose Sequence
+#
+# $XFree86: xc/nls/Compose/iso8859-15,v 1.3 2000/10/27 18:30:51 dawes Exp $
+#
+# Sequence Definition
+#
+# <Multi_key> Means <Compose>
+# Special Character
+<Multi_key> <plus> <plus> : "#" numbersign
+<Multi_key> <apostrophe> <space> : "'" apostrophe
+<Multi_key> <space> <apostrophe> : "'" apostrophe
+<Multi_key> <A> <T> : "@" at
+<Multi_key> <parenleft> <parenleft> : "[" bracketleft
+<Multi_key> <slash> <slash> : "\\" backslash
+<Multi_key> <slash> <less> : "\\" backslash
+<Multi_key> <less> <slash> : "\\" backslash
+<Multi_key> <parenright> <parenright> : "]" bracketright
+<Multi_key> <asciicircum> <space> : "^" asciicircum
+<Multi_key> <space> <asciicircum> : "^" asciicircum
+<Multi_key> <greater> <space> : "^" asciicirum
+<Multi_key> <space> <greater> : "^" asciicirum
+<Multi_key> <grave> <space> : "`" grave
+<Multi_key> <space> <grave> : "`" grave
+<Multi_key> <parenleft> <minus> : "{" braceleft
+<Multi_key> <minus> <parenleft> : "{" braceleft
+<Multi_key> <slash> <asciicircum> : "|" bar
+<Multi_key> <asciicircum> <slash> : "|" bar
+<Multi_key> <V> <L> : "|" bar
+<Multi_key> <L> <V> : "|" bar
+<Multi_key> <v> <l> : "|" bar
+<Multi_key> <l> <v> : "|" bar
+<Multi_key> <parenright> <minus> : "}" braceright
+<Multi_key> <minus> <parenright> : "}" braceright
+<Multi_key> <asciitilde> <space> : "~" asciitilde
+<Multi_key> <space> <asciitilde> : "~" asciitilde
+<Multi_key> <minus> <space> : "~" asciitilde
+<Multi_key> <space> <minus> : "~" asciitilde
+<Multi_key> <exclam> <exclam> : "\241" exclamdown
+<Multi_key> <c> <slash> : "\242" cent
+<Multi_key> <slash> <c> : "\242" cent
+<Multi_key> <C> <slash> : "\242" cent
+<Multi_key> <slash> <C> : "\242" cent
+<Multi_key> <C> <bar> : "\242" cent
+<Multi_key> <bar> <C> : "\242" cent
+<Multi_key> <c> <bar> : "\242" cent
+<Multi_key> <bar> <c> : "\242" cent
+<Multi_key> <l> <minus> : "\243" sterling
+<Multi_key> <minus> <l> : "\243" sterling
+<Multi_key> <L> <minus> : "\243" sterling
+<Multi_key> <minus> <L> : "\243" sterling
+<Multi_key> <l> <equal> : "\243" sterling
+<Multi_key> <equal> <l> : "\243" sterling
+<Multi_key> <L> <equal> : "\243" sterling
+<Multi_key> <equal> <L> : "\243" sterling
+<Multi_key> <C> <equal> : "\244" EuroSign
+<Multi_key> <equal> <C> : "\244" EuroSign
+<Multi_key> <E> <equal> : "\244" EuroSign
+<Multi_key> <e> <equal> : "\244" EuroSign
+<Multi_key> <y> <minus> : "\245" yen
+<Multi_key> <minus> <y> : "\245" yen
+<Multi_key> <Y> <minus> : "\245" yen
+<Multi_key> <minus> <Y> : "\245" yen
+<Multi_key> <y> <equal> : "\245" yen
+<Multi_key> <equal> <y> : "\245" yen
+<Multi_key> <Y> <equal> : "\245" yen
+<Multi_key> <equal> <Y> : "\245" yen
+<Multi_key> <s> <o> : "\247" section
+<Multi_key> <o> <s> : "\247" section
+<Multi_key> <S> <O> : "\247" section
+<Multi_key> <O> <S> : "\247" section
+<Multi_key> <S> <exclam> : "\247" section
+<Multi_key> <exclam> <S> : "\247" section
+<Multi_key> <s> <exclam> : "\247" section
+<Multi_key> <exclam> <s> : "\247" section
+<Multi_key> <S> <0> : "\247" section
+<Multi_key> <0> <S> : "\247" section
+<Multi_key> <s> <0> : "\247" section
+<Multi_key> <0> <s> : "\247" section
+<Multi_key> <c> <o> : "\251" copyright
+<Multi_key> <o> <c> : "\251" copyright
+<Multi_key> <C> <O> : "\251" copyright
+<Multi_key> <O> <C> : "\251" copyright
+<Multi_key> <c> <O> : "\251" copyright
+<Multi_key> <O> <c> : "\251" copyright
+<Multi_key> <C> <o> : "\251" copyright
+<Multi_key> <o> <C> : "\251" copyright
+<Multi_key> <c> <0> : "\251" copyright
+<Multi_key> <0> <c> : "\251" copyright
+<Multi_key> <C> <0> : "\251" copyright
+<Multi_key> <0> <C> : "\251" copyright
+<Multi_key> <parenleft> <c> : "\251" copyright
+<Multi_key> <parenleft> <C> : "\251" copyright
+<Multi_key> <a> <underscore> : "\252" ordfeminine
+<Multi_key> <underscore> <a> : "\252" ordfeminine
+<Multi_key> <A> <underscore> : "\252" ordfeminine
+<Multi_key> <underscore> <A> : "\252" ordfeminine
+<Multi_key> <o> <underscore> : "\272" masculine
+<Multi_key> <underscore> <o> : "\272" masculine
+<Multi_key> <O> <underscore> : "\272" masculine
+<Multi_key> <underscore> <O> : "\272" masculine
+<Multi_key> <less> <less> : "\253" guillemotleft
+<Multi_key> <greater> <greater> : "\273" guillemotright
+<Multi_key> <0> <asciicircum> : "\260" degree
+<Multi_key> <asciicircum> <0> : "\260" degree
+<Multi_key> <0> <asterisk> : "\260" degree
+<Multi_key> <asterisk> <0> : "\260" degree
+<Multi_key> <plus> <minus> : "\261" plusminus
+<Multi_key> <minus> <plus> : "\261" plusminus
+<Multi_key> <slash> <u> : "\265" mu
+<Multi_key> <u> <slash> : "\265" mu
+<Multi_key> <slash> <U> : "\265" mu
+<Multi_key> <U> <slash> : "\265" mu
+<Multi_key> <1> <asciicircum> : "\271" onesuperior
+<Multi_key> <asciicircum> <1> : "\271" onesuperior
+<Multi_key> <S> <1> : "\271" onesuperior
+<Multi_key> <1> <S> : "\271" onesuperior
+<Multi_key> <s> <1> : "\271" onesuperior
+<Multi_key> <1> <s> : "\271" onesuperior
+<Multi_key> <2> <asciicircum> : "\262" twosuperior
+<Multi_key> <asciicircum> <2> : "\262" twosuperior
+<Multi_key> <S> <2> : "\262" twosuperior
+<Multi_key> <2> <S> : "\262" twosuperior
+<Multi_key> <s> <2> : "\262" twosuperior
+<Multi_key> <2> <s> : "\262" twosuperior
+<Multi_key> <3> <asciicircum> : "\263" threesuperior
+<Multi_key> <asciicircum> <3> : "\263" threesuperior
+<Multi_key> <S> <3> : "\263" threesuperior
+<Multi_key> <3> <S> : "\263" threesuperior
+<Multi_key> <s> <3> : "\263" threesuperior
+<Multi_key> <3> <s> : "\263" threesuperior
+<Multi_key> <p> <exclam> : "\266" paragraph
+<Multi_key> <exclam> <p> : "\266" paragraph
+<Multi_key> <P> <exclam> : "\266" paragraph
+<Multi_key> <exclam> <P> : "\266" paragraph
+<Multi_key> <period> <asciicircum> : "\267" periodcentered
+<Multi_key> <asciicircum> <period> : "\267" periodcentered
+<Multi_key> <period> <period> : "\267" periodcentered
+<Multi_key> <question> <question> : "\277" questiondown
+<Multi_key> <space> <space> : "\240" nobreakspace
+<Multi_key> <minus> <comma> : "\254" notsign
+<Multi_key> <comma> <minus> : "\254" notsign
+<Multi_key> <minus> <minus> : "\255" hyphen
+<Multi_key> <R> <O> : "\256" registered
+<Multi_key> <O> <R> : "\256" registered
+<Multi_key> <parenleft> <r> : "\256" registered
+<Multi_key> <minus> <asciicircum> : "\257" macron
+<Multi_key> <asciicircum> <minus> : "\257" macron
+<Multi_key> <underscore> <asciicircum> : "\257" macron
+<Multi_key> <asciicircum> <underscore> : "\257" macron
+<Multi_key> <underscore> <underscore> : "\257" macron
+<Multi_key> <minus> <colon> : "\367" division
+<Multi_key> <colon> <minus> : "\367" division
+<Multi_key> <x> <x> : "\327" multiply
+<Multi_key> <apostrophe> <apostrophe> : "'" apostrophe
+<Multi_key> <quotedbl> <quotedbl> : "\"" quotedbl
+# Accented Alphabet
+<Multi_key> <A> <grave> : "\300" Agrave
+<Multi_key> <grave> <A> : "\300" Agrave
+<Multi_key> <A> <acute> : "\301" Aacute
+<Multi_key> <acute> <A> : "\301" Aacute
+<Multi_key> <A> <apostrophe> : "\301" Aacute
+<Multi_key> <apostrophe> <A> : "\301" Aacute
+<Multi_key> <A> <asciicircum> : "\302" Acircumflex
+<Multi_key> <asciicircum> <A> : "\302" Acircumflex
+<Multi_key> <A> <greater> : "\302" Acircumflex
+<Multi_key> <greater> <A> : "\302" Acircumflex
+<Multi_key> <A> <asciitilde> : "\303" Atilde
+<Multi_key> <asciitilde> <A> : "\303" Atilde
+<Multi_key> <A> <minus> : "\303" Atilde
+<Multi_key> <minus> <A> : "\303" Atilde
+<Multi_key> <A> <quotedbl> : "\304" Adiaeresis
+<Multi_key> <quotedbl> <A> : "\304" Adiaeresis
+<Multi_key> <A> <asterisk> : "\305" Aring
+<Multi_key> <asterisk> <A> : "\305" Aring
+<Multi_key> <A> <A> : "\305" Aring
+<Multi_key> <A> <O> : "\305" Aring
+<Multi_key> <A> <E> : "\306" AE
+<Multi_key> <a> <grave> : "\340" agrave
+<Multi_key> <grave> <a> : "\340" agrave
+<Multi_key> <a> <acute> : "\341" aacute
+<Multi_key> <acute> <a> : "\341" aacute
+<Multi_key> <a> <apostrophe> : "\341" aacute
+<Multi_key> <apostrophe> <a> : "\341" aacute
+<Multi_key> <a> <asciicircum> : "\342" acircumflex
+<Multi_key> <asciicircum> <a> : "\342" acircumflex
+<Multi_key> <a> <greater> : "\342" acircumflex
+<Multi_key> <greater> <a> : "\342" acircumflex
+<Multi_key> <a> <asciitilde> : "\343" atilde
+<Multi_key> <asciitilde> <a> : "\343" atilde
+<Multi_key> <a> <minus> : "\343" atilde
+<Multi_key> <minus> <a> : "\343" atilde
+<Multi_key> <a> <quotedbl> : "\344" adiaeresis
+<Multi_key> <quotedbl> <a> : "\344" adiaeresis
+<Multi_key> <a> <asterisk> : "\345" aring
+<Multi_key> <asterisk> <a> : "\345" aring
+<Multi_key> <a> <a> : "\345" aring
+<Multi_key> <a> <o> : "\345" aring
+<Multi_key> <a> <e> : "\346" ae
+<Multi_key> <acute> <C> : "\307" Ccedilla
+<Multi_key> <acute> <c> : "\347" ccedilla
+<Multi_key> <C> <comma> : "\307" Ccedilla
+<Multi_key> <comma> <C> : "\307" Ccedilla
+<Multi_key> <c> <comma> : "\347" ccedilla
+<Multi_key> <comma> <c> : "\347" ccedilla
+<Multi_key> <minus> <D> : "\320" ETH
+<Multi_key> <D> <minus> : "\320" ETH
+<Multi_key> <minus> <d> : "\360" eth
+<Multi_key> <d> <minus> : "\360" eth
+<Multi_key> <E> <grave> : "\310" Egrave
+<Multi_key> <grave> <E> : "\310" Egrave
+<Multi_key> <E> <acute> : "\311" Eacute
+<Multi_key> <acute> <E> : "\311" Eacute
+<Multi_key> <E> <apostrophe> : "\311" Eacute
+<Multi_key> <apostrophe> <E> : "\311" Eacute
+<Multi_key> <E> <asciicircum> : "\312" Ecircumflex
+<Multi_key> <asciicircum> <E> : "\312" Ecircumflex
+<Multi_key> <E> <greater> : "\312" Ecircumflex
+<Multi_key> <greater> <E> : "\312" Ecircumflex
+<Multi_key> <E> <quotedbl> : "\313" Ediaeresis
+<Multi_key> <quotedbl> <E> : "\313" Ediaeresis
+<Multi_key> <e> <grave> : "\350" egrave
+<Multi_key> <grave> <e> : "\350" egrave
+<Multi_key> <e> <acute> : "\351" eacute
+<Multi_key> <acute> <e> : "\351" eacute
+<Multi_key> <e> <apostrophe> : "\351" eacute
+<Multi_key> <apostrophe> <e> : "\351" eacute
+<Multi_key> <e> <asciicircum> : "\352" ecircumflex
+<Multi_key> <asciicircum> <e> : "\352" ecircumflex
+<Multi_key> <e> <greater> : "\352" ecircumflex
+<Multi_key> <greater> <e> : "\352" ecircumflex
+<Multi_key> <e> <quotedbl> : "\353" ediaeresis
+<Multi_key> <quotedbl> <e> : "\353" ediaeresis
+<Multi_key> <I> <grave> : "\314" Igrave
+<Multi_key> <grave> <I> : "\314" Igrave
+<Multi_key> <I> <acute> : "\315" Iacute
+<Multi_key> <acute> <I> : "\315" Iacute
+<Multi_key> <I> <apostrophe> : "\315" Iacute
+<Multi_key> <apostrophe> <I> : "\315" Iacute
+<Multi_key> <I> <asciicircum> : "\316" Icircumflex
+<Multi_key> <asciicircum> <I> : "\316" Icircumflex
+<Multi_key> <I> <greater> : "\316" Icircumflex
+<Multi_key> <greater> <I> : "\316" Icircumflex
+<Multi_key> <I> <quotedbl> : "\317" Idiaeresis
+<Multi_key> <quotedbl> <I> : "\317" Idiaeresis
+<Multi_key> <i> <grave> : "\354" igrave
+<Multi_key> <grave> <i> : "\354" igrave
+<Multi_key> <i> <acute> : "\355" iacute
+<Multi_key> <acute> <i> : "\355" iacute
+<Multi_key> <i> <apostrophe> : "\355" iacute
+<Multi_key> <apostrophe> <i> : "\355" iacute
+<Multi_key> <i> <asciicircum> : "\356" icircumflex
+<Multi_key> <asciicircum> <i> : "\356" icircumflex
+<Multi_key> <i> <greater> : "\356" icircumflex
+<Multi_key> <greater> <i> : "\356" icircumflex
+<Multi_key> <i> <quotedbl> : "\357" idiaeresis
+<Multi_key> <quotedbl> <i> : "\357" idiaeresis
+<Multi_key> <N> <asciitilde> : "\321" Ntilde
+<Multi_key> <asciitilde> <N> : "\321" Ntilde
+<Multi_key> <N> <minus> : "\321" Ntilde
+<Multi_key> <minus> <N> : "\321" Ntilde
+<Multi_key> <n> <asciitilde> : "\361" ntilde
+<Multi_key> <asciitilde> <n> : "\361" ntilde
+<Multi_key> <n> <minus> : "\361" ntilde
+<Multi_key> <minus> <n> : "\361" ntilde
+<Multi_key> <O> <grave> : "\322" Ograve
+<Multi_key> <grave> <O> : "\322" Ograve
+<Multi_key> <O> <acute> : "\323" Oacute
+<Multi_key> <acute> <O> : "\323" Oacute
+<Multi_key> <O> <apostrophe> : "\323" Oacute
+<Multi_key> <apostrophe> <O> : "\323" Oacute
+<Multi_key> <O> <asciicircum> : "\324" Ocircumflex
+<Multi_key> <asciicircum> <O> : "\324" Ocircumflex
+<Multi_key> <O> <greater> : "\324" Ocircumflex
+<Multi_key> <greater> <O> : "\324" Ocircumflex
+<Multi_key> <O> <asciitilde> : "\325" Otilde
+<Multi_key> <asciitilde> <O> : "\325" Otilde
+<Multi_key> <O> <minus> : "\325" Otilde
+<Multi_key> <minus> <O> : "\325" Otilde
+<Multi_key> <O> <quotedbl> : "\326" Odiaeresis
+<Multi_key> <quotedbl> <O> : "\326" Odiaeresis
+<Multi_key> <O> <slash> : "\330" Ooblique
+<Multi_key> <slash> <O> : "\330" Ooblique
+<Multi_key> <O> <E> : "\274" OE
+<Multi_key> <o> <grave> : "\362" ograve
+<Multi_key> <grave> <o> : "\362" ograve
+<Multi_key> <o> <acute> : "\363" oacute
+<Multi_key> <acute> <o> : "\363" oacute
+<Multi_key> <o> <apostrophe> : "\363" oacute
+<Multi_key> <apostrophe> <o> : "\363" oacute
+<Multi_key> <o> <asciicircum> : "\364" ocircumflex
+<Multi_key> <asciicircum> <o> : "\364" ocircumflex
+<Multi_key> <o> <greater> : "\364" ocircumflex
+<Multi_key> <greater> <o> : "\364" ocircumflex
+<Multi_key> <o> <asciitilde> : "\365" otilde
+<Multi_key> <asciitilde> <o> : "\365" otilde
+<Multi_key> <o> <minus> : "\365" otilde
+<Multi_key> <minus> <o> : "\365" otilde
+<Multi_key> <o> <quotedbl> : "\366" odiaeresis
+<Multi_key> <quotedbl> <o> : "\366" odiaeresis
+<Multi_key> <o> <slash> : "\370" oslash
+<Multi_key> <slash> <o> : "\370" oslash
+<Multi_key> <o> <e> : "\275" oe
+<Multi_key> <S> <less> : "\246" Scaron
+<Multi_key> <less> <S> : "\246" Scaron
+<Multi_key> <s> <less> : "\250" scaron
+<Multi_key> <less> <s> : "\250" scaron
+<Multi_key> <U> <grave> : "\331" Ugrave
+<Multi_key> <grave> <U> : "\331" Ugrave
+<Multi_key> <U> <acute> : "\332" Uacute
+<Multi_key> <acute> <U> : "\332" Uacute
+<Multi_key> <U> <apostrophe> : "\332" Uacute
+<Multi_key> <apostrophe> <U> : "\332" Uacute
+<Multi_key> <U> <asciicircum> : "\333" Ucircumflex
+<Multi_key> <asciicircum> <U> : "\333" Ucircumflex
+<Multi_key> <U> <greater> : "\333" Ucircumflex
+<Multi_key> <greater> <U> : "\333" Ucircumflex
+<Multi_key> <U> <quotedbl> : "\334" Udiaeresis
+<Multi_key> <quotedbl> <U> : "\334" Udiaeresis
+<Multi_key> <u> <grave> : "\371" ugrave
+<Multi_key> <grave> <u> : "\371" ugrave
+<Multi_key> <u> <acute> : "\372" uacute
+<Multi_key> <acute> <u> : "\372" uacute
+<Multi_key> <u> <apostrophe> : "\372" uacute
+<Multi_key> <apostrophe> <u> : "\372" uacute
+<Multi_key> <u> <asciicircum> : "\373" ucircumflex
+<Multi_key> <asciicircum> <u> : "\373" ucircumflex
+<Multi_key> <u> <greater> : "\373" ucircumflex
+<Multi_key> <greater> <u> : "\373" ucircumflex
+<Multi_key> <u> <quotedbl> : "\374" udiaeresis
+<Multi_key> <quotedbl> <u> : "\374" udiaeresis
+<Multi_key> <s> <s> : "\337" ssharp
+<Multi_key> <T> <H> : "\336" THORN
+<Multi_key> <t> <h> : "\376" thorn
+<Multi_key> <Y> <acute> : "\335" Yacute
+<Multi_key> <acute> <Y> : "\335" Yacute
+<Multi_key> <Y> <apostrophe> : "\335" Yacute
+<Multi_key> <apostrophe> <Y> : "\335" Yacute
+<Multi_key> <Y> <quotedbl> : "\276" Ydiaeresis
+<Multi_key> <quotedbl> <Y> : "\276" Ydiaeresis
+<Multi_key> <y> <acute> : "\375" yacute
+<Multi_key> <acute> <y> : "\375" yacute
+<Multi_key> <y> <apostrophe> : "\375" yacute
+<Multi_key> <apostrophe> <y> : "\375" yacute
+<Multi_key> <y> <quotedbl> : "\377" ydiaeresis
+<Multi_key> <quotedbl> <y> : "\377" ydiaeresis
+<Multi_key> <Z> <less> : "\264" Zcaron
+<Multi_key> <less> <Z> : "\264" Zcaron
+<Multi_key> <z> <less> : "\270" zcaron
+<Multi_key> <less> <z> : "\270" zcaron
+#
+# dead key accent keysyms
+# Special Character
+<dead_circumflex> <slash> : "|" bar
+<dead_grave> <space> : "`" grave
+<dead_acute> <space> : "'" apostrophe
+<dead_diaeresis> <space> : "\"" quotedbl
+<dead_circumflex> <space> : "^" asciicircum
+<dead_circumflex> <dead_circumflex> : "^" asciicircum
+<dead_tilde> <space> : "~" asciitilde
+<dead_tilde> <dead_tilde> : "~" asciitilde
+<dead_circumflex> <0> : "\260" degree
+<dead_circumflex> <1> : "\271" onesuperior
+<dead_circumflex> <2> : "\262" twosuperior
+<dead_circumflex> <3> : "\263" threesuperior
+<dead_circumflex> <period> : "\267" periodcentered
+<dead_cedilla> <minus> : "\254" notsign
+<dead_circumflex> <minus> : "\257" macron
+<dead_circumflex> <underscore> : "\257" macron
+<dead_acute> <apostrophe> : "'" apostrophe
+<dead_diaeresis> <quotedbl> : "\"" quotedbl
+# Accented Alphabet
+<dead_abovering> <A> : "\305" Aring
+<dead_grave> <A> : "\300" Agrave
+<dead_acute> <A> : "\301" Aacute
+<dead_circumflex> <A> : "\302" Acircumflex
+<dead_tilde> <A> : "\303" Atilde
+<dead_diaeresis> <A> : "\304" Adiaeresis
+<dead_abovering> <a> : "\345" aring
+<dead_grave> <a> : "\340" agrave
+<dead_acute> <a> : "\341" aacute
+<dead_circumflex> <a> : "\342" acircumflex
+<dead_tilde> <a> : "\343" atilde
+<dead_diaeresis> <a> : "\344" adiaeresis
+<dead_cedilla> <C> : "\307" Ccedilla
+<dead_cedilla> <c> : "\347" ccedilla
+<dead_grave> <E> : "\310" Egrave
+<dead_acute> <E> : "\311" Eacute
+<dead_circumflex> <E> : "\312" Ecircumflex
+<dead_diaeresis> <E> : "\313" Ediaeresis
+<dead_grave> <e> : "\350" egrave
+<dead_acute> <e> : "\351" eacute
+<dead_circumflex> <e> : "\352" ecircumflex
+<dead_diaeresis> <e> : "\353" ediaeresis
+<dead_grave> <I> : "\314" Igrave
+<dead_acute> <I> : "\315" Iacute
+<dead_circumflex> <I> : "\316" Icircumflex
+<dead_diaeresis> <I> : "\317" Idiaeresis
+<dead_grave> <i> : "\354" igrave
+<dead_acute> <i> : "\355" iacute
+<dead_circumflex> <i> : "\356" icircumflex
+<dead_diaeresis> <i> : "\357" idiaeresis
+<dead_tilde> <N> : "\321" Ntilde
+<dead_tilde> <n> : "\361" ntilde
+<dead_grave> <O> : "\322" Ograve
+<dead_acute> <O> : "\323" Oacute
+<dead_circumflex> <O> : "\324" Ocircumflex
+<dead_tilde> <O> : "\325" Otilde
+<dead_diaeresis> <O> : "\326" Odiaeresis
+<dead_grave> <o> : "\362" ograve
+<dead_acute> <o> : "\363" oacute
+<dead_circumflex> <o> : "\364" ocircumflex
+<dead_tilde> <o> : "\365" otilde
+<dead_diaeresis> <o> : "\366" odiaeresis
+<dead_caron> <S> : "\246" Scaron
+<dead_caron> <s> : "\250" scaron
+<dead_circumflex> <S> : "\246" Scaron
+<dead_circumflex> <s> : "\250" scaron
+<dead_grave> <U> : "\331" Ugrave
+<dead_acute> <U> : "\332" Uacute
+<dead_circumflex> <U> : "\333" Ucircumflex
+<dead_diaeresis> <U> : "\334" Udiaeresis
+<dead_grave> <u> : "\371" ugrave
+<dead_acute> <u> : "\372" uacute
+<dead_circumflex> <u> : "\373" ucircumflex
+<dead_diaeresis> <u> : "\374" udiaeresis
+<dead_acute> <Y> : "\335" Yacute
+<dead_diaeresis> <Y> : "\276" Ydiaeresis
+<dead_acute> <y> : "\375" yacute
+<dead_diaeresis> <y> : "\377" ydiaeresis
+<dead_caron> <Z> : "\264" Zcaron
+<dead_caron> <z> : "\270" zcaron
+<dead_circumflex> <Z> : "\264" Zcaron
+<dead_circumflex> <z> : "\270" zcaron
+# Useful for portuguese language
+<dead_acute> <C> : "\307" Ccedilla
+<dead_acute> <c> : "\347" ccedilla
+<dead_acute> <dead_acute> : "'" apostrophe
+<dead_grave> <dead_grave> : "`" grave
+# End of Sequence Definition
diff --git a/console-client/xkb/MISSING-FEATURES b/console-client/xkb/MISSING-FEATURES
new file mode 100644
index 00000000..237c13d7
--- /dev/null
+++ b/console-client/xkb/MISSING-FEATURES
@@ -0,0 +1,32 @@
+Required for 100% compatibility with XKB:
+
+- Jukebox (possibility that this won't ever be done)
+- Loading the keydatabase
+- Proper indicator support
+- ISOLock
+- key lock
+- radio groups
+- overlays
+- Latching (properly, mostly works)
+- Enabling/disabling controls
+- The following controls are not implemented at all:
+ - SlowKeys
+ - BounceKeys
+ - StickyKeys
+ - MouseKeysAccel
+ - AccesXKeys
+ - AccesXTimeout
+ - AccessXFreedback (jukebox required)
+ - Overlay1 + Overlay2
+ - AudibleBell
+ - IgnoreGroupLock
+ - EnabledControls
+
+Hurd features:
+
+- Binding a string to a key (requires new action)
+ (It should be possible to insert this on other vcs too)
+- Binding executable to a key (requires new action)
+
+I'm sure I forgot some missing features, please report them:
+metgerards@student.han.nl
diff --git a/console-client/xkb/README b/console-client/xkb/README
new file mode 100644
index 00000000..56895b88
--- /dev/null
+++ b/console-client/xkb/README
@@ -0,0 +1,177 @@
+-- Some random notes about the XKB input driver. --
+
+This XKB input driver can be compared with the pc_kbd input driver, it
+has the same function. But this input driver has many advantages. It
+can load XKB configuration files. XKB configuration files, the keymap
+files currently used in XFree, are very versatile.
+
+One of the biggest advantages of using XKB configurations is that both
+the Hurd and XFree work simular. Another advantage is that it has many
+features:
+
+* Human readable configuration files with mechanisms like include
+ files, replacing keys, etc.
+
+* Many shift levels, all configurable per key type.
+
+* Support for four groups. These groups can be used for things like
+ additional alphabets.
+
+* Accessibility features like SlowKeys, StickyKeys, etc.
+
+* Dynamic behaviour; the user can define how all keys and indicators operate.
+
+
+Most support for basic operation have been implemented. Still there
+are many things not implemented. If some of these things are really
+important to you, please tell me!
+
+List of not implemented XKB features:
+
+* Accessibility and software repeat.
+* Jukebox support (user configurable audible messages)
+* Key database; loading new keynames from the X key database.
+* Error handling; partially done.
+* Indicators (Keyboard LEDs, etc.) not working, partially implemented.
+* ISOLock not implemented.
+* Key repeater for >> X.
+* No support for non UTF-8 locales.
+* No support for rarely used features (Many of they don't even work in
+ X AFAIK).
+* Many other stuff doesn't work (lock, radio group, overlays, etc.).
+ If I forgot something important, please report it :)
+
+* The scanner and parser are still ugly and far from optimal!
+
+---
+
+Installation:
+
+You need gcc, binutils and the glibc- and GNUMach headerfiles to
+compile this. If you want to generate the scanner and parser yourself
+you need bison and flex, but this is not required because I included
+the generated files.
+
+Run "make" to compile it. This will result in xkb.so.0.3, the actual
+plugin. Copy this file to the console-client driver directory (For the
+current Hurd version this is /lib/hurd/console).
+
+--
+
+Using it:
+
+To use it you need XKB configuration files. These are included with
+XFree and will be placed in /etc/X11/xkb on most systems.
+
+You can replace "pc_kbd" in your console client startup line with
+"xkb" and it will work with the default configuration. If you want a
+non-default configuration these options exists:
+
+--xkbdir : The root directory of the xkb configuration, by default
+ this is /etc/X11/xkb.
+
+--keymapfile : The file that hold the descriptions of the default
+ keymaps file. This file holds the description of all keymaps. This
+ path should be relative to the path set by `xkbdir'. By default
+ "keymap/xfree86" is used.
+
+--keymap : The keymap to use. By default en_US is used. Examples of
+ some other keymaps are: fr, us, de, dvorak.
+
+--ctrlaltbs : CTRL+Alt+Backspace will exit the console client.
+--no-ctrlaltbs : CTRL+Alt+Backspace will not exit the console client.
+
+
+By default console switching, etc. is not possible. I wrote some XKB
+extensions and configuration files to use these extensions. You can
+find these files in the xkb directory in the tarball. Copy these files
+to where your XKB configuration files are (usually /etc/X11/xkb).
+
+for example: xkb/keymap/hurd will be copied to /etc/X11/xkb/keymap.
+
+To use these extensions you have to use the hurd keymaps file. This
+holds all keymaps extended with Hurd features. Use "--keymapfile
+keymap/hurd" to select this file.
+
+After that you can use these keybindings:
+
+Alt + F1...F12: Switch VC.
+
+Alt + Left, Right: Switch to the console left or right of the current
+ console.
+
+Alt + Up, Down: Scroll the console by one line up or down.
+Ctrl + PgUp, PgDown: Scroll the console up or down with 1/2 screen.
+
+Alt + Home: Scroll the console to the 0% of the scrollback buffer.
+Ctrl + Home: Scroll the console to the 25% of the scrollback buffer.
+Alt + End: Scroll the console to the 100% of the scrollback buffer.
+Alt + End: Scroll the console to the 75% of the scrollback buffer.
+
+--
+
+Hurd features:
+
+If you want to use the Hurd features yourself make sure you put the
+changes in files that are not used by Xfree because it cannot parse
+these options. See how I did it for the configuration described in the
+previous paragraph.
+
+Function list:
+
+--
+ConsScroll: scroll the console x lines or to a fixed position.
+
+parameters:
+Screen = pos : Scroll to screen #pos.
+Screen += i : Scroll i screens up.
+Screen -= i : Scroll i screens down.
+line = pos : Scroll to line #pos.
+line += i : Scroll i lines up.
+line -= i : Scroll i lines down.
+percent = percentage : Scroll to PERCENTAGE % of the scrollback
+ buffer.
+
+Example:
+ConsScroll (screen += 0.5) --> Scroll down a 1/2 screen.
+
+--
+SwitchScreen: Switch to a VC.
+
+paramaters:
+screen = i : Switch to VC #i.
+screen += i : Switch to #i consoles to the right.
+screen -= i : Switch to #i consoles to the left.
+
+sameserver is a flag that will be added. I want to use it to switch to
+external consoles like X servers and SVGALib screens.
+
+example:
+SwitchScreen (screen += 1) --> Switch to the console right of the
+ current console.
+
+
+--
+More functions will be added. One to send keysyms to other VCs (can be
+usefull to control a mixer, ogg vorbis player, etc.). It should also
+be capable of inserting often used strings like "apfelkorn" :).
+
+A function to call the configuration dialog should be added.
+
+Functions to execute things should be added. Think about binding the
+reboot command to Ctrl+Alt+Delete for example. Wolfgang also asked me
+for scheme support, but I don't know enough about scheme to know what
+cool stuff is possible with this (I don't know scheme... Hey! Not
+everyone can be perfect ;)).
+
+Perhaps functions can be added to control the console client in other
+ways.
+
+More ideas would be interesting to hear :)
+
+--
+
+Enjoy this stuff and please send me many bug reports :)
+
+Marco Gerards
+(metgerards@student.han.nl)
diff --git a/console-client/xkb/TODO b/console-client/xkb/TODO
new file mode 100644
index 00000000..275cbaf5
--- /dev/null
+++ b/console-client/xkb/TODO
@@ -0,0 +1,7 @@
+For release:
+
+Indicators.
+Use libihash.
+Better memory handling.
+Better debug output
+CLEAN UP!
diff --git a/console-client/xkb/compose.c b/console-client/xkb/compose.c
new file mode 100644
index 00000000..38bcb47b
--- /dev/null
+++ b/console-client/xkb/compose.c
@@ -0,0 +1,422 @@
+/* compose.c -- Keysym composing
+
+ Copyright (C) 2003 Marco Gerards
+
+ Written by Marco Gerards <metgerards@student.han.nl>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "keysymdef.h"
+#include "xkb.h"
+#include <ctype.h>
+#include <string.h>
+
+#define NoSymbol 0
+
+/* Tokens that can be recognised by the scanner. */
+enum tokentype
+ {
+ UNKNOWN,
+ EOL,
+ REQKS,
+ SEMICOL,
+ STR,
+ PRODKS,
+ END
+ };
+
+/* The current token. */
+struct token
+{
+ enum tokentype toktype;
+ char value[50];
+} tok;
+
+/* The linenumber of the line currently parsed, used for returning
+ errors and warnings. */
+static int linenum;
+
+/* Read a token from the file CF. */
+static void
+read_token (FILE *cf)
+{
+ int c = fgetc (cf);
+ int pos = 0;
+
+ /* Remove whitespaces. */
+ while (c == ' ' || c == '\t')
+ c = fgetc (cf);
+
+ /* Comment, remove until end of line and return a EOL token. */
+ if (c == '#')
+ {
+ while (c != '\n')
+ c = fgetc (cf);
+ tok.toktype = EOL;
+ linenum++;
+ return;
+ }
+
+ /* End of file. */
+ if (c == EOF)
+ {
+ tok.toktype = END;
+ return;
+ }
+
+ /* Semicolon. */
+ if (c == ':')
+ {
+ tok.toktype = SEMICOL;
+ return;
+ }
+
+ /* End of line. */
+ if (c == '\n')
+ {
+ linenum++;
+ tok.toktype = EOL;
+ return;
+ }
+
+
+ /* Required keysym. */
+ if (c == '<')
+ {
+ while ((c = fgetc (cf)) != '>')
+ tok.value[pos++] = c;
+ tok.value[pos] = '\0';
+ tok.toktype = REQKS;
+ return;
+ }
+
+ /* Character string. */
+ if (c == '"')
+ {
+ while ((c = fgetc (cf)) != '"')
+ {
+ if (c == '\\')
+ c = fgetc (cf);
+
+ tok.value[pos++] = c;
+ }
+ tok.value[pos] = '\0';
+ tok.toktype = STR;
+ return;
+ }
+
+ /* Produced keysym. */
+ if (isalpha (c))
+ {
+ tok.value[pos++] = c;
+ while (isgraph (c = fgetc (cf)))
+ tok.value[pos++] = c;
+ tok.value[pos] = '\0';
+ tok.toktype = PRODKS;
+ ungetc (c, cf);
+ return;
+ }
+
+ /* Unknown token. */
+ tok.toktype = UNKNOWN;
+ return;
+}
+
+/* Compose sequence. */
+struct compose
+{
+ struct compose *left;
+ struct compose *right;
+ symbol *expected;
+ symbol produced;
+} *compose_tree;
+
+
+/* Compare symbol sequence s1 to symbol sequence s1. This function
+ works just like the strcmp function. */
+static int
+symbolscmp (symbol *s1, symbol *s2)
+{
+ while (*s1 && *s2 && (*s1 == *s2))
+ {
+ s1++;s2++;
+ }
+ if (*s1 < *s2)
+ return -1;
+ if (*s1 > *s2)
+ return 1;
+ return 0;
+}
+
+/* Compare symbol sequence s1 to symbol sequence s1, compare a maximum
+ of N symbols. This function works just like the strcmp function.
+ */
+static int
+symbolsncmp (symbol *s1, symbol *s2, int n)
+{
+ int cnt = 0;
+ while (*s1 && *s2 && (*s1 == *s2))
+ {
+ if (++cnt == n)
+ break;
+ s1++;s2++;
+ }
+
+ if (*s1 < *s2)
+ return -1;
+ if (*s1 > *s2)
+ return 1;
+ return 0;
+}
+
+
+/* Add the compose sequence EXP to the binary tree, store RESULT as
+ the keysym produced by EXP. */
+static struct compose *
+composetree_add (struct compose *tree, symbol *exp, symbol result)
+{
+ int cmp;
+
+ if (tree == NULL)
+ {
+ tree = malloc (sizeof (struct compose));
+ tree->expected = exp;
+ tree->produced = result;
+ tree->left = tree->right = NULL;
+
+ return tree;
+ }
+
+ cmp = symbolscmp (exp, tree->expected);
+ if (cmp == 0)
+ {
+ printf ("Warning: line %d: Double sequence.\n", linenum);
+ free (exp);
+ }
+ else if (cmp < 0)
+ tree->left = composetree_add (tree->left, exp, result);
+ else
+ tree->right = composetree_add (tree->right, exp, result);
+ return tree;
+}
+
+/* Parse the composefile CF and put all sequences in the binary tree
+ COMPOSE_TREE. This function may never fail because of syntactical or
+ lexalical errors, generate a warning instead. */
+static error_t
+parse_composefile (FILE *cf)
+{
+ void skip_line (void)
+ {
+ while (tok.toktype != EOL && tok.toktype != END)
+ read_token (cf);
+ }
+
+ for (;;)
+ {
+ /* Expected keysyms. */
+ symbol exp[50];
+ symbol *exps;
+ size_t expcnt = 0;
+ symbol sym;
+
+ read_token (cf);
+ /* Blank line. */
+ if (tok.toktype == EOL)
+ continue;
+
+ /* End of file, done parsing. */
+ if (tok.toktype == END)
+ return 0;
+
+ if (tok.toktype != REQKS)
+ {
+ printf ("Warning: line %d: Keysym expected on beginning of line.\n",
+ linenum);
+ skip_line ();
+ continue;
+ }
+
+ /* Keysym was recognised, add it. */
+ sym = XStringToKeysym (tok.value);
+ if (!sym)
+ {
+ printf ("Warning: line %d: Unknown keysym \"%s\".\n", linenum,
+ tok.value);
+ skip_line ();
+ continue;
+ }
+ exp[expcnt++] = sym;
+
+ do
+ {
+ read_token (cf);
+ /* If another required keysym is recognised, add it. */
+ if (tok.toktype == REQKS)
+ {
+ sym = XStringToKeysym (tok.value);
+ if (!sym)
+ {
+ printf ("Warning: line %d: Unknown keysym \"%s\".\n",
+ linenum, tok.value);
+ skip_line ();
+ continue;
+ }
+ exp[expcnt++] = sym;
+ }
+ } while (tok.toktype == REQKS);
+
+ if (tok.toktype != SEMICOL)
+ {
+ printf ("Warning: line %d: Semicolon expected.\n", linenum);
+ skip_line ();
+ continue;
+ }
+
+ read_token (cf);
+ /* Force token and ignore it. */
+ if (tok.toktype != STR)
+ {
+ printf ("Warning: line %d: string expected.\n", linenum);
+ skip_line ();
+ continue;
+ }
+
+ read_token (cf);
+ if (tok.toktype != PRODKS)
+ {
+ printf ("Warning: line %d: keysym expected.\n", linenum);
+ skip_line ();
+ continue;
+ }
+ sym = XStringToKeysym (tok.value);
+ if (!sym)
+ {
+ printf ("Warning: line %d: Unknown keysym \"%s\".\n", linenum,
+ tok.value);
+ skip_line ();
+ continue;
+ }
+
+ read_token (cf);
+ if (tok.toktype != EOL && tok.toktype != END)
+ {
+ printf ("Warning: line %d: end of line or end of file expected.\n",
+ linenum);
+ skip_line ();
+ continue;
+ }
+
+ /* Add the production rule. */
+ exp[expcnt++] = 0;
+ exps = malloc (sizeof (symbol) * expcnt);
+ memcpy (exps, exp, sizeof (symbol) * expcnt);
+ compose_tree = composetree_add (compose_tree, exps, sym);
+ }
+ return 0;
+}
+
+/* Read keysyms passed to this function by S until a keysym can be
+ composed. If the first keysym cannot start a compose sequence return
+ the keysym. */
+symbol
+compose_symbols (symbol s)
+{
+ /* Current position in the compose tree. */
+ static struct compose *treepos = NULL;
+ /* Current compose sequence. */
+ static symbol syms[100];
+ /* Current position in the compose sequence. */
+ static int pos = 0;
+ int cmp;
+
+ if (!treepos)
+ treepos = compose_tree;
+
+ /* Maximum sequence length reached. Some idiot typed this many
+ symbols and now we throw it all away, wheee!!! */
+ if (pos == 99)
+ {
+ treepos = compose_tree;
+ pos = 0;
+ }
+
+ /* Put the keysym in the compose sequence array. */
+ syms[pos++] = s;
+ syms[pos] = 0;
+
+ /* Search the tree for a keysym sequence that can match the current one. */
+ while (treepos)
+ {
+ cmp = symbolsncmp (syms, treepos->expected, pos);
+ if (cmp == 0)
+ {
+ /* The keysym sequence was partially recognised, check if it
+ can completely match. */
+ if (!symbolscmp (syms, treepos->expected))
+ {
+ symbol ret = treepos->produced;
+ treepos = compose_tree;
+ pos = 0;
+ return ret;
+ }
+
+ /* The sequence was partially recognised. */
+ return -1;
+ }
+
+ if (cmp < 0)
+ treepos = treepos->left;
+ else
+ treepos = treepos->right;
+ }
+
+ /* Nothing can be found. */
+ treepos = compose_tree;
+
+ /* This ks should've started a sequence but couldn't be found,
+ just return it. */
+ if (pos == 1)
+ {
+ pos = 0;
+ return s;
+ }
+
+ debug_printf ("Invalid\n");
+ /* Invalid keysym sequence. */
+ pos = 0;
+ return -1;
+}
+
+/* Read a Compose file. */
+error_t
+read_composefile (char *composefn)
+{
+ FILE *cf;
+
+ error_t err;
+ cf = fopen (composefn, "r");
+ if (cf == NULL)
+ return errno;
+
+ err = parse_composefile (cf);
+ if (err)
+ fclose (cf);
+
+ return err;
+}
diff --git a/console-client/xkb/default.xkb b/console-client/xkb/default.xkb
new file mode 100644
index 00000000..64f5c1fc
--- /dev/null
+++ b/console-client/xkb/default.xkb
@@ -0,0 +1,1316 @@
+xkb_keymap {
+xkb_keycodes "xfree86" {
+ minimum = 8;
+ maximum = 255;
+ <ESC> = 9;
+ <AE01> = 10;
+ <AE02> = 11;
+ <AE03> = 12;
+ <AE04> = 13;
+ <AE05> = 14;
+ <AE06> = 15;
+ <AE07> = 16;
+ <AE08> = 17;
+ <AE09> = 18;
+ <AE10> = 19;
+ <AE11> = 20;
+ <AE12> = 21;
+ <BKSP> = 22;
+ <TAB> = 23;
+ <AD01> = 24;
+ <AD02> = 25;
+ <AD03> = 26;
+ <AD04> = 27;
+ <AD05> = 28;
+ <AD06> = 29;
+ <AD07> = 30;
+ <AD08> = 31;
+ <AD09> = 32;
+ <AD10> = 33;
+ <AD11> = 34;
+ <AD12> = 35;
+ <RTRN> = 36;
+ <LCTL> = 37;
+ <AC01> = 38;
+ <AC02> = 39;
+ <AC03> = 40;
+ <AC04> = 41;
+ <AC05> = 42;
+ <AC06> = 43;
+ <AC07> = 44;
+ <AC08> = 45;
+ <AC09> = 46;
+ <AC10> = 47;
+ <AC11> = 48;
+ <TLDE> = 49;
+ <LFSH> = 50;
+ <BKSL> = 51;
+ <AB01> = 52;
+ <AB02> = 53;
+ <AB03> = 54;
+ <AB04> = 55;
+ <AB05> = 56;
+ <AB06> = 57;
+ <AB07> = 58;
+ <AB08> = 59;
+ <AB09> = 60;
+ <AB10> = 61;
+ <RTSH> = 62;
+ <KPMU> = 63;
+ <LALT> = 64;
+ <SPCE> = 65;
+ <CAPS> = 66;
+ <FK01> = 67;
+ <FK02> = 68;
+ <FK03> = 69;
+ <FK04> = 70;
+ <FK05> = 71;
+ <FK06> = 72;
+ <FK07> = 73;
+ <FK08> = 74;
+ <FK09> = 75;
+ <FK10> = 76;
+ <NMLK> = 77;
+ <SCLK> = 78;
+ <KP7> = 79;
+ <KP8> = 80;
+ <KP9> = 81;
+ <KPSU> = 82;
+ <KP4> = 83;
+ <KP5> = 84;
+ <KP6> = 85;
+ <KPAD> = 86;
+ <KP1> = 87;
+ <KP2> = 88;
+ <KP3> = 89;
+ <KP0> = 90;
+ <KPDL> = 91;
+ <SYRQ> = 92;
+ <LSGT> = 94;
+ <FK11> = 95;
+ <FK12> = 96;
+ <HOME> = 97;
+ <UP> = 98;
+ <PGUP> = 99;
+ <LEFT> = 100;
+ <RGHT> = 102;
+ <END> = 103;
+ <DOWN> = 104;
+ <PGDN> = 105;
+ <INS> = 106;
+ <DELE> = 107;
+ <KPEN> = 108;
+ <RCTL> = 109;
+ <PAUS> = 110;
+ <PRSC> = 111;
+ <KPDV> = 112;
+ <RALT> = 113;
+ <BRK> = 114;
+ <LWIN> = 115;
+ <RWIN> = 116;
+ <MENU> = 117;
+ <FK13> = 118;
+ <FK14> = 119;
+ <FK15> = 120;
+ <FK16> = 121;
+ <FK17> = 122;
+ <KPDC> = 123;
+ <XFER> = 129;
+ <I02> = 130;
+ <NFER> = 131;
+ <I04> = 132;
+ <AE13> = 133;
+ <I06> = 134;
+ <I07> = 135;
+ <I08> = 136;
+ <I09> = 137;
+ <I0A> = 138;
+ <I0B> = 139;
+ <I0C> = 140;
+ <I0D> = 141;
+ <I0E> = 142;
+ <I0F> = 143;
+ <I10> = 144;
+ <I11> = 145;
+ <I12> = 146;
+ <I13> = 147;
+ <I14> = 148;
+ <I15> = 149;
+ <I16> = 150;
+ <I17> = 151;
+ <I18> = 152;
+ <I19> = 153;
+ <I1A> = 154;
+ <I1B> = 155;
+ <I1E> = 158;
+ <I1F> = 159;
+ <I20> = 160;
+ <I21> = 161;
+ <I22> = 162;
+ <I23> = 163;
+ <I24> = 164;
+ <I25> = 165;
+ <I26> = 166;
+ <I27> = 167;
+ <I28> = 168;
+ <I29> = 169;
+ <I2B> = 171;
+ <I2C> = 172;
+ <I2D> = 173;
+ <I2E> = 174;
+ <I2F> = 175;
+ <I30> = 176;
+ <I31> = 177;
+ <I32> = 178;
+ <I33> = 179;
+ <I34> = 180;
+ <I39> = 185;
+ <I3A> = 186;
+ <I3B> = 187;
+ <I3C> = 188;
+ <I42> = 194;
+ <I43> = 195;
+ <I44> = 196;
+ <I45> = 197;
+ <I4A> = 202;
+ <I54> = 212;
+ <I55> = 213;
+ <I56> = 214;
+ <I57> = 215;
+ <I58> = 216;
+ <I59> = 217;
+ <I5A> = 218;
+ <I5E> = 222;
+ <I5F> = 223;
+ <I60> = 224;
+ <I61> = 225;
+ <I62> = 226;
+ <I63> = 227;
+ <I64> = 228;
+ <I65> = 229;
+ <I66> = 230;
+ <I67> = 231;
+ <I68> = 232;
+ <I69> = 233;
+ <I6A> = 234;
+ <I6B> = 235;
+ <I6C> = 236;
+ <I6D> = 237;
+ <I6E> = 238;
+ <I6F> = 239;
+ <I70> = 240;
+ <I71> = 241;
+ <I72> = 242;
+ <I73> = 243;
+ <I74> = 244;
+ <I75> = 245;
+ <I76> = 246;
+ <I77> = 247;
+ <I78> = 248;
+ <I79> = 249;
+ <I7A> = 250;
+ <I7B> = 251;
+ <I7C> = 252;
+ <I7D> = 253;
+ <I7E> = 254;
+ <I7F> = 255;
+ indicator 1 = "Caps Lock";
+ indicator 2 = "Num Lock";
+ indicator 3 = "Scroll Lock";
+ virtual indicator 4 = "Shift Lock";
+ virtual indicator 5 = "Group 2";
+ virtual indicator 6 = "Mouse Keys";
+ alias <HZTG> = <TLDE>;
+ alias <HKTG> = <FK15>;
+ alias <AB11> = <KPDC>;
+ alias <AC12> = <BKSL>;
+ alias <ALGR> = <RALT>;
+};
+
+xkb_types "complete" {
+
+ virtual_modifiers NumLock,Alt,LevelThree,AltGr,ScrollLock;
+
+ type "ONE_LEVEL" {
+ modifiers= none;
+ level_name[Level1]= "Any";
+ };
+ type "TWO_LEVEL" {
+ modifiers= Shift;
+ map[Shift]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ };
+ type "ALPHABETIC" {
+ modifiers= Shift+Lock;
+ map[Shift]= Level2;
+ map[Lock]= Level1;
+ preserve[Lock]= Lock;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Caps";
+ };
+ type "KEYPAD" {
+ modifiers= Shift+NumLock;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ };
+ type "SHIFT+ALT" {
+ modifiers= Shift+Alt;
+ map[Shift+Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift+Alt";
+ };
+ type "PC_BREAK" {
+ modifiers= Control;
+ map[Control]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Control";
+ };
+ type "PC_SYSRQ" {
+ modifiers= Alt;
+ map[Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Alt";
+ };
+ type "CTRL+ALT" {
+ modifiers= Control+Alt;
+ map[Control+Alt]= Level2;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Ctrl+Alt";
+ };
+ type "THREE_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Level3";
+ };
+ type "FOUR_LEVEL" {
+ modifiers= Shift+LevelThree;
+ map[Shift]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Shift";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Shift Alt";
+ };
+ type "FOUR_LEVEL_KEYPAD" {
+ modifiers= Shift+NumLock+LevelThree;
+ map[Shift]= Level2;
+ map[NumLock]= Level2;
+ map[LevelThree]= Level3;
+ map[Shift+LevelThree]= Level4;
+ map[NumLock+LevelThree]= Level4;
+ map[Shift+NumLock+LevelThree]= Level3;
+ level_name[Level1]= "Base";
+ level_name[Level2]= "Number";
+ level_name[Level3]= "Alt Base";
+ level_name[Level4]= "Alt Number";
+ };
+};
+
+xkb_compatibility "complete" {
+
+ virtual_modifiers NumLock,Alt,LevelThree,AltGr,ScrollLock;
+
+ interpret.useModMapMods= AnyLevel;
+ interpret.repeat= False;
+ interpret.locking= False;
+ interpret ISO_Level2_Latch+Exactly(Shift) {
+ useModMapMods=level1;
+ action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
+ };
+ interpret Shift_Lock+AnyOf(Shift+Lock) {
+ action= LockMods(modifiers=Shift);
+ };
+ interpret Num_Lock+AnyOf(all) {
+ virtualModifier= NumLock;
+ action= LockMods(modifiers=NumLock);
+ };
+ interpret ISO_Lock+AnyOf(all) {
+ action= ISOLock(modifiers=modMapMods,affect=all);
+ };
+ interpret ISO_Level3_Shift+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= SetMods(modifiers=LevelThree,clearLocks);
+ };
+ interpret ISO_Level3_Latch+AnyOf(all) {
+ virtualModifier= LevelThree;
+ useModMapMods=level1;
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
+ };
+ interpret Alt_L+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Alt_R+AnyOf(all) {
+ virtualModifier= Alt;
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ interpret Scroll_Lock+AnyOf(all) {
+ virtualModifier= ScrollLock;
+ action= LockMods(modifiers=modMapMods);
+ };
+ interpret Mode_switch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= SetGroup(group=+1);
+ };
+ interpret ISO_Group_Latch+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LatchGroup(group=2);
+ };
+ interpret ISO_Next_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=+1);
+ };
+ interpret ISO_Prev_Group+AnyOfOrNone(all) {
+ virtualModifier= AltGr;
+ useModMapMods=level1;
+ action= LockGroup(group=-1);
+ };
+ interpret ISO_First_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=1);
+ };
+ interpret ISO_Last_Group+AnyOfOrNone(all) {
+ action= LockGroup(group=2);
+ };
+ interpret KP_1+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_End+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+1);
+ };
+ interpret KP_2+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_Down+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=+1);
+ };
+ interpret KP_3+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_Next+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+1);
+ };
+ interpret KP_4+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_Left+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=+0);
+ };
+ interpret KP_6+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_Right+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=+0);
+ };
+ interpret KP_7+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_Home+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=-1,y=-1);
+ };
+ interpret KP_8+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_Up+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+0,y=-1);
+ };
+ interpret KP_9+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_Prior+AnyOfOrNone(all) {
+ repeat= True;
+ action= MovePtr(x=+1,y=-1);
+ };
+ interpret KP_5+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_Begin+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default);
+ };
+ interpret KP_F2+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_Divide+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=1);
+ };
+ interpret KP_F3+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_Multiply+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=2);
+ };
+ interpret KP_F4+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Subtract+AnyOfOrNone(all) {
+ repeat= True;
+ action= SetPtrDflt(affect=button,button=3);
+ };
+ interpret KP_Separator+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_Add+AnyOfOrNone(all) {
+ repeat= True;
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret KP_0+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Insert+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=lock);
+ };
+ interpret KP_Decimal+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret KP_Delete+AnyOfOrNone(all) {
+ repeat= True;
+ action= LockPtrBtn(button=default,affect=unlock);
+ };
+ interpret Pointer_Button_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default);
+ };
+ interpret Pointer_Button1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1);
+ };
+ interpret Pointer_Button2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2);
+ };
+ interpret Pointer_Button3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3);
+ };
+ interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {
+ action= PtrBtn(button=default,count=2);
+ };
+ interpret Pointer_DblClick1+AnyOfOrNone(all) {
+ action= PtrBtn(button=1,count=2);
+ };
+ interpret Pointer_DblClick2+AnyOfOrNone(all) {
+ action= PtrBtn(button=2,count=2);
+ };
+ interpret Pointer_DblClick3+AnyOfOrNone(all) {
+ action= PtrBtn(button=3,count=2);
+ };
+ interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=default,affect=both);
+ };
+ interpret Pointer_Drag1+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=1,affect=both);
+ };
+ interpret Pointer_Drag2+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=2,affect=both);
+ };
+ interpret Pointer_Drag3+AnyOfOrNone(all) {
+ action= LockPtrBtn(button=3,affect=both);
+ };
+ interpret Pointer_EnableKeys+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret Pointer_Accelerate+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=+1);
+ };
+ interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {
+ action= SetPtrDflt(affect=button,button=-1);
+ };
+ interpret AccessX_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXKeys);
+ };
+ interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AccessXFeedback);
+ };
+ interpret RepeatKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=RepeatKeys);
+ };
+ interpret SlowKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=SlowKeys);
+ };
+ interpret BounceKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=BounceKeys);
+ };
+ interpret StickyKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=StickyKeys);
+ };
+ interpret MouseKeys_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeys);
+ };
+ interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=MouseKeysAccel);
+ };
+ interpret Overlay1_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=Overlay1);
+ };
+ interpret Overlay2_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=Overlay2);
+ };
+ interpret AudibleBell_Enable+AnyOfOrNone(all) {
+ action= LockControls(controls=AudibleBell);
+ };
+ interpret Terminate_Server+AnyOfOrNone(all) {
+ action= Terminate();
+ };
+ interpret Any+Exactly(Lock) {
+ action= LockMods(modifiers=Lock);
+ };
+ interpret Any+AnyOf(all) {
+ action= SetMods(modifiers=modMapMods,clearLocks);
+ };
+ group 2 = AltGr;
+ group 3 = AltGr;
+ group 4 = AltGr;
+ indicator "Caps Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= Lock;
+ };
+ indicator "Num Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= NumLock;
+ };
+ indicator "Scroll Lock" {
+ whichModState= locked;
+ modifiers= ScrollLock;
+ };
+ indicator "Shift Lock" {
+ !allowExplicit;
+ whichModState= locked;
+ modifiers= Shift;
+ };
+ indicator "Group 2" {
+ !allowExplicit;
+ groups= 0xfe;
+ };
+ indicator "Mouse Keys" {
+ indicatorDrivesKeyboard;
+ controls= mouseKeys;
+ };
+};
+
+xkb_symbols "en_US(pc104)" {
+
+ name[group1]="US/ASCII";
+ name[group2]="ISO9995-3";
+
+ key <ESC> { [ Escape ] };
+ key <AE01> {
+ symbols[Group1]= [ 1, exclam ],
+ symbols[Group2]= [ onesuperior, exclamdown ]
+ };
+ key <AE02> {
+ symbols[Group1]= [ 2, at ],
+ symbols[Group2]= [ twosuperior, oneeighth ]
+ };
+ key <AE03> {
+ symbols[Group1]= [ 3, numbersign ],
+ symbols[Group2]= [ threesuperior, sterling ]
+ };
+ key <AE04> {
+ symbols[Group1]= [ 4, dollar ],
+ symbols[Group2]= [ onequarter, dollar ]
+ };
+ key <AE05> {
+ symbols[Group1]= [ 5, percent ],
+ symbols[Group2]= [ onehalf, threeeighths ]
+ };
+ key <AE06> {
+ symbols[Group1]= [ 6, asciicircum ],
+ symbols[Group2]= [ threequarters, fiveeighths ]
+ };
+ key <AE07> {
+ symbols[Group1]= [ 7, ampersand ],
+ symbols[Group2]= [ braceleft, seveneighths ]
+ };
+ key <AE08> {
+ symbols[Group1]= [ 8, asterisk ],
+ symbols[Group2]= [ bracketleft, trademark ]
+ };
+ key <AE09> {
+ symbols[Group1]= [ 9, parenleft ],
+ symbols[Group2]= [ bracketright, plusminus ]
+ };
+ key <AE10> {
+ symbols[Group1]= [ 0, parenright ],
+ symbols[Group2]= [ braceright, degree ]
+ };
+ key <AE11> {
+ symbols[Group1]= [ minus, underscore ],
+ symbols[Group2]= [ backslash, questiondown ]
+ };
+ key <AE12> {
+ symbols[Group1]= [ equal, plus ],
+ symbols[Group2]= [ dead_cedilla, dead_ogonek ]
+ };
+ key <BKSP> { [ BackSpace ] };
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> {
+ symbols[Group1]= [ q, Q ],
+ symbols[Group2]= [ at, Greek_OMEGA ]
+ };
+ key <AD02> {
+ symbols[Group1]= [ w, W ],
+ symbols[Group2]= [ lstroke, Lstroke ]
+ };
+ key <AD03> {
+ symbols[Group1]= [ e, E ],
+ symbols[Group2]= [ EuroSign ]
+ };
+ key <AD04> {
+ symbols[Group1]= [ r, R ],
+ symbols[Group2]= [ paragraph, registered ]
+ };
+ key <AD05> {
+ symbols[Group1]= [ t, T ],
+ symbols[Group2]= [ tslash, Tslash ]
+ };
+ key <AD06> {
+ symbols[Group1]= [ y, Y ],
+ symbols[Group2]= [ leftarrow, yen ]
+ };
+ key <AD07> {
+ symbols[Group1]= [ u, U ],
+ symbols[Group2]= [ downarrow, uparrow ]
+ };
+ key <AD08> {
+ symbols[Group1]= [ i, I ],
+ symbols[Group2]= [ rightarrow, idotless ]
+ };
+ key <AD09> {
+ symbols[Group1]= [ o, O ],
+ symbols[Group2]= [ oslash, Ooblique ]
+ };
+ key <AD10> {
+ symbols[Group1]= [ p, P ],
+ symbols[Group2]= [ thorn, THORN ]
+ };
+ key <AD11> {
+ symbols[Group1]= [ bracketleft, braceleft ],
+ symbols[Group2]= [ dead_diaeresis, dead_abovering ]
+ };
+ key <AD12> {
+ symbols[Group1]= [ bracketright, braceright ],
+ symbols[Group2]= [ dead_tilde, dead_macron ]
+ };
+ key <RTRN> { [ Return ] };
+ key <LCTL> {
+ symbols[Group1]= [ Control_L ],
+ actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]
+ };
+ key <AC01> {
+ symbols[Group1]= [ a, A ],
+ symbols[Group2]= [ ae, AE ]
+ };
+ key <AC02> {
+ symbols[Group1]= [ s, S ],
+ symbols[Group2]= [ ssharp, section ]
+ };
+ key <AC03> {
+ symbols[Group1]= [ d, D ],
+ symbols[Group2]= [ eth, ETH ]
+ };
+ key <AC04> {
+ symbols[Group1]= [ f, F ],
+ symbols[Group2]= [ dstroke, ordfeminine ]
+ };
+ key <AC05> {
+ symbols[Group1]= [ g, G ],
+ symbols[Group2]= [ eng, ENG ]
+ };
+ key <AC06> {
+ symbols[Group1]= [ h, H ],
+ symbols[Group2]= [ hstroke, Hstroke ]
+ };
+ key <AC07> { [ j, J ] };
+ key <AC08> {
+ symbols[Group1]= [ k, K ],
+ symbols[Group2]= [ kra, ampersand ]
+ };
+ key <AC09> {
+ symbols[Group1]= [ l, L ],
+ symbols[Group2]= [ lstroke, Lstroke ]
+ };
+ key <AC10> {
+ symbols[Group1]= [ semicolon, colon ],
+ symbols[Group2]= [ dead_acute, dead_doubleacute ]
+ };
+ key <AC11> {
+ symbols[Group1]= [ apostrophe, quotedbl ],
+ symbols[Group2]= [ dead_circumflex, dead_caron ]
+ };
+ key <TLDE> {
+ symbols[Group1]= [ grave, asciitilde ],
+ symbols[Group2]= [ notsign ]
+ };
+ key <LFSH> {
+ symbols[Group1]= [ Shift_L ],
+ actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]
+ };
+ key <BKSL> {
+ symbols[Group1]= [ backslash, bar ],
+ symbols[Group2]= [ dead_grave, dead_breve ]
+ };
+ key <AB01> {
+ symbols[Group1]= [ z, Z ],
+ symbols[Group2]= [ guillemotleft, less ]
+ };
+ key <AB02> {
+ symbols[Group1]= [ x, X ],
+ symbols[Group2]= [ guillemotright, greater ]
+ };
+ key <AB03> {
+ symbols[Group1]= [ c, C ],
+ symbols[Group2]= [ cent, copyright ]
+ };
+ key <AB04> {
+ symbols[Group1]= [ v, V ],
+ symbols[Group2]= [ leftdoublequotemark, grave ]
+ };
+ key <AB05> {
+ symbols[Group1]= [ b, B ],
+ symbols[Group2]= [ rightdoublequotemark, apostrophe ]
+ };
+ key <AB06> { [ n, N ] };
+ key <AB07> {
+ symbols[Group1]= [ m, M ],
+ symbols[Group2]= [ mu, masculine ]
+ };
+ key <AB08> {
+ symbols[Group1]= [ comma, less ],
+ symbols[Group2]= [ horizconnector, multiply ]
+ };
+ key <AB09> {
+ symbols[Group1]= [ period, greater ],
+ symbols[Group2]= [ periodcentered, division ]
+ };
+ key <AB10> {
+ symbols[Group1]= [ slash, question ],
+ symbols[Group2]= [ dead_belowdot, dead_abovedot ]
+ };
+ key <RTSH> {
+ symbols[Group1]= [ Shift_R ],
+ actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]
+ };
+ key <KPMU> {
+ symbols[Group1]= [ KP_Multiply ],
+ actions[Group1]= [ SetPtrDflt(affect=button,button=2) ]
+ };
+ key <LALT> {
+ symbols[Group1]= [ Alt_L, Meta_L ],
+ actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks), SetMods(modifiers=modMapMods,clearLocks) ]
+ };
+ key <SPCE> { [ space ] };
+ key <CAPS> {
+ symbols[Group1]= [ Caps_Lock ],
+ actions[Group1]= [ LockMods(modifiers=Lock) ]
+ };
+ key <FK01> { [ F1 ] };
+ key <FK02> { [ F2 ] };
+ key <FK03> { [ F3 ] };
+ key <FK04> { [ F4 ] };
+ key <FK05> { [ F5 ] };
+ key <FK06> { [ F6 ] };
+ key <FK07> { [ F7 ] };
+ key <FK08> { [ F8 ] };
+ key <FK09> { [ F9 ] };
+ key <FK10> { [ F10 ] };
+ key <NMLK> {
+ symbols[Group1]= [ Num_Lock, Pointer_EnableKeys ],
+ actions[Group1]= [ LockMods(modifiers=NumLock), LockControls(controls=MouseKeys) ]
+ };
+ key <SCLK> {
+ symbols[Group1]= [ Scroll_Lock ],
+ actions[Group1]= [ LockMods(modifiers=modMapMods) ]
+ };
+ key <KP7> {
+ symbols[Group1]= [ KP_Home, KP_7 ],
+ actions[Group1]= [ MovePtr(x=-1,y=-1), MovePtr(x=-1,y=-1) ]
+ };
+ key <KP8> {
+ symbols[Group1]= [ KP_Up, KP_8 ],
+ actions[Group1]= [ MovePtr(x=+0,y=-1), MovePtr(x=+0,y=-1) ]
+ };
+ key <KP9> {
+ symbols[Group1]= [ KP_Prior, KP_9 ],
+ actions[Group1]= [ MovePtr(x=+1,y=-1), MovePtr(x=+1,y=-1) ]
+ };
+ key <KPSU> {
+ symbols[Group1]= [ KP_Subtract ],
+ actions[Group1]= [ SetPtrDflt(affect=button,button=3) ]
+ };
+ key <KP4> {
+ symbols[Group1]= [ KP_Left, KP_4 ],
+ actions[Group1]= [ MovePtr(x=-1,y=+0), MovePtr(x=-1,y=+0) ]
+ };
+ key <KP5> {
+ symbols[Group1]= [ KP_Begin, KP_5 ],
+ actions[Group1]= [ PtrBtn(button=default), PtrBtn(button=default) ]
+ };
+ key <KP6> {
+ symbols[Group1]= [ KP_Right, KP_6 ],
+ actions[Group1]= [ MovePtr(x=+1,y=+0), MovePtr(x=+1,y=+0) ]
+ };
+ key <KPAD> {
+ symbols[Group1]= [ KP_Add ],
+ actions[Group1]= [ PtrBtn(button=default,count=2) ]
+ };
+ key <KP1> {
+ symbols[Group1]= [ KP_End, KP_1 ],
+ actions[Group1]= [ MovePtr(x=-1,y=+1), MovePtr(x=-1,y=+1) ]
+ };
+ key <KP2> {
+ symbols[Group1]= [ KP_Down, KP_2 ],
+ actions[Group1]= [ MovePtr(x=+0,y=+1), MovePtr(x=+0,y=+1) ]
+ };
+ key <KP3> {
+ symbols[Group1]= [ KP_Next, KP_3 ],
+ actions[Group1]= [ MovePtr(x=+1,y=+1), MovePtr(x=+1,y=+1) ]
+ };
+ key <KP0> {
+ symbols[Group1]= [ KP_Insert, KP_0 ],
+ actions[Group1]= [ LockPtrBtn(button=default,affect=lock), LockPtrBtn(button=default,affect=lock) ]
+ };
+ key <KPDL> {
+ symbols[Group1]= [ KP_Delete, KP_Decimal ],
+ actions[Group1]= [ LockPtrBtn(button=default,affect=unlock), LockPtrBtn(button=default,affect=unlock) ]
+ };
+ key <SYRQ> {
+ type= "PC_SYSRQ",
+ symbols[Group1]= [ Print, Sys_Req ]
+ };
+ key <FK11> { [ F11 ] };
+ key <FK12> { [ F12 ] };
+ key <HOME> { [ Home ] };
+ key <UP> { [ Up ] };
+ key <PGUP> { [ Prior ] };
+ key <LEFT> { [ Left ] };
+ key <RGHT> { [ Right ] };
+ key <END> { [ End ] };
+ key <DOWN> { [ Down ] };
+ key <PGDN> { [ Next ] };
+ key <INS> { [ Insert ] };
+ key <DELE> { [ Delete ] };
+ key <KPEN> { [ KP_Enter ] };
+ key <RCTL> {
+ symbols[Group1]= [ Control_R ],
+ actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]
+ };
+ key <PAUS> {
+ type= "PC_BREAK",
+ symbols[Group1]= [ Pause, Break ]
+ };
+ key <PRSC> {
+ type= "PC_SYSRQ",
+ symbols[Group1]= [ Print, Sys_Req ]
+ };
+ key <KPDV> {
+ symbols[Group1]= [ KP_Divide ],
+ actions[Group1]= [ SetPtrDflt(affect=button,button=1) ]
+ };
+ key <RALT> {
+ symbols[Group1]= [ Mode_switch ],
+ actions[Group1]= [ SetGroup(group=+1) ]
+ };
+ key <BRK> {
+ type= "PC_BREAK",
+ symbols[Group1]= [ Pause, Break ]
+ };
+ key <LWIN> {
+ symbols[Group1]= [ Super_L ],
+ actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]
+ };
+ key <RWIN> { [ Multi_key ] };
+ key <MENU> { [ Menu ] };
+ modifier_map Control { <LCTL> };
+ modifier_map Shift { <LFSH> };
+ modifier_map Shift { <RTSH> };
+ modifier_map Mod1 { <LALT> };
+ modifier_map Lock { <CAPS> };
+ modifier_map Mod2 { <NMLK> };
+ modifier_map Mod5 { <SCLK> };
+ modifier_map Control { <RCTL> };
+ modifier_map Mod3 { <RALT> };
+ modifier_map Mod4 { <LWIN> };
+};
+
+xkb_geometry "pc(pc104)" {
+
+ width= 470;
+ height= 210;
+
+ alias <AC00> = <CAPS>;
+ alias <AA00> = <LCTL>;
+
+ baseColor= "white";
+ labelColor= "black";
+ xfont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ description= "Generic 104";
+
+ shape "NORM" {
+ corner= 1,
+ { [ 18, 18 ] },
+ { [ 2, 1 ], [ 16, 16 ] }
+ };
+ shape "BKSP" {
+ corner= 1,
+ { [ 38, 18 ] },
+ { [ 2, 1 ], [ 36, 16 ] }
+ };
+ shape "TABK" {
+ corner= 1,
+ { [ 28, 18 ] },
+ { [ 2, 1 ], [ 26, 16 ] }
+ };
+ shape "BKSL" {
+ corner= 1,
+ { [ 28, 18 ] },
+ { [ 2, 1 ], [ 26, 16 ] }
+ };
+ shape "RTRN" {
+ corner= 1,
+ { [ 42, 18 ] },
+ { [ 2, 1 ], [ 40, 16 ] }
+ };
+ shape "CAPS" {
+ corner= 1,
+ { [ 33, 18 ] },
+ { [ 2, 1 ], [ 31, 16 ] }
+ };
+ shape "LFSH" {
+ corner= 1,
+ { [ 42, 18 ] },
+ { [ 2, 1 ], [ 40, 16 ] }
+ };
+ shape "RTSH" {
+ corner= 1,
+ { [ 52, 18 ] },
+ { [ 2, 1 ], [ 50, 16 ] }
+ };
+ shape "MODK" {
+ corner= 1,
+ { [ 27, 18 ] },
+ { [ 2, 1 ], [ 25, 16 ] }
+ };
+ shape "SMOD" {
+ corner= 1,
+ { [ 23, 18 ] },
+ { [ 2, 1 ], [ 21, 16 ] }
+ };
+ shape "SPCE" {
+ corner= 1,
+ { [ 113, 18 ] },
+ { [ 2, 1 ], [ 111, 16 ] }
+ };
+ shape "KP0" {
+ corner= 1,
+ { [ 37, 18 ] },
+ { [ 2, 1 ], [ 35, 16 ] }
+ };
+ shape "KPAD" {
+ corner= 1,
+ { [ 18, 37 ] },
+ { [ 2, 1 ], [ 16, 35 ] }
+ };
+ shape "LEDS" { { [ 75, 20 ] } };
+ shape "LED" { { [ 5, 1 ] } };
+ section "Function" {
+ key.color= "grey20";
+ priority= 7;
+ top= 52;
+ left= 19;
+ width= 351;
+ height= 19;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <ESC>, "NORM", 1 },
+ { <FK01>, "NORM", 20, color="white" },
+ { <FK02>, "NORM", 1, color="white" },
+ { <FK03>, "NORM", 1, color="white" },
+ { <FK04>, "NORM", 1, color="white" },
+ { <FK05>, "NORM", 11, color="white" },
+ { <FK06>, "NORM", 1, color="white" },
+ { <FK07>, "NORM", 1, color="white" },
+ { <FK08>, "NORM", 1, color="white" },
+ { <FK09>, "NORM", 11, color="white" },
+ { <FK10>, "NORM", 1, color="white" },
+ { <FK11>, "NORM", 1, color="white" },
+ { <FK12>, "NORM", 1, color="white" },
+ { <PRSC>, "NORM", 8, color="white" },
+ { <SCLK>, "NORM", 1, color="white" },
+ { <PAUS>, "NORM", 1, color="white" }
+ };
+ };
+ }; // End of "Function" section
+
+ section "Alpha" {
+ key.color= "white";
+ priority= 8;
+ top= 91;
+ left= 19;
+ width= 287;
+ height= 95;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <TLDE>, "NORM", 1 }, { <AE01>, "NORM", 1 },
+ { <AE02>, "NORM", 1 }, { <AE03>, "NORM", 1 },
+ { <AE04>, "NORM", 1 }, { <AE05>, "NORM", 1 },
+ { <AE06>, "NORM", 1 }, { <AE07>, "NORM", 1 },
+ { <AE08>, "NORM", 1 }, { <AE09>, "NORM", 1 },
+ { <AE10>, "NORM", 1 }, { <AE11>, "NORM", 1 },
+ { <AE12>, "NORM", 1 },
+ { <BKSP>, "BKSP", 1, color="grey20" }
+ };
+ };
+ row {
+ top= 20;
+ left= 1;
+ keys {
+ { <TAB>, "TABK", 1, color="grey20" },
+ { <AD01>, "NORM", 1 }, { <AD02>, "NORM", 1 },
+ { <AD03>, "NORM", 1 }, { <AD04>, "NORM", 1 },
+ { <AD05>, "NORM", 1 }, { <AD06>, "NORM", 1 },
+ { <AD07>, "NORM", 1 }, { <AD08>, "NORM", 1 },
+ { <AD09>, "NORM", 1 }, { <AD10>, "NORM", 1 },
+ { <AD11>, "NORM", 1 }, { <AD12>, "NORM", 1 },
+ { <BKSL>, "BKSL", 1 }
+ };
+ };
+ row {
+ top= 39;
+ left= 1;
+ keys {
+ { <CAPS>, "CAPS", 1, color="grey20" },
+ { <AC01>, "NORM", 1 }, { <AC02>, "NORM", 1 },
+ { <AC03>, "NORM", 1 }, { <AC04>, "NORM", 1 },
+ { <AC05>, "NORM", 1 }, { <AC06>, "NORM", 1 },
+ { <AC07>, "NORM", 1 }, { <AC08>, "NORM", 1 },
+ { <AC09>, "NORM", 1 }, { <AC10>, "NORM", 1 },
+ { <AC11>, "NORM", 1 },
+ { <RTRN>, "RTRN", 1, color="grey20" }
+ };
+ };
+ row {
+ top= 58;
+ left= 1;
+ keys {
+ { <LFSH>, "LFSH", 1, color="grey20" },
+ { <AB01>, "NORM", 1 }, { <AB02>, "NORM", 1 },
+ { <AB03>, "NORM", 1 }, { <AB04>, "NORM", 1 },
+ { <AB05>, "NORM", 1 }, { <AB06>, "NORM", 1 },
+ { <AB07>, "NORM", 1 }, { <AB08>, "NORM", 1 },
+ { <AB09>, "NORM", 1 }, { <AB10>, "NORM", 1 },
+ { <RTSH>, "RTSH", 1, color="grey20" }
+ };
+ };
+ row {
+ top= 77;
+ left= 1;
+ keys {
+ { <LCTL>, "MODK", 1, color="grey20" },
+ { <LWIN>, "SMOD", 1, color="grey20" },
+ { <LALT>, "SMOD", 1, color="grey20" },
+ { <SPCE>, "SPCE", 1 },
+ { <RALT>, "SMOD", 1, color="grey20" },
+ { <RWIN>, "SMOD", 1, color="grey20" },
+ { <MENU>, "SMOD", 1, color="grey20" },
+ { <RCTL>, "SMOD", 1, color="grey20" }
+ };
+ };
+ }; // End of "Alpha" section
+
+ section "Editing" {
+ key.color= "grey20";
+ priority= 9;
+ top= 91;
+ left= 312;
+ width= 58;
+ height= 95;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <INS>, "NORM", 1 }, { <HOME>, "NORM", 1 },
+ { <PGUP>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 20;
+ left= 1;
+ keys {
+ { <DELE>, "NORM", 1 }, { <END>, "NORM", 1 },
+ { <PGDN>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 58;
+ left= 20;
+ keys {
+ { <UP>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 77;
+ left= 1;
+ keys {
+ { <LEFT>, "NORM", 1 }, { <DOWN>, "NORM", 1 },
+ { <RGHT>, "NORM", 1 }
+ };
+ };
+ }; // End of "Editing" section
+
+ section "Keypad" {
+ key.color= "grey20";
+ priority= 10;
+ top= 91;
+ left= 376;
+ width= 77;
+ height= 95;
+ row {
+ top= 1;
+ left= 1;
+ keys {
+ { <NMLK>, "NORM", 1 }, { <KPDV>, "NORM", 1 },
+ { <KPMU>, "NORM", 1 }, { <KPSU>, "NORM", 1 }
+ };
+ };
+ row {
+ top= 20;
+ left= 1;
+ keys {
+ { <KP7>, "NORM", 1, color="white" },
+ { <KP8>, "NORM", 1, color="white" },
+ { <KP9>, "NORM", 1, color="white" },
+ { <KPAD>, "KPAD", 1 }
+ };
+ };
+ row {
+ top= 39;
+ left= 1;
+ keys {
+ { <KP4>, "NORM", 1, color="white" },
+ { <KP5>, "NORM", 1, color="white" },
+ { <KP6>, "NORM", 1, color="white" }
+ };
+ };
+ row {
+ top= 58;
+ left= 1;
+ keys {
+ { <KP1>, "NORM", 1, color="white" },
+ { <KP2>, "NORM", 1, color="white" },
+ { <KP3>, "NORM", 1, color="white" },
+ { <KPEN>, "KPAD", 1 }
+ };
+ };
+ row {
+ top= 77;
+ left= 1;
+ keys {
+ { <KP0>, "KP0", 1, color="white" },
+ { <KPDL>, "NORM", 1, color="white" }
+ };
+ };
+ }; // End of "Keypad" section
+
+ solid "LedPanel" {
+ top= 52;
+ left= 377;
+ priority= 0;
+ color= "grey10";
+ shape= "LEDS";
+ };
+ indicator "NumLock" {
+ top= 67;
+ left= 382;
+ priority= 1;
+ onColor= "green";
+ offColor= "green30";
+ shape= "LED";
+ };
+ indicator "CapsLock" {
+ top= 67;
+ left= 407;
+ priority= 2;
+ onColor= "green";
+ offColor= "green30";
+ shape= "LED";
+ };
+ indicator "ScrollLock" {
+ top= 67;
+ left= 433;
+ priority= 3;
+ onColor= "green";
+ offColor= "green30";
+ shape= "LED";
+ };
+ text "NumLockLabel" {
+ top= 55;
+ left= 378;
+ priority= 4;
+ width= 19.8;
+ height= 10;
+ XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ text= "Num\nLock";
+ };
+ text "CapsLockLabel" {
+ top= 55;
+ left= 403;
+ priority= 5;
+ width= 26.4;
+ height= 10;
+ XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ text= "Caps\nLock";
+ };
+ text "ScrollLockLabel" {
+ top= 55;
+ left= 428;
+ priority= 6;
+ width= 39.6;
+ height= 10;
+ XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1";
+ text= "Scroll\nLock";
+ };
+};
+
+};
diff --git a/console-client/xkb/keysymdef.h b/console-client/xkb/keysymdef.h
new file mode 100644
index 00000000..728a412e
--- /dev/null
+++ b/console-client/xkb/keysymdef.h
@@ -0,0 +1,2016 @@
+/* $Xorg: keysymdef.h,v 1.4 2001/02/09 02:03:23 xorgcvs Exp $ */
+
+/***********************************************************
+Copyright 1987, 1994, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/include/keysymdef.h,v 1.12 2001/12/14 19:53:26 dawes Exp $ */
+
+#define XK_VoidSymbol 0xFFFFFF /* void symbol */
+
+#ifdef XK_MISCELLANY
+/*
+ * TTY Functions, cleverly chosen to map to ascii, for convenience of
+ * programming, but could have been arbitrary (at the cost of lookup
+ * tables in client code.
+ */
+
+#define XK_BackSpace 0xFF08 /* back space, back char */
+#define XK_Tab 0xFF09
+#define XK_Linefeed 0xFF0A /* Linefeed, LF */
+#define XK_Clear 0xFF0B
+#define XK_Return 0xFF0D /* Return, enter */
+#define XK_Pause 0xFF13 /* Pause, hold */
+#define XK_Scroll_Lock 0xFF14
+#define XK_Sys_Req 0xFF15
+#define XK_Escape 0xFF1B
+#define XK_Delete 0xFFFF /* Delete, rubout */
+
+
+
+/* International & multi-key character composition */
+
+#define XK_Multi_key 0xFF20 /* Multi-key character compose */
+#define XK_Codeinput 0xFF37
+#define XK_SingleCandidate 0xFF3C
+#define XK_MultipleCandidate 0xFF3D
+#define XK_PreviousCandidate 0xFF3E
+
+/* Japanese keyboard support */
+
+#define XK_Kanji 0xFF21 /* Kanji, Kanji convert */
+#define XK_Muhenkan 0xFF22 /* Cancel Conversion */
+#define XK_Henkan_Mode 0xFF23 /* Start/Stop Conversion */
+#define XK_Henkan 0xFF23 /* Alias for Henkan_Mode */
+#define XK_Romaji 0xFF24 /* to Romaji */
+#define XK_Hiragana 0xFF25 /* to Hiragana */
+#define XK_Katakana 0xFF26 /* to Katakana */
+#define XK_Hiragana_Katakana 0xFF27 /* Hiragana/Katakana toggle */
+#define XK_Zenkaku 0xFF28 /* to Zenkaku */
+#define XK_Hankaku 0xFF29 /* to Hankaku */
+#define XK_Zenkaku_Hankaku 0xFF2A /* Zenkaku/Hankaku toggle */
+#define XK_Touroku 0xFF2B /* Add to Dictionary */
+#define XK_Massyo 0xFF2C /* Delete from Dictionary */
+#define XK_Kana_Lock 0xFF2D /* Kana Lock */
+#define XK_Kana_Shift 0xFF2E /* Kana Shift */
+#define XK_Eisu_Shift 0xFF2F /* Alphanumeric Shift */
+#define XK_Eisu_toggle 0xFF30 /* Alphanumeric toggle */
+#define XK_Kanji_Bangou 0xFF37 /* Codeinput */
+#define XK_Zen_Koho 0xFF3D /* Multiple/All Candidate(s) */
+#define XK_Mae_Koho 0xFF3E /* Previous Candidate */
+
+/* 0xFF31 thru 0xFF3F are under XK_KOREAN */
+
+/* Cursor control & motion */
+
+#define XK_Home 0xFF50
+#define XK_Left 0xFF51 /* Move left, left arrow */
+#define XK_Up 0xFF52 /* Move up, up arrow */
+#define XK_Right 0xFF53 /* Move right, right arrow */
+#define XK_Down 0xFF54 /* Move down, down arrow */
+#define XK_Prior 0xFF55 /* Prior, previous */
+#define XK_Page_Up 0xFF55
+#define XK_Next 0xFF56 /* Next */
+#define XK_Page_Down 0xFF56
+#define XK_End 0xFF57 /* EOL */
+#define XK_Begin 0xFF58 /* BOL */
+
+
+/* Misc Functions */
+
+#define XK_Select 0xFF60 /* Select, mark */
+#define XK_Print 0xFF61
+#define XK_Execute 0xFF62 /* Execute, run, do */
+#define XK_Insert 0xFF63 /* Insert, insert here */
+#define XK_Undo 0xFF65 /* Undo, oops */
+#define XK_Redo 0xFF66 /* redo, again */
+#define XK_Menu 0xFF67
+#define XK_Find 0xFF68 /* Find, search */
+#define XK_Cancel 0xFF69 /* Cancel, stop, abort, exit */
+#define XK_Help 0xFF6A /* Help */
+#define XK_Break 0xFF6B
+#define XK_Mode_switch 0xFF7E /* Character set switch */
+#define XK_script_switch 0xFF7E /* Alias for mode_switch */
+#define XK_Num_Lock 0xFF7F
+
+/* Keypad Functions, keypad numbers cleverly chosen to map to ascii */
+
+#define XK_KP_Space 0xFF80 /* space */
+#define XK_KP_Tab 0xFF89
+#define XK_KP_Enter 0xFF8D /* enter */
+#define XK_KP_F1 0xFF91 /* PF1, KP_A, ... */
+#define XK_KP_F2 0xFF92
+#define XK_KP_F3 0xFF93
+#define XK_KP_F4 0xFF94
+#define XK_KP_Home 0xFF95
+#define XK_KP_Left 0xFF96
+#define XK_KP_Up 0xFF97
+#define XK_KP_Right 0xFF98
+#define XK_KP_Down 0xFF99
+#define XK_KP_Prior 0xFF9A
+#define XK_KP_Page_Up 0xFF9A
+#define XK_KP_Next 0xFF9B
+#define XK_KP_Page_Down 0xFF9B
+#define XK_KP_End 0xFF9C
+#define XK_KP_Begin 0xFF9D
+#define XK_KP_Insert 0xFF9E
+#define XK_KP_Delete 0xFF9F
+#define XK_KP_Equal 0xFFBD /* equals */
+#define XK_KP_Multiply 0xFFAA
+#define XK_KP_Add 0xFFAB
+#define XK_KP_Separator 0xFFAC /* separator, often comma */
+#define XK_KP_Subtract 0xFFAD
+#define XK_KP_Decimal 0xFFAE
+#define XK_KP_Divide 0xFFAF
+
+#define XK_KP_0 0xFFB0
+#define XK_KP_1 0xFFB1
+#define XK_KP_2 0xFFB2
+#define XK_KP_3 0xFFB3
+#define XK_KP_4 0xFFB4
+#define XK_KP_5 0xFFB5
+#define XK_KP_6 0xFFB6
+#define XK_KP_7 0xFFB7
+#define XK_KP_8 0xFFB8
+#define XK_KP_9 0xFFB9
+
+
+
+/*
+ * Auxilliary Functions; note the duplicate definitions for left and right
+ * function keys; Sun keyboards and a few other manufactures have such
+ * function key groups on the left and/or right sides of the keyboard.
+ * We've not found a keyboard with more than 35 function keys total.
+ */
+
+#define XK_F1 0xFFBE
+#define XK_F2 0xFFBF
+#define XK_F3 0xFFC0
+#define XK_F4 0xFFC1
+#define XK_F5 0xFFC2
+#define XK_F6 0xFFC3
+#define XK_F7 0xFFC4
+#define XK_F8 0xFFC5
+#define XK_F9 0xFFC6
+#define XK_F10 0xFFC7
+#define XK_F11 0xFFC8
+#define XK_L1 0xFFC8
+#define XK_F12 0xFFC9
+#define XK_L2 0xFFC9
+#define XK_F13 0xFFCA
+#define XK_L3 0xFFCA
+#define XK_F14 0xFFCB
+#define XK_L4 0xFFCB
+#define XK_F15 0xFFCC
+#define XK_L5 0xFFCC
+#define XK_F16 0xFFCD
+#define XK_L6 0xFFCD
+#define XK_F17 0xFFCE
+#define XK_L7 0xFFCE
+#define XK_F18 0xFFCF
+#define XK_L8 0xFFCF
+#define XK_F19 0xFFD0
+#define XK_L9 0xFFD0
+#define XK_F20 0xFFD1
+#define XK_L10 0xFFD1
+#define XK_F21 0xFFD2
+#define XK_R1 0xFFD2
+#define XK_F22 0xFFD3
+#define XK_R2 0xFFD3
+#define XK_F23 0xFFD4
+#define XK_R3 0xFFD4
+#define XK_F24 0xFFD5
+#define XK_R4 0xFFD5
+#define XK_F25 0xFFD6
+#define XK_R5 0xFFD6
+#define XK_F26 0xFFD7
+#define XK_R6 0xFFD7
+#define XK_F27 0xFFD8
+#define XK_R7 0xFFD8
+#define XK_F28 0xFFD9
+#define XK_R8 0xFFD9
+#define XK_F29 0xFFDA
+#define XK_R9 0xFFDA
+#define XK_F30 0xFFDB
+#define XK_R10 0xFFDB
+#define XK_F31 0xFFDC
+#define XK_R11 0xFFDC
+#define XK_F32 0xFFDD
+#define XK_R12 0xFFDD
+#define XK_F33 0xFFDE
+#define XK_R13 0xFFDE
+#define XK_F34 0xFFDF
+#define XK_R14 0xFFDF
+#define XK_F35 0xFFE0
+#define XK_R15 0xFFE0
+
+/* Modifiers */
+
+#define XK_Shift_L 0xFFE1 /* Left shift */
+#define XK_Shift_R 0xFFE2 /* Right shift */
+#define XK_Control_L 0xFFE3 /* Left control */
+#define XK_Control_R 0xFFE4 /* Right control */
+#define XK_Caps_Lock 0xFFE5 /* Caps lock */
+#define XK_Shift_Lock 0xFFE6 /* Shift lock */
+
+#define XK_Meta_L 0xFFE7 /* Left meta */
+#define XK_Meta_R 0xFFE8 /* Right meta */
+#define XK_Alt_L 0xFFE9 /* Left alt */
+#define XK_Alt_R 0xFFEA /* Right alt */
+#define XK_Super_L 0xFFEB /* Left super */
+#define XK_Super_R 0xFFEC /* Right super */
+#define XK_Hyper_L 0xFFED /* Left hyper */
+#define XK_Hyper_R 0xFFEE /* Right hyper */
+#endif /* XK_MISCELLANY */
+
+/*
+ * ISO 9995 Function and Modifier Keys
+ * Byte 3 = 0xFE
+ */
+
+#ifdef XK_XKB_KEYS
+#define XK_ISO_Lock 0xFE01
+#define XK_ISO_Level2_Latch 0xFE02
+#define XK_ISO_Level3_Shift 0xFE03
+#define XK_ISO_Level3_Latch 0xFE04
+#define XK_ISO_Level3_Lock 0xFE05
+#define XK_ISO_Group_Shift 0xFF7E /* Alias for mode_switch */
+#define XK_ISO_Group_Latch 0xFE06
+#define XK_ISO_Group_Lock 0xFE07
+#define XK_ISO_Next_Group 0xFE08
+#define XK_ISO_Next_Group_Lock 0xFE09
+#define XK_ISO_Prev_Group 0xFE0A
+#define XK_ISO_Prev_Group_Lock 0xFE0B
+#define XK_ISO_First_Group 0xFE0C
+#define XK_ISO_First_Group_Lock 0xFE0D
+#define XK_ISO_Last_Group 0xFE0E
+#define XK_ISO_Last_Group_Lock 0xFE0F
+
+#define XK_ISO_Left_Tab 0xFE20
+#define XK_ISO_Move_Line_Up 0xFE21
+#define XK_ISO_Move_Line_Down 0xFE22
+#define XK_ISO_Partial_Line_Up 0xFE23
+#define XK_ISO_Partial_Line_Down 0xFE24
+#define XK_ISO_Partial_Space_Left 0xFE25
+#define XK_ISO_Partial_Space_Right 0xFE26
+#define XK_ISO_Set_Margin_Left 0xFE27
+#define XK_ISO_Set_Margin_Right 0xFE28
+#define XK_ISO_Release_Margin_Left 0xFE29
+#define XK_ISO_Release_Margin_Right 0xFE2A
+#define XK_ISO_Release_Both_Margins 0xFE2B
+#define XK_ISO_Fast_Cursor_Left 0xFE2C
+#define XK_ISO_Fast_Cursor_Right 0xFE2D
+#define XK_ISO_Fast_Cursor_Up 0xFE2E
+#define XK_ISO_Fast_Cursor_Down 0xFE2F
+#define XK_ISO_Continuous_Underline 0xFE30
+#define XK_ISO_Discontinuous_Underline 0xFE31
+#define XK_ISO_Emphasize 0xFE32
+#define XK_ISO_Center_Object 0xFE33
+#define XK_ISO_Enter 0xFE34
+
+#define XK_dead_grave 0xFE50
+#define XK_dead_acute 0xFE51
+#define XK_dead_circumflex 0xFE52
+#define XK_dead_tilde 0xFE53
+#define XK_dead_macron 0xFE54
+#define XK_dead_breve 0xFE55
+#define XK_dead_abovedot 0xFE56
+#define XK_dead_diaeresis 0xFE57
+#define XK_dead_abovering 0xFE58
+#define XK_dead_doubleacute 0xFE59
+#define XK_dead_caron 0xFE5A
+#define XK_dead_cedilla 0xFE5B
+#define XK_dead_ogonek 0xFE5C
+#define XK_dead_iota 0xFE5D
+#define XK_dead_voiced_sound 0xFE5E
+#define XK_dead_semivoiced_sound 0xFE5F
+#define XK_dead_belowdot 0xFE60
+#define XK_dead_hook 0xFE61
+#define XK_dead_horn 0xFE62
+
+#define XK_First_Virtual_Screen 0xFED0
+#define XK_Prev_Virtual_Screen 0xFED1
+#define XK_Next_Virtual_Screen 0xFED2
+#define XK_Last_Virtual_Screen 0xFED4
+#define XK_Terminate_Server 0xFED5
+
+#define XK_AccessX_Enable 0xFE70
+#define XK_AccessX_Feedback_Enable 0xFE71
+#define XK_RepeatKeys_Enable 0xFE72
+#define XK_SlowKeys_Enable 0xFE73
+#define XK_BounceKeys_Enable 0xFE74
+#define XK_StickyKeys_Enable 0xFE75
+#define XK_MouseKeys_Enable 0xFE76
+#define XK_MouseKeys_Accel_Enable 0xFE77
+#define XK_Overlay1_Enable 0xFE78
+#define XK_Overlay2_Enable 0xFE79
+#define XK_AudibleBell_Enable 0xFE7A
+
+#define XK_Pointer_Left 0xFEE0
+#define XK_Pointer_Right 0xFEE1
+#define XK_Pointer_Up 0xFEE2
+#define XK_Pointer_Down 0xFEE3
+#define XK_Pointer_UpLeft 0xFEE4
+#define XK_Pointer_UpRight 0xFEE5
+#define XK_Pointer_DownLeft 0xFEE6
+#define XK_Pointer_DownRight 0xFEE7
+#define XK_Pointer_Button_Dflt 0xFEE8
+#define XK_Pointer_Button1 0xFEE9
+#define XK_Pointer_Button2 0xFEEA
+#define XK_Pointer_Button3 0xFEEB
+#define XK_Pointer_Button4 0xFEEC
+#define XK_Pointer_Button5 0xFEED
+#define XK_Pointer_DblClick_Dflt 0xFEEE
+#define XK_Pointer_DblClick1 0xFEEF
+#define XK_Pointer_DblClick2 0xFEF0
+#define XK_Pointer_DblClick3 0xFEF1
+#define XK_Pointer_DblClick4 0xFEF2
+#define XK_Pointer_DblClick5 0xFEF3
+#define XK_Pointer_Drag_Dflt 0xFEF4
+#define XK_Pointer_Drag1 0xFEF5
+#define XK_Pointer_Drag2 0xFEF6
+#define XK_Pointer_Drag3 0xFEF7
+#define XK_Pointer_Drag4 0xFEF8
+#define XK_Pointer_Drag5 0xFEFD
+
+#define XK_Pointer_EnableKeys 0xFEF9
+#define XK_Pointer_Accelerate 0xFEFA
+#define XK_Pointer_DfltBtnNext 0xFEFB
+#define XK_Pointer_DfltBtnPrev 0xFEFC
+
+#endif
+
+/*
+ * 3270 Terminal Keys
+ * Byte 3 = 0xFD
+ */
+
+#ifdef XK_3270
+#define XK_3270_Duplicate 0xFD01
+#define XK_3270_FieldMark 0xFD02
+#define XK_3270_Right2 0xFD03
+#define XK_3270_Left2 0xFD04
+#define XK_3270_BackTab 0xFD05
+#define XK_3270_EraseEOF 0xFD06
+#define XK_3270_EraseInput 0xFD07
+#define XK_3270_Reset 0xFD08
+#define XK_3270_Quit 0xFD09
+#define XK_3270_PA1 0xFD0A
+#define XK_3270_PA2 0xFD0B
+#define XK_3270_PA3 0xFD0C
+#define XK_3270_Test 0xFD0D
+#define XK_3270_Attn 0xFD0E
+#define XK_3270_CursorBlink 0xFD0F
+#define XK_3270_AltCursor 0xFD10
+#define XK_3270_KeyClick 0xFD11
+#define XK_3270_Jump 0xFD12
+#define XK_3270_Ident 0xFD13
+#define XK_3270_Rule 0xFD14
+#define XK_3270_Copy 0xFD15
+#define XK_3270_Play 0xFD16
+#define XK_3270_Setup 0xFD17
+#define XK_3270_Record 0xFD18
+#define XK_3270_ChangeScreen 0xFD19
+#define XK_3270_DeleteWord 0xFD1A
+#define XK_3270_ExSelect 0xFD1B
+#define XK_3270_CursorSelect 0xFD1C
+#define XK_3270_PrintScreen 0xFD1D
+#define XK_3270_Enter 0xFD1E
+#endif
+
+/*
+ * Latin 1
+ * Byte 3 = 0
+ */
+#ifdef XK_LATIN1
+#define XK_space 0x020
+#define XK_exclam 0x021
+#define XK_quotedbl 0x022
+#define XK_numbersign 0x023
+#define XK_dollar 0x024
+#define XK_percent 0x025
+#define XK_ampersand 0x026
+#define XK_apostrophe 0x027
+#define XK_quoteright 0x027 /* deprecated */
+#define XK_parenleft 0x028
+#define XK_parenright 0x029
+#define XK_asterisk 0x02a
+#define XK_plus 0x02b
+#define XK_comma 0x02c
+#define XK_minus 0x02d
+#define XK_period 0x02e
+#define XK_slash 0x02f
+#define XK_0 0x030
+#define XK_1 0x031
+#define XK_2 0x032
+#define XK_3 0x033
+#define XK_4 0x034
+#define XK_5 0x035
+#define XK_6 0x036
+#define XK_7 0x037
+#define XK_8 0x038
+#define XK_9 0x039
+#define XK_colon 0x03a
+#define XK_semicolon 0x03b
+#define XK_less 0x03c
+#define XK_equal 0x03d
+#define XK_greater 0x03e
+#define XK_question 0x03f
+#define XK_at 0x040
+#define XK_A 0x041
+#define XK_B 0x042
+#define XK_C 0x043
+#define XK_D 0x044
+#define XK_E 0x045
+#define XK_F 0x046
+#define XK_G 0x047
+#define XK_H 0x048
+#define XK_I 0x049
+#define XK_J 0x04a
+#define XK_K 0x04b
+#define XK_L 0x04c
+#define XK_M 0x04d
+#define XK_N 0x04e
+#define XK_O 0x04f
+#define XK_P 0x050
+#define XK_Q 0x051
+#define XK_R 0x052
+#define XK_S 0x053
+#define XK_T 0x054
+#define XK_U 0x055
+#define XK_V 0x056
+#define XK_W 0x057
+#define XK_X 0x058
+#define XK_Y 0x059
+#define XK_Z 0x05a
+#define XK_bracketleft 0x05b
+#define XK_backslash 0x05c
+#define XK_bracketright 0x05d
+#define XK_asciicircum 0x05e
+#define XK_underscore 0x05f
+#define XK_grave 0x060
+#define XK_quoteleft 0x060 /* deprecated */
+#define XK_a 0x061
+#define XK_b 0x062
+#define XK_c 0x063
+#define XK_d 0x064
+#define XK_e 0x065
+#define XK_f 0x066
+#define XK_g 0x067
+#define XK_h 0x068
+#define XK_i 0x069
+#define XK_j 0x06a
+#define XK_k 0x06b
+#define XK_l 0x06c
+#define XK_m 0x06d
+#define XK_n 0x06e
+#define XK_o 0x06f
+#define XK_p 0x070
+#define XK_q 0x071
+#define XK_r 0x072
+#define XK_s 0x073
+#define XK_t 0x074
+#define XK_u 0x075
+#define XK_v 0x076
+#define XK_w 0x077
+#define XK_x 0x078
+#define XK_y 0x079
+#define XK_z 0x07a
+#define XK_braceleft 0x07b
+#define XK_bar 0x07c
+#define XK_braceright 0x07d
+#define XK_asciitilde 0x07e
+
+#define XK_nobreakspace 0x0a0
+#define XK_exclamdown 0x0a1
+#define XK_cent 0x0a2
+#define XK_sterling 0x0a3
+#define XK_currency 0x0a4
+#define XK_yen 0x0a5
+#define XK_brokenbar 0x0a6
+#define XK_section 0x0a7
+#define XK_diaeresis 0x0a8
+#define XK_copyright 0x0a9
+#define XK_ordfeminine 0x0aa
+#define XK_guillemotleft 0x0ab /* left angle quotation mark */
+#define XK_notsign 0x0ac
+#define XK_hyphen 0x0ad
+#define XK_registered 0x0ae
+#define XK_macron 0x0af
+#define XK_degree 0x0b0
+#define XK_plusminus 0x0b1
+#define XK_twosuperior 0x0b2
+#define XK_threesuperior 0x0b3
+#define XK_acute 0x0b4
+#define XK_mu 0x0b5
+#define XK_paragraph 0x0b6
+#define XK_periodcentered 0x0b7
+#define XK_cedilla 0x0b8
+#define XK_onesuperior 0x0b9
+#define XK_masculine 0x0ba
+#define XK_guillemotright 0x0bb /* right angle quotation mark */
+#define XK_onequarter 0x0bc
+#define XK_onehalf 0x0bd
+#define XK_threequarters 0x0be
+#define XK_questiondown 0x0bf
+#define XK_Agrave 0x0c0
+#define XK_Aacute 0x0c1
+#define XK_Acircumflex 0x0c2
+#define XK_Atilde 0x0c3
+#define XK_Adiaeresis 0x0c4
+#define XK_Aring 0x0c5
+#define XK_AE 0x0c6
+#define XK_Ccedilla 0x0c7
+#define XK_Egrave 0x0c8
+#define XK_Eacute 0x0c9
+#define XK_Ecircumflex 0x0ca
+#define XK_Ediaeresis 0x0cb
+#define XK_Igrave 0x0cc
+#define XK_Iacute 0x0cd
+#define XK_Icircumflex 0x0ce
+#define XK_Idiaeresis 0x0cf
+#define XK_ETH 0x0d0
+#define XK_Eth 0x0d0 /* deprecated */
+#define XK_Ntilde 0x0d1
+#define XK_Ograve 0x0d2
+#define XK_Oacute 0x0d3
+#define XK_Ocircumflex 0x0d4
+#define XK_Otilde 0x0d5
+#define XK_Odiaeresis 0x0d6
+#define XK_multiply 0x0d7
+#define XK_Ooblique 0x0d8
+#define XK_Oslash XK_Ooblique
+#define XK_Ugrave 0x0d9
+#define XK_Uacute 0x0da
+#define XK_Ucircumflex 0x0db
+#define XK_Udiaeresis 0x0dc
+#define XK_Yacute 0x0dd
+#define XK_THORN 0x0de
+#define XK_Thorn 0x0de /* deprecated */
+#define XK_ssharp 0x0df
+#define XK_agrave 0x0e0
+#define XK_aacute 0x0e1
+#define XK_acircumflex 0x0e2
+#define XK_atilde 0x0e3
+#define XK_adiaeresis 0x0e4
+#define XK_aring 0x0e5
+#define XK_ae 0x0e6
+#define XK_ccedilla 0x0e7
+#define XK_egrave 0x0e8
+#define XK_eacute 0x0e9
+#define XK_ecircumflex 0x0ea
+#define XK_ediaeresis 0x0eb
+#define XK_igrave 0x0ec
+#define XK_iacute 0x0ed
+#define XK_icircumflex 0x0ee
+#define XK_idiaeresis 0x0ef
+#define XK_eth 0x0f0
+#define XK_ntilde 0x0f1
+#define XK_ograve 0x0f2
+#define XK_oacute 0x0f3
+#define XK_ocircumflex 0x0f4
+#define XK_otilde 0x0f5
+#define XK_odiaeresis 0x0f6
+#define XK_division 0x0f7
+#define XK_oslash 0x0f8
+#define XK_ooblique XK_oslash
+#define XK_ugrave 0x0f9
+#define XK_uacute 0x0fa
+#define XK_ucircumflex 0x0fb
+#define XK_udiaeresis 0x0fc
+#define XK_yacute 0x0fd
+#define XK_thorn 0x0fe
+#define XK_ydiaeresis 0x0ff
+#endif /* XK_LATIN1 */
+
+/*
+ * Latin 2
+ * Byte 3 = 1
+ */
+
+#ifdef XK_LATIN2
+#define XK_Aogonek 0x1a1
+#define XK_breve 0x1a2
+#define XK_Lstroke 0x1a3
+#define XK_Lcaron 0x1a5
+#define XK_Sacute 0x1a6
+#define XK_Scaron 0x1a9
+#define XK_Scedilla 0x1aa
+#define XK_Tcaron 0x1ab
+#define XK_Zacute 0x1ac
+#define XK_Zcaron 0x1ae
+#define XK_Zabovedot 0x1af
+#define XK_aogonek 0x1b1
+#define XK_ogonek 0x1b2
+#define XK_lstroke 0x1b3
+#define XK_lcaron 0x1b5
+#define XK_sacute 0x1b6
+#define XK_caron 0x1b7
+#define XK_scaron 0x1b9
+#define XK_scedilla 0x1ba
+#define XK_tcaron 0x1bb
+#define XK_zacute 0x1bc
+#define XK_doubleacute 0x1bd
+#define XK_zcaron 0x1be
+#define XK_zabovedot 0x1bf
+#define XK_Racute 0x1c0
+#define XK_Abreve 0x1c3
+#define XK_Lacute 0x1c5
+#define XK_Cacute 0x1c6
+#define XK_Ccaron 0x1c8
+#define XK_Eogonek 0x1ca
+#define XK_Ecaron 0x1cc
+#define XK_Dcaron 0x1cf
+#define XK_Dstroke 0x1d0
+#define XK_Nacute 0x1d1
+#define XK_Ncaron 0x1d2
+#define XK_Odoubleacute 0x1d5
+#define XK_Rcaron 0x1d8
+#define XK_Uring 0x1d9
+#define XK_Udoubleacute 0x1db
+#define XK_Tcedilla 0x1de
+#define XK_racute 0x1e0
+#define XK_abreve 0x1e3
+#define XK_lacute 0x1e5
+#define XK_cacute 0x1e6
+#define XK_ccaron 0x1e8
+#define XK_eogonek 0x1ea
+#define XK_ecaron 0x1ec
+#define XK_dcaron 0x1ef
+#define XK_dstroke 0x1f0
+#define XK_nacute 0x1f1
+#define XK_ncaron 0x1f2
+#define XK_odoubleacute 0x1f5
+#define XK_udoubleacute 0x1fb
+#define XK_rcaron 0x1f8
+#define XK_uring 0x1f9
+#define XK_tcedilla 0x1fe
+#define XK_abovedot 0x1ff
+#endif /* XK_LATIN2 */
+
+/*
+ * Latin 3
+ * Byte 3 = 2
+ */
+
+#ifdef XK_LATIN3
+#define XK_Hstroke 0x2a1
+#define XK_Hcircumflex 0x2a6
+#define XK_Iabovedot 0x2a9
+#define XK_Gbreve 0x2ab
+#define XK_Jcircumflex 0x2ac
+#define XK_hstroke 0x2b1
+#define XK_hcircumflex 0x2b6
+#define XK_idotless 0x2b9
+#define XK_gbreve 0x2bb
+#define XK_jcircumflex 0x2bc
+#define XK_Cabovedot 0x2c5
+#define XK_Ccircumflex 0x2c6
+#define XK_Gabovedot 0x2d5
+#define XK_Gcircumflex 0x2d8
+#define XK_Ubreve 0x2dd
+#define XK_Scircumflex 0x2de
+#define XK_cabovedot 0x2e5
+#define XK_ccircumflex 0x2e6
+#define XK_gabovedot 0x2f5
+#define XK_gcircumflex 0x2f8
+#define XK_ubreve 0x2fd
+#define XK_scircumflex 0x2fe
+#endif /* XK_LATIN3 */
+
+
+/*
+ * Latin 4
+ * Byte 3 = 3
+ */
+
+#ifdef XK_LATIN4
+#define XK_kra 0x3a2
+#define XK_kappa 0x3a2 /* deprecated */
+#define XK_Rcedilla 0x3a3
+#define XK_Itilde 0x3a5
+#define XK_Lcedilla 0x3a6
+#define XK_Emacron 0x3aa
+#define XK_Gcedilla 0x3ab
+#define XK_Tslash 0x3ac
+#define XK_rcedilla 0x3b3
+#define XK_itilde 0x3b5
+#define XK_lcedilla 0x3b6
+#define XK_emacron 0x3ba
+#define XK_gcedilla 0x3bb
+#define XK_tslash 0x3bc
+#define XK_ENG 0x3bd
+#define XK_eng 0x3bf
+#define XK_Amacron 0x3c0
+#define XK_Iogonek 0x3c7
+#define XK_Eabovedot 0x3cc
+#define XK_Imacron 0x3cf
+#define XK_Ncedilla 0x3d1
+#define XK_Omacron 0x3d2
+#define XK_Kcedilla 0x3d3
+#define XK_Uogonek 0x3d9
+#define XK_Utilde 0x3dd
+#define XK_Umacron 0x3de
+#define XK_amacron 0x3e0
+#define XK_iogonek 0x3e7
+#define XK_eabovedot 0x3ec
+#define XK_imacron 0x3ef
+#define XK_ncedilla 0x3f1
+#define XK_omacron 0x3f2
+#define XK_kcedilla 0x3f3
+#define XK_uogonek 0x3f9
+#define XK_utilde 0x3fd
+#define XK_umacron 0x3fe
+#endif /* XK_LATIN4 */
+
+/*
+ * Latin-8
+ * Byte 3 = 18
+ */
+#ifdef XK_LATIN8
+#define XK_Babovedot 0x12a1
+#define XK_babovedot 0x12a2
+#define XK_Dabovedot 0x12a6
+#define XK_Wgrave 0x12a8
+#define XK_Wacute 0x12aa
+#define XK_dabovedot 0x12ab
+#define XK_Ygrave 0x12ac
+#define XK_Fabovedot 0x12b0
+#define XK_fabovedot 0x12b1
+#define XK_Mabovedot 0x12b4
+#define XK_mabovedot 0x12b5
+#define XK_Pabovedot 0x12b7
+#define XK_wgrave 0x12b8
+#define XK_pabovedot 0x12b9
+#define XK_wacute 0x12ba
+#define XK_Sabovedot 0x12bb
+#define XK_ygrave 0x12bc
+#define XK_Wdiaeresis 0x12bd
+#define XK_wdiaeresis 0x12be
+#define XK_sabovedot 0x12bf
+#define XK_Wcircumflex 0x12d0
+#define XK_Tabovedot 0x12d7
+#define XK_Ycircumflex 0x12de
+#define XK_wcircumflex 0x12f0
+#define XK_tabovedot 0x12f7
+#define XK_ycircumflex 0x12fe
+#endif /* XK_LATIN8 */
+
+/*
+ * Latin-9 (a.k.a. Latin-0)
+ * Byte 3 = 19
+ */
+
+#ifdef XK_LATIN9
+#define XK_OE 0x13bc
+#define XK_oe 0x13bd
+#define XK_Ydiaeresis 0x13be
+#endif /* XK_LATIN9 */
+
+/*
+ * Katakana
+ * Byte 3 = 4
+ */
+
+#ifdef XK_KATAKANA
+#define XK_overline 0x47e
+#define XK_kana_fullstop 0x4a1
+#define XK_kana_openingbracket 0x4a2
+#define XK_kana_closingbracket 0x4a3
+#define XK_kana_comma 0x4a4
+#define XK_kana_conjunctive 0x4a5
+#define XK_kana_middledot 0x4a5 /* deprecated */
+#define XK_kana_WO 0x4a6
+#define XK_kana_a 0x4a7
+#define XK_kana_i 0x4a8
+#define XK_kana_u 0x4a9
+#define XK_kana_e 0x4aa
+#define XK_kana_o 0x4ab
+#define XK_kana_ya 0x4ac
+#define XK_kana_yu 0x4ad
+#define XK_kana_yo 0x4ae
+#define XK_kana_tsu 0x4af
+#define XK_kana_tu 0x4af /* deprecated */
+#define XK_prolongedsound 0x4b0
+#define XK_kana_A 0x4b1
+#define XK_kana_I 0x4b2
+#define XK_kana_U 0x4b3
+#define XK_kana_E 0x4b4
+#define XK_kana_O 0x4b5
+#define XK_kana_KA 0x4b6
+#define XK_kana_KI 0x4b7
+#define XK_kana_KU 0x4b8
+#define XK_kana_KE 0x4b9
+#define XK_kana_KO 0x4ba
+#define XK_kana_SA 0x4bb
+#define XK_kana_SHI 0x4bc
+#define XK_kana_SU 0x4bd
+#define XK_kana_SE 0x4be
+#define XK_kana_SO 0x4bf
+#define XK_kana_TA 0x4c0
+#define XK_kana_CHI 0x4c1
+#define XK_kana_TI 0x4c1 /* deprecated */
+#define XK_kana_TSU 0x4c2
+#define XK_kana_TU 0x4c2 /* deprecated */
+#define XK_kana_TE 0x4c3
+#define XK_kana_TO 0x4c4
+#define XK_kana_NA 0x4c5
+#define XK_kana_NI 0x4c6
+#define XK_kana_NU 0x4c7
+#define XK_kana_NE 0x4c8
+#define XK_kana_NO 0x4c9
+#define XK_kana_HA 0x4ca
+#define XK_kana_HI 0x4cb
+#define XK_kana_FU 0x4cc
+#define XK_kana_HU 0x4cc /* deprecated */
+#define XK_kana_HE 0x4cd
+#define XK_kana_HO 0x4ce
+#define XK_kana_MA 0x4cf
+#define XK_kana_MI 0x4d0
+#define XK_kana_MU 0x4d1
+#define XK_kana_ME 0x4d2
+#define XK_kana_MO 0x4d3
+#define XK_kana_YA 0x4d4
+#define XK_kana_YU 0x4d5
+#define XK_kana_YO 0x4d6
+#define XK_kana_RA 0x4d7
+#define XK_kana_RI 0x4d8
+#define XK_kana_RU 0x4d9
+#define XK_kana_RE 0x4da
+#define XK_kana_RO 0x4db
+#define XK_kana_WA 0x4dc
+#define XK_kana_N 0x4dd
+#define XK_voicedsound 0x4de
+#define XK_semivoicedsound 0x4df
+#define XK_kana_switch 0xFF7E /* Alias for mode_switch */
+#endif /* XK_KATAKANA */
+
+/*
+ * Arabic
+ * Byte 3 = 5
+ */
+
+#ifdef XK_ARABIC
+#define XK_Farsi_0 0x590
+#define XK_Farsi_1 0x591
+#define XK_Farsi_2 0x592
+#define XK_Farsi_3 0x593
+#define XK_Farsi_4 0x594
+#define XK_Farsi_5 0x595
+#define XK_Farsi_6 0x596
+#define XK_Farsi_7 0x597
+#define XK_Farsi_8 0x598
+#define XK_Farsi_9 0x599
+#define XK_Arabic_percent 0x5a5
+#define XK_Arabic_superscript_alef 0x5a6
+#define XK_Arabic_tteh 0x5a7
+#define XK_Arabic_peh 0x5a8
+#define XK_Arabic_tcheh 0x5a9
+#define XK_Arabic_ddal 0x5aa
+#define XK_Arabic_rreh 0x5ab
+#define XK_Arabic_comma 0x5ac
+#define XK_Arabic_fullstop 0x5ae
+#define XK_Arabic_0 0x5b0
+#define XK_Arabic_1 0x5b1
+#define XK_Arabic_2 0x5b2
+#define XK_Arabic_3 0x5b3
+#define XK_Arabic_4 0x5b4
+#define XK_Arabic_5 0x5b5
+#define XK_Arabic_6 0x5b6
+#define XK_Arabic_7 0x5b7
+#define XK_Arabic_8 0x5b8
+#define XK_Arabic_9 0x5b9
+#define XK_Arabic_semicolon 0x5bb
+#define XK_Arabic_question_mark 0x5bf
+#define XK_Arabic_hamza 0x5c1
+#define XK_Arabic_maddaonalef 0x5c2
+#define XK_Arabic_hamzaonalef 0x5c3
+#define XK_Arabic_hamzaonwaw 0x5c4
+#define XK_Arabic_hamzaunderalef 0x5c5
+#define XK_Arabic_hamzaonyeh 0x5c6
+#define XK_Arabic_alef 0x5c7
+#define XK_Arabic_beh 0x5c8
+#define XK_Arabic_tehmarbuta 0x5c9
+#define XK_Arabic_teh 0x5ca
+#define XK_Arabic_theh 0x5cb
+#define XK_Arabic_jeem 0x5cc
+#define XK_Arabic_hah 0x5cd
+#define XK_Arabic_khah 0x5ce
+#define XK_Arabic_dal 0x5cf
+#define XK_Arabic_thal 0x5d0
+#define XK_Arabic_ra 0x5d1
+#define XK_Arabic_zain 0x5d2
+#define XK_Arabic_seen 0x5d3
+#define XK_Arabic_sheen 0x5d4
+#define XK_Arabic_sad 0x5d5
+#define XK_Arabic_dad 0x5d6
+#define XK_Arabic_tah 0x5d7
+#define XK_Arabic_zah 0x5d8
+#define XK_Arabic_ain 0x5d9
+#define XK_Arabic_ghain 0x5da
+#define XK_Arabic_tatweel 0x5e0
+#define XK_Arabic_feh 0x5e1
+#define XK_Arabic_qaf 0x5e2
+#define XK_Arabic_kaf 0x5e3
+#define XK_Arabic_lam 0x5e4
+#define XK_Arabic_meem 0x5e5
+#define XK_Arabic_noon 0x5e6
+#define XK_Arabic_ha 0x5e7
+#define XK_Arabic_heh 0x5e7 /* deprecated */
+#define XK_Arabic_waw 0x5e8
+#define XK_Arabic_alefmaksura 0x5e9
+#define XK_Arabic_yeh 0x5ea
+#define XK_Arabic_fathatan 0x5eb
+#define XK_Arabic_dammatan 0x5ec
+#define XK_Arabic_kasratan 0x5ed
+#define XK_Arabic_fatha 0x5ee
+#define XK_Arabic_damma 0x5ef
+#define XK_Arabic_kasra 0x5f0
+#define XK_Arabic_shadda 0x5f1
+#define XK_Arabic_sukun 0x5f2
+#define XK_Arabic_madda_above 0x5f3
+#define XK_Arabic_hamza_above 0x5f4
+#define XK_Arabic_hamza_below 0x5f5
+#define XK_Arabic_jeh 0x5f6
+#define XK_Arabic_veh 0x5f7
+#define XK_Arabic_keheh 0x5f8
+#define XK_Arabic_gaf 0x5f9
+#define XK_Arabic_noon_ghunna 0x5fa
+#define XK_Arabic_heh_doachashmee 0x5fb
+#define XK_Farsi_yeh 0x5fc
+#define XK_Arabic_farsi_yeh XK_Farsi_yeh
+#define XK_Arabic_yeh_baree 0x5fd
+#define XK_Arabic_heh_goal 0x5fe
+#define XK_Arabic_switch 0xFF7E /* Alias for mode_switch */
+#endif /* XK_ARABIC */
+
+/*
+ * Cyrillic
+ * Byte 3 = 6
+ */
+#ifdef XK_CYRILLIC
+#define XK_Cyrillic_GHE_bar 0x680
+#define XK_Cyrillic_ghe_bar 0x690
+#define XK_Cyrillic_ZHE_descender 0x681
+#define XK_Cyrillic_zhe_descender 0x691
+#define XK_Cyrillic_KA_descender 0x682
+#define XK_Cyrillic_ka_descender 0x692
+#define XK_Cyrillic_KA_vertstroke 0x683
+#define XK_Cyrillic_ka_vertstroke 0x693
+#define XK_Cyrillic_EN_descender 0x684
+#define XK_Cyrillic_en_descender 0x694
+#define XK_Cyrillic_U_straight 0x685
+#define XK_Cyrillic_u_straight 0x695
+#define XK_Cyrillic_U_straight_bar 0x686
+#define XK_Cyrillic_u_straight_bar 0x696
+#define XK_Cyrillic_HA_descender 0x687
+#define XK_Cyrillic_ha_descender 0x697
+#define XK_Cyrillic_CHE_descender 0x688
+#define XK_Cyrillic_che_descender 0x698
+#define XK_Cyrillic_CHE_vertstroke 0x689
+#define XK_Cyrillic_che_vertstroke 0x699
+#define XK_Cyrillic_SHHA 0x68a
+#define XK_Cyrillic_shha 0x69a
+
+#define XK_Cyrillic_SCHWA 0x68c
+#define XK_Cyrillic_schwa 0x69c
+#define XK_Cyrillic_I_macron 0x68d
+#define XK_Cyrillic_i_macron 0x69d
+#define XK_Cyrillic_O_bar 0x68e
+#define XK_Cyrillic_o_bar 0x69e
+#define XK_Cyrillic_U_macron 0x68f
+#define XK_Cyrillic_u_macron 0x69f
+
+#define XK_Serbian_dje 0x6a1
+#define XK_Macedonia_gje 0x6a2
+#define XK_Cyrillic_io 0x6a3
+#define XK_Ukrainian_ie 0x6a4
+#define XK_Ukranian_je 0x6a4 /* deprecated */
+#define XK_Macedonia_dse 0x6a5
+#define XK_Ukrainian_i 0x6a6
+#define XK_Ukranian_i 0x6a6 /* deprecated */
+#define XK_Ukrainian_yi 0x6a7
+#define XK_Ukranian_yi 0x6a7 /* deprecated */
+#define XK_Cyrillic_je 0x6a8
+#define XK_Serbian_je 0x6a8 /* deprecated */
+#define XK_Cyrillic_lje 0x6a9
+#define XK_Serbian_lje 0x6a9 /* deprecated */
+#define XK_Cyrillic_nje 0x6aa
+#define XK_Serbian_nje 0x6aa /* deprecated */
+#define XK_Serbian_tshe 0x6ab
+#define XK_Macedonia_kje 0x6ac
+#define XK_Ukrainian_ghe_with_upturn 0x6ad
+#define XK_Byelorussian_shortu 0x6ae
+#define XK_Cyrillic_dzhe 0x6af
+#define XK_Serbian_dze 0x6af /* deprecated */
+#define XK_numerosign 0x6b0
+#define XK_Serbian_DJE 0x6b1
+#define XK_Macedonia_GJE 0x6b2
+#define XK_Cyrillic_IO 0x6b3
+#define XK_Ukrainian_IE 0x6b4
+#define XK_Ukranian_JE 0x6b4 /* deprecated */
+#define XK_Macedonia_DSE 0x6b5
+#define XK_Ukrainian_I 0x6b6
+#define XK_Ukranian_I 0x6b6 /* deprecated */
+#define XK_Ukrainian_YI 0x6b7
+#define XK_Ukranian_YI 0x6b7 /* deprecated */
+#define XK_Cyrillic_JE 0x6b8
+#define XK_Serbian_JE 0x6b8 /* deprecated */
+#define XK_Cyrillic_LJE 0x6b9
+#define XK_Serbian_LJE 0x6b9 /* deprecated */
+#define XK_Cyrillic_NJE 0x6ba
+#define XK_Serbian_NJE 0x6ba /* deprecated */
+#define XK_Serbian_TSHE 0x6bb
+#define XK_Macedonia_KJE 0x6bc
+#define XK_Ukrainian_GHE_WITH_UPTURN 0x6bd
+#define XK_Byelorussian_SHORTU 0x6be
+#define XK_Cyrillic_DZHE 0x6bf
+#define XK_Serbian_DZE 0x6bf /* deprecated */
+#define XK_Cyrillic_yu 0x6c0
+#define XK_Cyrillic_a 0x6c1
+#define XK_Cyrillic_be 0x6c2
+#define XK_Cyrillic_tse 0x6c3
+#define XK_Cyrillic_de 0x6c4
+#define XK_Cyrillic_ie 0x6c5
+#define XK_Cyrillic_ef 0x6c6
+#define XK_Cyrillic_ghe 0x6c7
+#define XK_Cyrillic_ha 0x6c8
+#define XK_Cyrillic_i 0x6c9
+#define XK_Cyrillic_shorti 0x6ca
+#define XK_Cyrillic_ka 0x6cb
+#define XK_Cyrillic_el 0x6cc
+#define XK_Cyrillic_em 0x6cd
+#define XK_Cyrillic_en 0x6ce
+#define XK_Cyrillic_o 0x6cf
+#define XK_Cyrillic_pe 0x6d0
+#define XK_Cyrillic_ya 0x6d1
+#define XK_Cyrillic_er 0x6d2
+#define XK_Cyrillic_es 0x6d3
+#define XK_Cyrillic_te 0x6d4
+#define XK_Cyrillic_u 0x6d5
+#define XK_Cyrillic_zhe 0x6d6
+#define XK_Cyrillic_ve 0x6d7
+#define XK_Cyrillic_softsign 0x6d8
+#define XK_Cyrillic_yeru 0x6d9
+#define XK_Cyrillic_ze 0x6da
+#define XK_Cyrillic_sha 0x6db
+#define XK_Cyrillic_e 0x6dc
+#define XK_Cyrillic_shcha 0x6dd
+#define XK_Cyrillic_che 0x6de
+#define XK_Cyrillic_hardsign 0x6df
+#define XK_Cyrillic_YU 0x6e0
+#define XK_Cyrillic_A 0x6e1
+#define XK_Cyrillic_BE 0x6e2
+#define XK_Cyrillic_TSE 0x6e3
+#define XK_Cyrillic_DE 0x6e4
+#define XK_Cyrillic_IE 0x6e5
+#define XK_Cyrillic_EF 0x6e6
+#define XK_Cyrillic_GHE 0x6e7
+#define XK_Cyrillic_HA 0x6e8
+#define XK_Cyrillic_I 0x6e9
+#define XK_Cyrillic_SHORTI 0x6ea
+#define XK_Cyrillic_KA 0x6eb
+#define XK_Cyrillic_EL 0x6ec
+#define XK_Cyrillic_EM 0x6ed
+#define XK_Cyrillic_EN 0x6ee
+#define XK_Cyrillic_O 0x6ef
+#define XK_Cyrillic_PE 0x6f0
+#define XK_Cyrillic_YA 0x6f1
+#define XK_Cyrillic_ER 0x6f2
+#define XK_Cyrillic_ES 0x6f3
+#define XK_Cyrillic_TE 0x6f4
+#define XK_Cyrillic_U 0x6f5
+#define XK_Cyrillic_ZHE 0x6f6
+#define XK_Cyrillic_VE 0x6f7
+#define XK_Cyrillic_SOFTSIGN 0x6f8
+#define XK_Cyrillic_YERU 0x6f9
+#define XK_Cyrillic_ZE 0x6fa
+#define XK_Cyrillic_SHA 0x6fb
+#define XK_Cyrillic_E 0x6fc
+#define XK_Cyrillic_SHCHA 0x6fd
+#define XK_Cyrillic_CHE 0x6fe
+#define XK_Cyrillic_HARDSIGN 0x6ff
+#endif /* XK_CYRILLIC */
+
+/*
+ * Greek
+ * Byte 3 = 7
+ */
+
+#ifdef XK_GREEK
+#define XK_Greek_ALPHAaccent 0x7a1
+#define XK_Greek_EPSILONaccent 0x7a2
+#define XK_Greek_ETAaccent 0x7a3
+#define XK_Greek_IOTAaccent 0x7a4
+#define XK_Greek_IOTAdieresis 0x7a5
+#define XK_Greek_IOTAdiaeresis XK_Greek_IOTAdieresis /* old typo */
+#define XK_Greek_OMICRONaccent 0x7a7
+#define XK_Greek_UPSILONaccent 0x7a8
+#define XK_Greek_UPSILONdieresis 0x7a9
+#define XK_Greek_OMEGAaccent 0x7ab
+#define XK_Greek_accentdieresis 0x7ae
+#define XK_Greek_horizbar 0x7af
+#define XK_Greek_alphaaccent 0x7b1
+#define XK_Greek_epsilonaccent 0x7b2
+#define XK_Greek_etaaccent 0x7b3
+#define XK_Greek_iotaaccent 0x7b4
+#define XK_Greek_iotadieresis 0x7b5
+#define XK_Greek_iotaaccentdieresis 0x7b6
+#define XK_Greek_omicronaccent 0x7b7
+#define XK_Greek_upsilonaccent 0x7b8
+#define XK_Greek_upsilondieresis 0x7b9
+#define XK_Greek_upsilonaccentdieresis 0x7ba
+#define XK_Greek_omegaaccent 0x7bb
+#define XK_Greek_ALPHA 0x7c1
+#define XK_Greek_BETA 0x7c2
+#define XK_Greek_GAMMA 0x7c3
+#define XK_Greek_DELTA 0x7c4
+#define XK_Greek_EPSILON 0x7c5
+#define XK_Greek_ZETA 0x7c6
+#define XK_Greek_ETA 0x7c7
+#define XK_Greek_THETA 0x7c8
+#define XK_Greek_IOTA 0x7c9
+#define XK_Greek_KAPPA 0x7ca
+#define XK_Greek_LAMDA 0x7cb
+#define XK_Greek_LAMBDA 0x7cb
+#define XK_Greek_MU 0x7cc
+#define XK_Greek_NU 0x7cd
+#define XK_Greek_XI 0x7ce
+#define XK_Greek_OMICRON 0x7cf
+#define XK_Greek_PI 0x7d0
+#define XK_Greek_RHO 0x7d1
+#define XK_Greek_SIGMA 0x7d2
+#define XK_Greek_TAU 0x7d4
+#define XK_Greek_UPSILON 0x7d5
+#define XK_Greek_PHI 0x7d6
+#define XK_Greek_CHI 0x7d7
+#define XK_Greek_PSI 0x7d8
+#define XK_Greek_OMEGA 0x7d9
+#define XK_Greek_alpha 0x7e1
+#define XK_Greek_beta 0x7e2
+#define XK_Greek_gamma 0x7e3
+#define XK_Greek_delta 0x7e4
+#define XK_Greek_epsilon 0x7e5
+#define XK_Greek_zeta 0x7e6
+#define XK_Greek_eta 0x7e7
+#define XK_Greek_theta 0x7e8
+#define XK_Greek_iota 0x7e9
+#define XK_Greek_kappa 0x7ea
+#define XK_Greek_lamda 0x7eb
+#define XK_Greek_lambda 0x7eb
+#define XK_Greek_mu 0x7ec
+#define XK_Greek_nu 0x7ed
+#define XK_Greek_xi 0x7ee
+#define XK_Greek_omicron 0x7ef
+#define XK_Greek_pi 0x7f0
+#define XK_Greek_rho 0x7f1
+#define XK_Greek_sigma 0x7f2
+#define XK_Greek_finalsmallsigma 0x7f3
+#define XK_Greek_tau 0x7f4
+#define XK_Greek_upsilon 0x7f5
+#define XK_Greek_phi 0x7f6
+#define XK_Greek_chi 0x7f7
+#define XK_Greek_psi 0x7f8
+#define XK_Greek_omega 0x7f9
+#define XK_Greek_switch 0xFF7E /* Alias for mode_switch */
+#endif /* XK_GREEK */
+
+/*
+ * Technical
+ * Byte 3 = 8
+ */
+
+#ifdef XK_TECHNICAL
+#define XK_leftradical 0x8a1
+#define XK_topleftradical 0x8a2
+#define XK_horizconnector 0x8a3
+#define XK_topintegral 0x8a4
+#define XK_botintegral 0x8a5
+#define XK_vertconnector 0x8a6
+#define XK_topleftsqbracket 0x8a7
+#define XK_botleftsqbracket 0x8a8
+#define XK_toprightsqbracket 0x8a9
+#define XK_botrightsqbracket 0x8aa
+#define XK_topleftparens 0x8ab
+#define XK_botleftparens 0x8ac
+#define XK_toprightparens 0x8ad
+#define XK_botrightparens 0x8ae
+#define XK_leftmiddlecurlybrace 0x8af
+#define XK_rightmiddlecurlybrace 0x8b0
+#define XK_topleftsummation 0x8b1
+#define XK_botleftsummation 0x8b2
+#define XK_topvertsummationconnector 0x8b3
+#define XK_botvertsummationconnector 0x8b4
+#define XK_toprightsummation 0x8b5
+#define XK_botrightsummation 0x8b6
+#define XK_rightmiddlesummation 0x8b7
+#define XK_lessthanequal 0x8bc
+#define XK_notequal 0x8bd
+#define XK_greaterthanequal 0x8be
+#define XK_integral 0x8bf
+#define XK_therefore 0x8c0
+#define XK_variation 0x8c1
+#define XK_infinity 0x8c2
+#define XK_nabla 0x8c5
+#define XK_approximate 0x8c8
+#define XK_similarequal 0x8c9
+#define XK_ifonlyif 0x8cd
+#define XK_implies 0x8ce
+#define XK_identical 0x8cf
+#define XK_radical 0x8d6
+#define XK_includedin 0x8da
+#define XK_includes 0x8db
+#define XK_intersection 0x8dc
+#define XK_union 0x8dd
+#define XK_logicaland 0x8de
+#define XK_logicalor 0x8df
+#define XK_partialderivative 0x8ef
+#define XK_function 0x8f6
+#define XK_leftarrow 0x8fb
+#define XK_uparrow 0x8fc
+#define XK_rightarrow 0x8fd
+#define XK_downarrow 0x8fe
+#endif /* XK_TECHNICAL */
+
+/*
+ * Special
+ * Byte 3 = 9
+ */
+
+#ifdef XK_SPECIAL
+#define XK_blank 0x9df
+#define XK_soliddiamond 0x9e0
+#define XK_checkerboard 0x9e1
+#define XK_ht 0x9e2
+#define XK_ff 0x9e3
+#define XK_cr 0x9e4
+#define XK_lf 0x9e5
+#define XK_nl 0x9e8
+#define XK_vt 0x9e9
+#define XK_lowrightcorner 0x9ea
+#define XK_uprightcorner 0x9eb
+#define XK_upleftcorner 0x9ec
+#define XK_lowleftcorner 0x9ed
+#define XK_crossinglines 0x9ee
+#define XK_horizlinescan1 0x9ef
+#define XK_horizlinescan3 0x9f0
+#define XK_horizlinescan5 0x9f1
+#define XK_horizlinescan7 0x9f2
+#define XK_horizlinescan9 0x9f3
+#define XK_leftt 0x9f4
+#define XK_rightt 0x9f5
+#define XK_bott 0x9f6
+#define XK_topt 0x9f7
+#define XK_vertbar 0x9f8
+#endif /* XK_SPECIAL */
+
+/*
+ * Publishing
+ * Byte 3 = a
+ */
+
+#ifdef XK_PUBLISHING
+#define XK_emspace 0xaa1
+#define XK_enspace 0xaa2
+#define XK_em3space 0xaa3
+#define XK_em4space 0xaa4
+#define XK_digitspace 0xaa5
+#define XK_punctspace 0xaa6
+#define XK_thinspace 0xaa7
+#define XK_hairspace 0xaa8
+#define XK_emdash 0xaa9
+#define XK_endash 0xaaa
+#define XK_signifblank 0xaac
+#define XK_ellipsis 0xaae
+#define XK_doubbaselinedot 0xaaf
+#define XK_onethird 0xab0
+#define XK_twothirds 0xab1
+#define XK_onefifth 0xab2
+#define XK_twofifths 0xab3
+#define XK_threefifths 0xab4
+#define XK_fourfifths 0xab5
+#define XK_onesixth 0xab6
+#define XK_fivesixths 0xab7
+#define XK_careof 0xab8
+#define XK_figdash 0xabb
+#define XK_leftanglebracket 0xabc
+#define XK_decimalpoint 0xabd
+#define XK_rightanglebracket 0xabe
+#define XK_marker 0xabf
+#define XK_oneeighth 0xac3
+#define XK_threeeighths 0xac4
+#define XK_fiveeighths 0xac5
+#define XK_seveneighths 0xac6
+#define XK_trademark 0xac9
+#define XK_signaturemark 0xaca
+#define XK_trademarkincircle 0xacb
+#define XK_leftopentriangle 0xacc
+#define XK_rightopentriangle 0xacd
+#define XK_emopencircle 0xace
+#define XK_emopenrectangle 0xacf
+#define XK_leftsinglequotemark 0xad0
+#define XK_rightsinglequotemark 0xad1
+#define XK_leftdoublequotemark 0xad2
+#define XK_rightdoublequotemark 0xad3
+#define XK_prescription 0xad4
+#define XK_minutes 0xad6
+#define XK_seconds 0xad7
+#define XK_latincross 0xad9
+#define XK_hexagram 0xada
+#define XK_filledrectbullet 0xadb
+#define XK_filledlefttribullet 0xadc
+#define XK_filledrighttribullet 0xadd
+#define XK_emfilledcircle 0xade
+#define XK_emfilledrect 0xadf
+#define XK_enopencircbullet 0xae0
+#define XK_enopensquarebullet 0xae1
+#define XK_openrectbullet 0xae2
+#define XK_opentribulletup 0xae3
+#define XK_opentribulletdown 0xae4
+#define XK_openstar 0xae5
+#define XK_enfilledcircbullet 0xae6
+#define XK_enfilledsqbullet 0xae7
+#define XK_filledtribulletup 0xae8
+#define XK_filledtribulletdown 0xae9
+#define XK_leftpointer 0xaea
+#define XK_rightpointer 0xaeb
+#define XK_club 0xaec
+#define XK_diamond 0xaed
+#define XK_heart 0xaee
+#define XK_maltesecross 0xaf0
+#define XK_dagger 0xaf1
+#define XK_doubledagger 0xaf2
+#define XK_checkmark 0xaf3
+#define XK_ballotcross 0xaf4
+#define XK_musicalsharp 0xaf5
+#define XK_musicalflat 0xaf6
+#define XK_malesymbol 0xaf7
+#define XK_femalesymbol 0xaf8
+#define XK_telephone 0xaf9
+#define XK_telephonerecorder 0xafa
+#define XK_phonographcopyright 0xafb
+#define XK_caret 0xafc
+#define XK_singlelowquotemark 0xafd
+#define XK_doublelowquotemark 0xafe
+#define XK_cursor 0xaff
+#endif /* XK_PUBLISHING */
+
+/*
+ * APL
+ * Byte 3 = b
+ */
+
+#ifdef XK_APL
+#define XK_leftcaret 0xba3
+#define XK_rightcaret 0xba6
+#define XK_downcaret 0xba8
+#define XK_upcaret 0xba9
+#define XK_overbar 0xbc0
+#define XK_downtack 0xbc2
+#define XK_upshoe 0xbc3
+#define XK_downstile 0xbc4
+#define XK_underbar 0xbc6
+#define XK_jot 0xbca
+#define XK_quad 0xbcc
+#define XK_uptack 0xbce
+#define XK_circle 0xbcf
+#define XK_upstile 0xbd3
+#define XK_downshoe 0xbd6
+#define XK_rightshoe 0xbd8
+#define XK_leftshoe 0xbda
+#define XK_lefttack 0xbdc
+#define XK_righttack 0xbfc
+#endif /* XK_APL */
+
+/*
+ * Hebrew
+ * Byte 3 = c
+ */
+
+#ifdef XK_HEBREW
+#define XK_hebrew_doublelowline 0xcdf
+#define XK_hebrew_aleph 0xce0
+#define XK_hebrew_bet 0xce1
+#define XK_hebrew_beth 0xce1 /* deprecated */
+#define XK_hebrew_gimel 0xce2
+#define XK_hebrew_gimmel 0xce2 /* deprecated */
+#define XK_hebrew_dalet 0xce3
+#define XK_hebrew_daleth 0xce3 /* deprecated */
+#define XK_hebrew_he 0xce4
+#define XK_hebrew_waw 0xce5
+#define XK_hebrew_zain 0xce6
+#define XK_hebrew_zayin 0xce6 /* deprecated */
+#define XK_hebrew_chet 0xce7
+#define XK_hebrew_het 0xce7 /* deprecated */
+#define XK_hebrew_tet 0xce8
+#define XK_hebrew_teth 0xce8 /* deprecated */
+#define XK_hebrew_yod 0xce9
+#define XK_hebrew_finalkaph 0xcea
+#define XK_hebrew_kaph 0xceb
+#define XK_hebrew_lamed 0xcec
+#define XK_hebrew_finalmem 0xced
+#define XK_hebrew_mem 0xcee
+#define XK_hebrew_finalnun 0xcef
+#define XK_hebrew_nun 0xcf0
+#define XK_hebrew_samech 0xcf1
+#define XK_hebrew_samekh 0xcf1 /* deprecated */
+#define XK_hebrew_ayin 0xcf2
+#define XK_hebrew_finalpe 0xcf3
+#define XK_hebrew_pe 0xcf4
+#define XK_hebrew_finalzade 0xcf5
+#define XK_hebrew_finalzadi 0xcf5 /* deprecated */
+#define XK_hebrew_zade 0xcf6
+#define XK_hebrew_zadi 0xcf6 /* deprecated */
+#define XK_hebrew_qoph 0xcf7
+#define XK_hebrew_kuf 0xcf7 /* deprecated */
+#define XK_hebrew_resh 0xcf8
+#define XK_hebrew_shin 0xcf9
+#define XK_hebrew_taw 0xcfa
+#define XK_hebrew_taf 0xcfa /* deprecated */
+#define XK_Hebrew_switch 0xFF7E /* Alias for mode_switch */
+#endif /* XK_HEBREW */
+
+/*
+ * Thai
+ * Byte 3 = d
+ */
+
+#ifdef XK_THAI
+#define XK_Thai_kokai 0xda1
+#define XK_Thai_khokhai 0xda2
+#define XK_Thai_khokhuat 0xda3
+#define XK_Thai_khokhwai 0xda4
+#define XK_Thai_khokhon 0xda5
+#define XK_Thai_khorakhang 0xda6
+#define XK_Thai_ngongu 0xda7
+#define XK_Thai_chochan 0xda8
+#define XK_Thai_choching 0xda9
+#define XK_Thai_chochang 0xdaa
+#define XK_Thai_soso 0xdab
+#define XK_Thai_chochoe 0xdac
+#define XK_Thai_yoying 0xdad
+#define XK_Thai_dochada 0xdae
+#define XK_Thai_topatak 0xdaf
+#define XK_Thai_thothan 0xdb0
+#define XK_Thai_thonangmontho 0xdb1
+#define XK_Thai_thophuthao 0xdb2
+#define XK_Thai_nonen 0xdb3
+#define XK_Thai_dodek 0xdb4
+#define XK_Thai_totao 0xdb5
+#define XK_Thai_thothung 0xdb6
+#define XK_Thai_thothahan 0xdb7
+#define XK_Thai_thothong 0xdb8
+#define XK_Thai_nonu 0xdb9
+#define XK_Thai_bobaimai 0xdba
+#define XK_Thai_popla 0xdbb
+#define XK_Thai_phophung 0xdbc
+#define XK_Thai_fofa 0xdbd
+#define XK_Thai_phophan 0xdbe
+#define XK_Thai_fofan 0xdbf
+#define XK_Thai_phosamphao 0xdc0
+#define XK_Thai_moma 0xdc1
+#define XK_Thai_yoyak 0xdc2
+#define XK_Thai_rorua 0xdc3
+#define XK_Thai_ru 0xdc4
+#define XK_Thai_loling 0xdc5
+#define XK_Thai_lu 0xdc6
+#define XK_Thai_wowaen 0xdc7
+#define XK_Thai_sosala 0xdc8
+#define XK_Thai_sorusi 0xdc9
+#define XK_Thai_sosua 0xdca
+#define XK_Thai_hohip 0xdcb
+#define XK_Thai_lochula 0xdcc
+#define XK_Thai_oang 0xdcd
+#define XK_Thai_honokhuk 0xdce
+#define XK_Thai_paiyannoi 0xdcf
+#define XK_Thai_saraa 0xdd0
+#define XK_Thai_maihanakat 0xdd1
+#define XK_Thai_saraaa 0xdd2
+#define XK_Thai_saraam 0xdd3
+#define XK_Thai_sarai 0xdd4
+#define XK_Thai_saraii 0xdd5
+#define XK_Thai_saraue 0xdd6
+#define XK_Thai_sarauee 0xdd7
+#define XK_Thai_sarau 0xdd8
+#define XK_Thai_sarauu 0xdd9
+#define XK_Thai_phinthu 0xdda
+#define XK_Thai_maihanakat_maitho 0xdde
+#define XK_Thai_baht 0xddf
+#define XK_Thai_sarae 0xde0
+#define XK_Thai_saraae 0xde1
+#define XK_Thai_sarao 0xde2
+#define XK_Thai_saraaimaimuan 0xde3
+#define XK_Thai_saraaimaimalai 0xde4
+#define XK_Thai_lakkhangyao 0xde5
+#define XK_Thai_maiyamok 0xde6
+#define XK_Thai_maitaikhu 0xde7
+#define XK_Thai_maiek 0xde8
+#define XK_Thai_maitho 0xde9
+#define XK_Thai_maitri 0xdea
+#define XK_Thai_maichattawa 0xdeb
+#define XK_Thai_thanthakhat 0xdec
+#define XK_Thai_nikhahit 0xded
+#define XK_Thai_leksun 0xdf0
+#define XK_Thai_leknung 0xdf1
+#define XK_Thai_leksong 0xdf2
+#define XK_Thai_leksam 0xdf3
+#define XK_Thai_leksi 0xdf4
+#define XK_Thai_lekha 0xdf5
+#define XK_Thai_lekhok 0xdf6
+#define XK_Thai_lekchet 0xdf7
+#define XK_Thai_lekpaet 0xdf8
+#define XK_Thai_lekkao 0xdf9
+#endif /* XK_THAI */
+
+/*
+ * Korean
+ * Byte 3 = e
+ */
+
+#ifdef XK_KOREAN
+
+#define XK_Hangul 0xff31 /* Hangul start/stop(toggle) */
+#define XK_Hangul_Start 0xff32 /* Hangul start */
+#define XK_Hangul_End 0xff33 /* Hangul end, English start */
+#define XK_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */
+#define XK_Hangul_Jamo 0xff35 /* Hangul Jamo mode */
+#define XK_Hangul_Romaja 0xff36 /* Hangul Romaja mode */
+#define XK_Hangul_Codeinput 0xff37 /* Hangul code input mode */
+#define XK_Hangul_Jeonja 0xff38 /* Jeonja mode */
+#define XK_Hangul_Banja 0xff39 /* Banja mode */
+#define XK_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */
+#define XK_Hangul_PostHanja 0xff3b /* Post Hanja conversion */
+#define XK_Hangul_SingleCandidate 0xff3c /* Single candidate */
+#define XK_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */
+#define XK_Hangul_PreviousCandidate 0xff3e /* Previous candidate */
+#define XK_Hangul_Special 0xff3f /* Special symbols */
+#define XK_Hangul_switch 0xFF7E /* Alias for mode_switch */
+
+/* Hangul Consonant Characters */
+#define XK_Hangul_Kiyeog 0xea1
+#define XK_Hangul_SsangKiyeog 0xea2
+#define XK_Hangul_KiyeogSios 0xea3
+#define XK_Hangul_Nieun 0xea4
+#define XK_Hangul_NieunJieuj 0xea5
+#define XK_Hangul_NieunHieuh 0xea6
+#define XK_Hangul_Dikeud 0xea7
+#define XK_Hangul_SsangDikeud 0xea8
+#define XK_Hangul_Rieul 0xea9
+#define XK_Hangul_RieulKiyeog 0xeaa
+#define XK_Hangul_RieulMieum 0xeab
+#define XK_Hangul_RieulPieub 0xeac
+#define XK_Hangul_RieulSios 0xead
+#define XK_Hangul_RieulTieut 0xeae
+#define XK_Hangul_RieulPhieuf 0xeaf
+#define XK_Hangul_RieulHieuh 0xeb0
+#define XK_Hangul_Mieum 0xeb1
+#define XK_Hangul_Pieub 0xeb2
+#define XK_Hangul_SsangPieub 0xeb3
+#define XK_Hangul_PieubSios 0xeb4
+#define XK_Hangul_Sios 0xeb5
+#define XK_Hangul_SsangSios 0xeb6
+#define XK_Hangul_Ieung 0xeb7
+#define XK_Hangul_Jieuj 0xeb8
+#define XK_Hangul_SsangJieuj 0xeb9
+#define XK_Hangul_Cieuc 0xeba
+#define XK_Hangul_Khieuq 0xebb
+#define XK_Hangul_Tieut 0xebc
+#define XK_Hangul_Phieuf 0xebd
+#define XK_Hangul_Hieuh 0xebe
+
+/* Hangul Vowel Characters */
+#define XK_Hangul_A 0xebf
+#define XK_Hangul_AE 0xec0
+#define XK_Hangul_YA 0xec1
+#define XK_Hangul_YAE 0xec2
+#define XK_Hangul_EO 0xec3
+#define XK_Hangul_E 0xec4
+#define XK_Hangul_YEO 0xec5
+#define XK_Hangul_YE 0xec6
+#define XK_Hangul_O 0xec7
+#define XK_Hangul_WA 0xec8
+#define XK_Hangul_WAE 0xec9
+#define XK_Hangul_OE 0xeca
+#define XK_Hangul_YO 0xecb
+#define XK_Hangul_U 0xecc
+#define XK_Hangul_WEO 0xecd
+#define XK_Hangul_WE 0xece
+#define XK_Hangul_WI 0xecf
+#define XK_Hangul_YU 0xed0
+#define XK_Hangul_EU 0xed1
+#define XK_Hangul_YI 0xed2
+#define XK_Hangul_I 0xed3
+
+/* Hangul syllable-final (JongSeong) Characters */
+#define XK_Hangul_J_Kiyeog 0xed4
+#define XK_Hangul_J_SsangKiyeog 0xed5
+#define XK_Hangul_J_KiyeogSios 0xed6
+#define XK_Hangul_J_Nieun 0xed7
+#define XK_Hangul_J_NieunJieuj 0xed8
+#define XK_Hangul_J_NieunHieuh 0xed9
+#define XK_Hangul_J_Dikeud 0xeda
+#define XK_Hangul_J_Rieul 0xedb
+#define XK_Hangul_J_RieulKiyeog 0xedc
+#define XK_Hangul_J_RieulMieum 0xedd
+#define XK_Hangul_J_RieulPieub 0xede
+#define XK_Hangul_J_RieulSios 0xedf
+#define XK_Hangul_J_RieulTieut 0xee0
+#define XK_Hangul_J_RieulPhieuf 0xee1
+#define XK_Hangul_J_RieulHieuh 0xee2
+#define XK_Hangul_J_Mieum 0xee3
+#define XK_Hangul_J_Pieub 0xee4
+#define XK_Hangul_J_PieubSios 0xee5
+#define XK_Hangul_J_Sios 0xee6
+#define XK_Hangul_J_SsangSios 0xee7
+#define XK_Hangul_J_Ieung 0xee8
+#define XK_Hangul_J_Jieuj 0xee9
+#define XK_Hangul_J_Cieuc 0xeea
+#define XK_Hangul_J_Khieuq 0xeeb
+#define XK_Hangul_J_Tieut 0xeec
+#define XK_Hangul_J_Phieuf 0xeed
+#define XK_Hangul_J_Hieuh 0xeee
+
+/* Ancient Hangul Consonant Characters */
+#define XK_Hangul_RieulYeorinHieuh 0xeef
+#define XK_Hangul_SunkyeongeumMieum 0xef0
+#define XK_Hangul_SunkyeongeumPieub 0xef1
+#define XK_Hangul_PanSios 0xef2
+#define XK_Hangul_KkogjiDalrinIeung 0xef3
+#define XK_Hangul_SunkyeongeumPhieuf 0xef4
+#define XK_Hangul_YeorinHieuh 0xef5
+
+/* Ancient Hangul Vowel Characters */
+#define XK_Hangul_AraeA 0xef6
+#define XK_Hangul_AraeAE 0xef7
+
+/* Ancient Hangul syllable-final (JongSeong) Characters */
+#define XK_Hangul_J_PanSios 0xef8
+#define XK_Hangul_J_KkogjiDalrinIeung 0xef9
+#define XK_Hangul_J_YeorinHieuh 0xefa
+
+/* Korean currency symbol */
+#define XK_Korean_Won 0xeff
+
+#endif /* XK_KOREAN */
+
+/*
+ * Armenian
+ * Byte 3 = 0x14
+ */
+
+#ifdef XK_ARMENIAN
+#define XK_Armenian_eternity 0x14a1
+#define XK_Armenian_ligature_ew 0x14a2
+#define XK_Armenian_full_stop 0x14a3
+#define XK_Armenian_verjaket 0x14a3
+#define XK_Armenian_parenright 0x14a4
+#define XK_Armenian_parenleft 0x14a5
+#define XK_Armenian_guillemotright 0x14a6
+#define XK_Armenian_guillemotleft 0x14a7
+#define XK_Armenian_em_dash 0x14a8
+#define XK_Armenian_dot 0x14a9
+#define XK_Armenian_mijaket 0x14a9
+#define XK_Armenian_separation_mark 0x14aa
+#define XK_Armenian_but 0x14aa
+#define XK_Armenian_comma 0x14ab
+#define XK_Armenian_en_dash 0x14ac
+#define XK_Armenian_hyphen 0x14ad
+#define XK_Armenian_yentamna 0x14ad
+#define XK_Armenian_ellipsis 0x14ae
+#define XK_Armenian_exclam 0x14af
+#define XK_Armenian_amanak 0x14af
+#define XK_Armenian_accent 0x14b0
+#define XK_Armenian_shesht 0x14b0
+#define XK_Armenian_question 0x14b1
+#define XK_Armenian_paruyk 0x14b1
+#define XK_Armenian_AYB 0x14b2
+#define XK_Armenian_ayb 0x14b3
+#define XK_Armenian_BEN 0x14b4
+#define XK_Armenian_ben 0x14b5
+#define XK_Armenian_GIM 0x14b6
+#define XK_Armenian_gim 0x14b7
+#define XK_Armenian_DA 0x14b8
+#define XK_Armenian_da 0x14b9
+#define XK_Armenian_YECH 0x14ba
+#define XK_Armenian_yech 0x14bb
+#define XK_Armenian_ZA 0x14bc
+#define XK_Armenian_za 0x14bd
+#define XK_Armenian_E 0x14be
+#define XK_Armenian_e 0x14bf
+#define XK_Armenian_AT 0x14c0
+#define XK_Armenian_at 0x14c1
+#define XK_Armenian_TO 0x14c2
+#define XK_Armenian_to 0x14c3
+#define XK_Armenian_ZHE 0x14c4
+#define XK_Armenian_zhe 0x14c5
+#define XK_Armenian_INI 0x14c6
+#define XK_Armenian_ini 0x14c7
+#define XK_Armenian_LYUN 0x14c8
+#define XK_Armenian_lyun 0x14c9
+#define XK_Armenian_KHE 0x14ca
+#define XK_Armenian_khe 0x14cb
+#define XK_Armenian_TSA 0x14cc
+#define XK_Armenian_tsa 0x14cd
+#define XK_Armenian_KEN 0x14ce
+#define XK_Armenian_ken 0x14cf
+#define XK_Armenian_HO 0x14d0
+#define XK_Armenian_ho 0x14d1
+#define XK_Armenian_DZA 0x14d2
+#define XK_Armenian_dza 0x14d3
+#define XK_Armenian_GHAT 0x14d4
+#define XK_Armenian_ghat 0x14d5
+#define XK_Armenian_TCHE 0x14d6
+#define XK_Armenian_tche 0x14d7
+#define XK_Armenian_MEN 0x14d8
+#define XK_Armenian_men 0x14d9
+#define XK_Armenian_HI 0x14da
+#define XK_Armenian_hi 0x14db
+#define XK_Armenian_NU 0x14dc
+#define XK_Armenian_nu 0x14dd
+#define XK_Armenian_SHA 0x14de
+#define XK_Armenian_sha 0x14df
+#define XK_Armenian_VO 0x14e0
+#define XK_Armenian_vo 0x14e1
+#define XK_Armenian_CHA 0x14e2
+#define XK_Armenian_cha 0x14e3
+#define XK_Armenian_PE 0x14e4
+#define XK_Armenian_pe 0x14e5
+#define XK_Armenian_JE 0x14e6
+#define XK_Armenian_je 0x14e7
+#define XK_Armenian_RA 0x14e8
+#define XK_Armenian_ra 0x14e9
+#define XK_Armenian_SE 0x14ea
+#define XK_Armenian_se 0x14eb
+#define XK_Armenian_VEV 0x14ec
+#define XK_Armenian_vev 0x14ed
+#define XK_Armenian_TYUN 0x14ee
+#define XK_Armenian_tyun 0x14ef
+#define XK_Armenian_RE 0x14f0
+#define XK_Armenian_re 0x14f1
+#define XK_Armenian_TSO 0x14f2
+#define XK_Armenian_tso 0x14f3
+#define XK_Armenian_VYUN 0x14f4
+#define XK_Armenian_vyun 0x14f5
+#define XK_Armenian_PYUR 0x14f6
+#define XK_Armenian_pyur 0x14f7
+#define XK_Armenian_KE 0x14f8
+#define XK_Armenian_ke 0x14f9
+#define XK_Armenian_O 0x14fa
+#define XK_Armenian_o 0x14fb
+#define XK_Armenian_FE 0x14fc
+#define XK_Armenian_fe 0x14fd
+#define XK_Armenian_apostrophe 0x14fe
+#define XK_Armenian_section_sign 0x14ff
+#endif /* XK_ARMENIAN */
+
+/*
+ * Georgian
+ * Byte 3 = 0x15
+ */
+
+#ifdef XK_GEORGIAN
+#define XK_Georgian_an 0x15d0
+#define XK_Georgian_ban 0x15d1
+#define XK_Georgian_gan 0x15d2
+#define XK_Georgian_don 0x15d3
+#define XK_Georgian_en 0x15d4
+#define XK_Georgian_vin 0x15d5
+#define XK_Georgian_zen 0x15d6
+#define XK_Georgian_tan 0x15d7
+#define XK_Georgian_in 0x15d8
+#define XK_Georgian_kan 0x15d9
+#define XK_Georgian_las 0x15da
+#define XK_Georgian_man 0x15db
+#define XK_Georgian_nar 0x15dc
+#define XK_Georgian_on 0x15dd
+#define XK_Georgian_par 0x15de
+#define XK_Georgian_zhar 0x15df
+#define XK_Georgian_rae 0x15e0
+#define XK_Georgian_san 0x15e1
+#define XK_Georgian_tar 0x15e2
+#define XK_Georgian_un 0x15e3
+#define XK_Georgian_phar 0x15e4
+#define XK_Georgian_khar 0x15e5
+#define XK_Georgian_ghan 0x15e6
+#define XK_Georgian_qar 0x15e7
+#define XK_Georgian_shin 0x15e8
+#define XK_Georgian_chin 0x15e9
+#define XK_Georgian_can 0x15ea
+#define XK_Georgian_jil 0x15eb
+#define XK_Georgian_cil 0x15ec
+#define XK_Georgian_char 0x15ed
+#define XK_Georgian_xan 0x15ee
+#define XK_Georgian_jhan 0x15ef
+#define XK_Georgian_hae 0x15f0
+#define XK_Georgian_he 0x15f1
+#define XK_Georgian_hie 0x15f2
+#define XK_Georgian_we 0x15f3
+#define XK_Georgian_har 0x15f4
+#define XK_Georgian_hoe 0x15f5
+#define XK_Georgian_fi 0x15f6
+#endif /* XK_GEORGIAN */
+
+/*
+ * Azeri (and other Turkic or Caucasian languages of ex-USSR)
+ * Byte 3 = 0x16
+ */
+
+#ifdef XK_CAUCASUS
+/* latin */
+#define XK_Ccedillaabovedot 0x16a2
+#define XK_Xabovedot 0x16a3
+#define XK_Qabovedot 0x16a5
+#define XK_Ibreve 0x16a6
+#define XK_IE 0x16a7
+#define XK_UO 0x16a8
+#define XK_Zstroke 0x16a9
+#define XK_Gcaron 0x16aa
+#define XK_Obarred 0x16af
+#define XK_ccedillaabovedot 0x16b2
+#define XK_xabovedot 0x16b3
+#define XK_Ocaron 0x16b4
+#define XK_qabovedot 0x16b5
+#define XK_ibreve 0x16b6
+#define XK_ie 0x16b7
+#define XK_uo 0x16b8
+#define XK_zstroke 0x16b9
+#define XK_gcaron 0x16ba
+#define XK_ocaron 0x16bd
+#define XK_obarred 0x16bf
+#define XK_SCHWA 0x16c6
+#define XK_schwa 0x16f6
+/* those are not really Caucasus, but I put them here for now */
+/* For Inupiak */
+#define XK_Lbelowdot 0x16d1
+#define XK_Lstrokebelowdot 0x16d2
+#define XK_lbelowdot 0x16e1
+#define XK_lstrokebelowdot 0x16e2
+/* For Guarani */
+#define XK_Gtilde 0x16d3
+#define XK_gtilde 0x16e3
+#endif /* XK_CAUCASUS */
+
+/*
+ * Vietnamese
+ * Byte 3 = 0x1e
+ */
+
+#ifdef XK_VIETNAMESE
+#define XK_Abelowdot 0x1ea0
+#define XK_abelowdot 0x1ea1
+#define XK_Ahook 0x1ea2
+#define XK_ahook 0x1ea3
+#define XK_Acircumflexacute 0x1ea4
+#define XK_acircumflexacute 0x1ea5
+#define XK_Acircumflexgrave 0x1ea6
+#define XK_acircumflexgrave 0x1ea7
+#define XK_Acircumflexhook 0x1ea8
+#define XK_acircumflexhook 0x1ea9
+#define XK_Acircumflextilde 0x1eaa
+#define XK_acircumflextilde 0x1eab
+#define XK_Acircumflexbelowdot 0x1eac
+#define XK_acircumflexbelowdot 0x1ead
+#define XK_Abreveacute 0x1eae
+#define XK_abreveacute 0x1eaf
+#define XK_Abrevegrave 0x1eb0
+#define XK_abrevegrave 0x1eb1
+#define XK_Abrevehook 0x1eb2
+#define XK_abrevehook 0x1eb3
+#define XK_Abrevetilde 0x1eb4
+#define XK_abrevetilde 0x1eb5
+#define XK_Abrevebelowdot 0x1eb6
+#define XK_abrevebelowdot 0x1eb7
+#define XK_Ebelowdot 0x1eb8
+#define XK_ebelowdot 0x1eb9
+#define XK_Ehook 0x1eba
+#define XK_ehook 0x1ebb
+#define XK_Etilde 0x1ebc
+#define XK_etilde 0x1ebd
+#define XK_Ecircumflexacute 0x1ebe
+#define XK_ecircumflexacute 0x1ebf
+#define XK_Ecircumflexgrave 0x1ec0
+#define XK_ecircumflexgrave 0x1ec1
+#define XK_Ecircumflexhook 0x1ec2
+#define XK_ecircumflexhook 0x1ec3
+#define XK_Ecircumflextilde 0x1ec4
+#define XK_ecircumflextilde 0x1ec5
+#define XK_Ecircumflexbelowdot 0x1ec6
+#define XK_ecircumflexbelowdot 0x1ec7
+#define XK_Ihook 0x1ec8
+#define XK_ihook 0x1ec9
+#define XK_Ibelowdot 0x1eca
+#define XK_ibelowdot 0x1ecb
+#define XK_Obelowdot 0x1ecc
+#define XK_obelowdot 0x1ecd
+#define XK_Ohook 0x1ece
+#define XK_ohook 0x1ecf
+#define XK_Ocircumflexacute 0x1ed0
+#define XK_ocircumflexacute 0x1ed1
+#define XK_Ocircumflexgrave 0x1ed2
+#define XK_ocircumflexgrave 0x1ed3
+#define XK_Ocircumflexhook 0x1ed4
+#define XK_ocircumflexhook 0x1ed5
+#define XK_Ocircumflextilde 0x1ed6
+#define XK_ocircumflextilde 0x1ed7
+#define XK_Ocircumflexbelowdot 0x1ed8
+#define XK_ocircumflexbelowdot 0x1ed9
+#define XK_Ohornacute 0x1eda
+#define XK_ohornacute 0x1edb
+#define XK_Ohorngrave 0x1edc
+#define XK_ohorngrave 0x1edd
+#define XK_Ohornhook 0x1ede
+#define XK_ohornhook 0x1edf
+#define XK_Ohorntilde 0x1ee0
+#define XK_ohorntilde 0x1ee1
+#define XK_Ohornbelowdot 0x1ee2
+#define XK_ohornbelowdot 0x1ee3
+#define XK_Ubelowdot 0x1ee4
+#define XK_ubelowdot 0x1ee5
+#define XK_Uhook 0x1ee6
+#define XK_uhook 0x1ee7
+#define XK_Uhornacute 0x1ee8
+#define XK_uhornacute 0x1ee9
+#define XK_Uhorngrave 0x1eea
+#define XK_uhorngrave 0x1eeb
+#define XK_Uhornhook 0x1eec
+#define XK_uhornhook 0x1eed
+#define XK_Uhorntilde 0x1eee
+#define XK_uhorntilde 0x1eef
+#define XK_Uhornbelowdot 0x1ef0
+#define XK_uhornbelowdot 0x1ef1
+#define XK_Ybelowdot 0x1ef4
+#define XK_ybelowdot 0x1ef5
+#define XK_Yhook 0x1ef6
+#define XK_yhook 0x1ef7
+#define XK_Ytilde 0x1ef8
+#define XK_ytilde 0x1ef9
+#define XK_Ohorn 0x1efa /* U+01a0 */
+#define XK_ohorn 0x1efb /* U+01a1 */
+#define XK_Uhorn 0x1efc /* U+01af */
+#define XK_uhorn 0x1efd /* U+01b0 */
+
+#define XK_combining_tilde 0x1e9f /* U+0303 */
+#define XK_combining_grave 0x1ef2 /* U+0300 */
+#define XK_combining_acute 0x1ef3 /* U+0301 */
+#define XK_combining_hook 0x1efe /* U+0309 */
+#define XK_combining_belowdot 0x1eff /* U+0323 */
+#endif /* XK_VIETNAMESE */
+
+#ifdef XK_CURRENCY
+#define XK_EcuSign 0x20a0
+#define XK_ColonSign 0x20a1
+#define XK_CruzeiroSign 0x20a2
+#define XK_FFrancSign 0x20a3
+#define XK_LiraSign 0x20a4
+#define XK_MillSign 0x20a5
+#define XK_NairaSign 0x20a6
+#define XK_PesetaSign 0x20a7
+#define XK_RupeeSign 0x20a8
+#define XK_WonSign 0x20a9
+#define XK_NewSheqelSign 0x20aa
+#define XK_DongSign 0x20ab
+#define XK_EuroSign 0x20ac
+#endif
diff --git a/console-client/xkb/ks_tables.h b/console-client/xkb/ks_tables.h
new file mode 100644
index 00000000..f1edbc53
--- /dev/null
+++ b/console-client/xkb/ks_tables.h
@@ -0,0 +1,2380 @@
+/* This file is generated from keysymdef.h. */
+/* Do not edit. */
+
+#ifdef NEEDKTABLE
+const unsigned char _XkeyTable[] = {
+0,
+0x80, 0xaa, 0x00, 0x00, 'V','o','i','d','S','y','m','b','o','l',0,
+0xa3, 0xff, 0xff, 0x08, 'B','a','c','k','S','p','a','c','e',0,
+0x02, 0x74, 0xff, 0x09, 'T','a','b',0,
+0x5a, 0x42, 0xff, 0x0a, 'L','i','n','e','f','e','e','d',0,
+0x0a, 0x58, 0xff, 0x0b, 'C','l','e','a','r',0,
+0x17, 0x56, 0xff, 0x0d, 'R','e','t','u','r','n',0,
+0x0b, 0x27, 0xff, 0x13, 'P','a','u','s','e',0,
+0xef, 0x3d, 0xff, 0x14, 'S','c','r','o','l','l','_','L','o','c','k',0,
+0x30, 0x8b, 0xff, 0x15, 'S','y','s','_','R','e','q',0,
+0x15, 0xb1, 0xff, 0x1b, 'E','s','c','a','p','e',0,
+0x15, 0x11, 0xff, 0xff, 'D','e','l','e','t','e',0,
+0xbd, 0x77, 0xff, 0x20, 'M','u','l','t','i','_','k','e','y',0,
+0xad, 0x3e, 0xff, 0x37, 'C','o','d','e','i','n','p','u','t',0,
+0x1a, 0x01, 0xff, 0x3c, 'S','i','n','g','l','e','C','a','n','d','i','d','a','t','e',0,
+0x32, 0x01, 0xff, 0x3d, 'M','u','l','t','i','p','l','e','C','a','n','d','i','d','a','t','e',0,
+0x6a, 0x01, 0xff, 0x3e, 'P','r','e','v','i','o','u','s','C','a','n','d','i','d','a','t','e',0,
+0x0a, 0xad, 0xff, 0x21, 'K','a','n','j','i',0,
+0x5d, 0x5c, 0xff, 0x22, 'M','u','h','e','n','k','a','n',0,
+0xbe, 0xc1, 0xff, 0x23, 'H','e','n','k','a','n','_','M','o','d','e',0,
+0x15, 0x9c, 0xff, 0x23, 'H','e','n','k','a','n',0,
+0x17, 0x59, 0xff, 0x24, 'R','o','m','a','j','i',0,
+0x58, 0x89, 0xff, 0x25, 'H','i','r','a','g','a','n','a',0,
+0x58, 0x69, 0xff, 0x26, 'K','a','t','a','k','a','n','a',0,
+0xc9, 0x69, 0xff, 0x27, 'H','i','r','a','g','a','n','a','_','K','a','t','a','k','a','n','a',0,
+0x30, 0x27, 0xff, 0x28, 'Z','e','n','k','a','k','u',0,
+0x2b, 0x27, 0xff, 0x29, 'H','a','n','k','a','k','u',0,
+0x81, 0xa7, 0xff, 0x2a, 'Z','e','n','k','a','k','u','_','H','a','n','k','a','k','u',0,
+0x30, 0xc7, 0xff, 0x2b, 'T','o','u','r','o','k','u',0,
+0x16, 0x75, 0xff, 0x2c, 'M','a','s','s','y','o',0,
+0xae, 0x5d, 0xff, 0x2d, 'K','a','n','a','_','L','o','c','k',0,
+0x5d, 0x74, 0xff, 0x2e, 'K','a','n','a','_','S','h','i','f','t',0,
+0x60, 0xf4, 0xff, 0x2f, 'E','i','s','u','_','S','h','i','f','t',0,
+0xc6, 0xc1, 0xff, 0x30, 'E','i','s','u','_','t','o','g','g','l','e',0,
+0x82, 0xef, 0xff, 0x37, 'K','a','n','j','i','_','B','a','n','g','o','u',0,
+0x5f, 0x43, 0xff, 0x3d, 'Z','e','n','_','K','o','h','o',0,
+0x56, 0xa3, 0xff, 0x3e, 'M','a','e','_','K','o','h','o',0,
+0x05, 0x3b, 0xff, 0x50, 'H','o','m','e',0,
+0x05, 0x34, 0xff, 0x51, 'L','e','f','t',0,
+0x01, 0x1a, 0xff, 0x52, 'U','p',0,
+0x0b, 0x48, 0xff, 0x53, 'R','i','g','h','t',0,
+0x05, 0x38, 0xff, 0x54, 'D','o','w','n',0,
+0x0b, 0x84, 0xff, 0x55, 'P','r','i','o','r',0,
+0x2c, 0x4e, 0xff, 0x55, 'P','a','g','e','_','U','p',0,
+0x05, 0x68, 0xff, 0x56, 'N','e','x','t',0,
+0xb2, 0x08, 0xff, 0x56, 'P','a','g','e','_','D','o','w','n',0,
+0x02, 0x54, 0xff, 0x57, 'E','n','d',0,
+0x0a, 0x24, 0xff, 0x58, 'B','e','g','i','n',0,
+0x16, 0xde, 0xff, 0x60, 'S','e','l','e','c','t',0,
+0x0b, 0x84, 0xff, 0x61, 'P','r','i','n','t',0,
+0x2c, 0xc9, 0xff, 0x62, 'E','x','e','c','u','t','e',0,
+0x16, 0x84, 0xff, 0x63, 'I','n','s','e','r','t',0,
+0x05, 0x97, 0xff, 0x65, 'U','n','d','o',0,
+0x05, 0x5b, 0xff, 0x66, 'R','e','d','o',0,
+0x05, 0x4d, 0xff, 0x67, 'M','e','n','u',0,
+0x05, 0x14, 0xff, 0x68, 'F','i','n','d',0,
+0x14, 0xa2, 0xff, 0x69, 'C','a','n','c','e','l',0,
+0x05, 0x1c, 0xff, 0x6a, 'H','e','l','p',0,
+0x0a, 0x71, 0xff, 0x6b, 'B','r','e','a','k',0,
+0xdc, 0x56, 0xff, 0x7e, 'M','o','d','e','_','s','w','i','t','c','h',0,
+0xbf, 0xd6, 0xff, 0x7e, 's','c','r','i','p','t','_','s','w','i','t','c','h',0,
+0x5d, 0x1d, 0xff, 0x7f, 'N','u','m','_','L','o','c','k',0,
+0x50, 0xbf, 0xff, 0x80, 'K','P','_','S','p','a','c','e',0,
+0x13, 0xcc, 0xff, 0x89, 'K','P','_','T','a','b',0,
+0x50, 0x2c, 0xff, 0x8d, 'K','P','_','E','n','t','e','r',0,
+0x09, 0x69, 0xff, 0x91, 'K','P','_','F','1',0,
+0x09, 0x6a, 0xff, 0x92, 'K','P','_','F','2',0,
+0x09, 0x6b, 0xff, 0x93, 'K','P','_','F','3',0,
+0x09, 0x6c, 0xff, 0x94, 'K','P','_','F','4',0,
+0x27, 0xeb, 0xff, 0x95, 'K','P','_','H','o','m','e',0,
+0x27, 0xe4, 0xff, 0x96, 'K','P','_','L','e','f','t',0,
+0x09, 0xc6, 0xff, 0x97, 'K','P','_','U','p',0,
+0x50, 0xa8, 0xff, 0x98, 'K','P','_','R','i','g','h','t',0,
+0x27, 0xe8, 0xff, 0x99, 'K','P','_','D','o','w','n',0,
+0x50, 0xe4, 0xff, 0x9a, 'K','P','_','P','r','i','o','r',0,
+0x41, 0xce, 0xff, 0x9a, 'K','P','_','P','a','g','e','_','U','p',0,
+0x28, 0x18, 0xff, 0x9b, 'K','P','_','N','e','x','t',0,
+0x08, 0x08, 0xff, 0x9b, 'K','P','_','P','a','g','e','_','D','o','w','n',0,
+0x13, 0xac, 0xff, 0x9c, 'K','P','_','E','n','d',0,
+0x4f, 0x84, 0xff, 0x9d, 'K','P','_','B','e','g','i','n',0,
+0xa1, 0x44, 0xff, 0x9e, 'K','P','_','I','n','s','e','r','t',0,
+0x9f, 0xd1, 0xff, 0x9f, 'K','P','_','D','e','l','e','t','e',0,
+0x50, 0x3a, 0xff, 0xbd, 'K','P','_','E','q','u','a','l',0,
+0x89, 0xd9, 0xff, 0xaa, 'K','P','_','M','u','l','t','i','p','l','y',0,
+0x13, 0x88, 0xff, 0xab, 'K','P','_','A','d','d',0,
+0x10, 0xe8, 0xff, 0xac, 'K','P','_','S','e','p','a','r','a','t','o','r',0,
+0x8b, 0x8e, 0xff, 0xad, 'K','P','_','S','u','b','t','r','a','c','t',0,
+0x3f, 0x7a, 0xff, 0xae, 'K','P','_','D','e','c','i','m','a','l',0,
+0xa0, 0x51, 0xff, 0xaf, 'K','P','_','D','i','v','i','d','e',0,
+0x04, 0x86, 0xff, 0xb0, 'K','P','_','0',0,
+0x04, 0x87, 0xff, 0xb1, 'K','P','_','1',0,
+0x04, 0x88, 0xff, 0xb2, 'K','P','_','2',0,
+0x04, 0x89, 0xff, 0xb3, 'K','P','_','3',0,
+0x04, 0x8a, 0xff, 0xb4, 'K','P','_','4',0,
+0x04, 0x8b, 0xff, 0xb5, 'K','P','_','5',0,
+0x04, 0x8c, 0xff, 0xb6, 'K','P','_','6',0,
+0x04, 0x8d, 0xff, 0xb7, 'K','P','_','7',0,
+0x04, 0x8e, 0xff, 0xb8, 'K','P','_','8',0,
+0x04, 0x8f, 0xff, 0xb9, 'K','P','_','9',0,
+0x00, 0xbd, 0xff, 0xbe, 'F','1',0,
+0x00, 0xbe, 0xff, 0xbf, 'F','2',0,
+0x00, 0xbf, 0xff, 0xc0, 'F','3',0,
+0x00, 0xc0, 0xff, 0xc1, 'F','4',0,
+0x00, 0xc1, 0xff, 0xc2, 'F','5',0,
+0x00, 0xc2, 0xff, 0xc3, 'F','6',0,
+0x00, 0xc3, 0xff, 0xc4, 'F','7',0,
+0x00, 0xc4, 0xff, 0xc5, 'F','8',0,
+0x00, 0xc5, 0xff, 0xc6, 'F','9',0,
+0x01, 0xaa, 0xff, 0xc7, 'F','1','0',0,
+0x01, 0xab, 0xff, 0xc8, 'F','1','1',0,
+0x00, 0xc9, 0xff, 0xc8, 'L','1',0,
+0x01, 0xac, 0xff, 0xc9, 'F','1','2',0,
+0x00, 0xca, 0xff, 0xc9, 'L','2',0,
+0x01, 0xad, 0xff, 0xca, 'F','1','3',0,
+0x00, 0xcb, 0xff, 0xca, 'L','3',0,
+0x01, 0xae, 0xff, 0xcb, 'F','1','4',0,
+0x00, 0xcc, 0xff, 0xcb, 'L','4',0,
+0x01, 0xaf, 0xff, 0xcc, 'F','1','5',0,
+0x00, 0xcd, 0xff, 0xcc, 'L','5',0,
+0x01, 0xb0, 0xff, 0xcd, 'F','1','6',0,
+0x00, 0xce, 0xff, 0xcd, 'L','6',0,
+0x01, 0xb1, 0xff, 0xce, 'F','1','7',0,
+0x00, 0xcf, 0xff, 0xce, 'L','7',0,
+0x01, 0xb2, 0xff, 0xcf, 'F','1','8',0,
+0x00, 0xd0, 0xff, 0xcf, 'L','8',0,
+0x01, 0xb3, 0xff, 0xd0, 'F','1','9',0,
+0x00, 0xd1, 0xff, 0xd0, 'L','9',0,
+0x01, 0xac, 0xff, 0xd1, 'F','2','0',0,
+0x01, 0xc2, 0xff, 0xd1, 'L','1','0',0,
+0x01, 0xad, 0xff, 0xd2, 'F','2','1',0,
+0x00, 0xd5, 0xff, 0xd2, 'R','1',0,
+0x01, 0xae, 0xff, 0xd3, 'F','2','2',0,
+0x00, 0xd6, 0xff, 0xd3, 'R','2',0,
+0x01, 0xaf, 0xff, 0xd4, 'F','2','3',0,
+0x00, 0xd7, 0xff, 0xd4, 'R','3',0,
+0x01, 0xb0, 0xff, 0xd5, 'F','2','4',0,
+0x00, 0xd8, 0xff, 0xd5, 'R','4',0,
+0x01, 0xb1, 0xff, 0xd6, 'F','2','5',0,
+0x00, 0xd9, 0xff, 0xd6, 'R','5',0,
+0x01, 0xb2, 0xff, 0xd7, 'F','2','6',0,
+0x00, 0xda, 0xff, 0xd7, 'R','6',0,
+0x01, 0xb3, 0xff, 0xd8, 'F','2','7',0,
+0x00, 0xdb, 0xff, 0xd8, 'R','7',0,
+0x01, 0xb4, 0xff, 0xd9, 'F','2','8',0,
+0x00, 0xdc, 0xff, 0xd9, 'R','8',0,
+0x01, 0xb5, 0xff, 0xda, 'F','2','9',0,
+0x00, 0xdd, 0xff, 0xda, 'R','9',0,
+0x01, 0xae, 0xff, 0xdb, 'F','3','0',0,
+0x01, 0xda, 0xff, 0xdb, 'R','1','0',0,
+0x01, 0xaf, 0xff, 0xdc, 'F','3','1',0,
+0x01, 0xdb, 0xff, 0xdc, 'R','1','1',0,
+0x01, 0xb0, 0xff, 0xdd, 'F','3','2',0,
+0x01, 0xdc, 0xff, 0xdd, 'R','1','2',0,
+0x01, 0xb1, 0xff, 0xde, 'F','3','3',0,
+0x01, 0xdd, 0xff, 0xde, 'R','1','3',0,
+0x01, 0xb2, 0xff, 0xdf, 'F','3','4',0,
+0x01, 0xde, 0xff, 0xdf, 'R','1','4',0,
+0x01, 0xb3, 0xff, 0xe0, 'F','3','5',0,
+0x01, 0xdf, 0xff, 0xe0, 'R','1','5',0,
+0x2e, 0x5a, 0xff, 0xe1, 'S','h','i','f','t','_','L',0,
+0x2e, 0x60, 0xff, 0xe2, 'S','h','i','f','t','_','R',0,
+0xb1, 0xd2, 0xff, 0xe3, 'C','o','n','t','r','o','l','_','L',0,
+0xb1, 0xd8, 0xff, 0xe4, 'C','o','n','t','r','o','l','_','R',0,
+0xa9, 0x1d, 0xff, 0xe5, 'C','a','p','s','_','L','o','c','k',0,
+0x75, 0xbd, 0xff, 0xe6, 'S','h','i','f','t','_','L','o','c','k',0,
+0x16, 0x1e, 0xff, 0xe7, 'M','e','t','a','_','L',0,
+0x16, 0x24, 0xff, 0xe8, 'M','e','t','a','_','R',0,
+0x0a, 0x4a, 0xff, 0xe9, 'A','l','t','_','L',0,
+0x0a, 0x50, 0xff, 0xea, 'A','l','t','_','R',0,
+0x30, 0x5a, 0xff, 0xeb, 'S','u','p','e','r','_','L',0,
+0x30, 0x60, 0xff, 0xec, 'S','u','p','e','r','_','R',0,
+0x2e, 0x1a, 0xff, 0xed, 'H','y','p','e','r','_','L',0,
+0x2e, 0x20, 0xff, 0xee, 'H','y','p','e','r','_','R',0,
+0x4e, 0x5d, 0xfe, 0x01, 'I','S','O','_','L','o','c','k',0,
+0xae, 0x26, 0xfe, 0x02, 'I','S','O','_','L','e','v','e','l','2','_','L','a','t','c','h',0,
+0xae, 0xf4, 0xfe, 0x03, 'I','S','O','_','L','e','v','e','l','3','_','S','h','i','f','t',0,
+0xae, 0x66, 0xfe, 0x04, 'I','S','O','_','L','e','v','e','l','3','_','L','a','t','c','h',0,
+0x57, 0x1d, 0xfe, 0x05, 'I','S','O','_','L','e','v','e','l','3','_','L','o','c','k',0,
+0x64, 0xb4, 0xff, 0x7e, 'I','S','O','_','G','r','o','u','p','_','S','h','i','f','t',0,
+0x64, 0x26, 0xfe, 0x06, 'I','S','O','_','G','r','o','u','p','_','L','a','t','c','h',0,
+0xb1, 0xfd, 0xfe, 0x07, 'I','S','O','_','G','r','o','u','p','_','L','o','c','k',0,
+0xb4, 0xf6, 0xfe, 0x08, 'I','S','O','_','N','e','x','t','_','G','r','o','u','p',0,
+0xa9, 0xfd, 0xfe, 0x09, 'I','S','O','_','N','e','x','t','_','G','r','o','u','p','_','L','o','c','k',0,
+0xbc, 0xf6, 0xfe, 0x0a, 'I','S','O','_','P','r','e','v','_','G','r','o','u','p',0,
+0xa9, 0xfd, 0xfe, 0x0b, 'I','S','O','_','P','r','e','v','_','G','r','o','u','p','_','L','o','c','k',0,
+0x51, 0x76, 0xfe, 0x0c, 'I','S','O','_','F','i','r','s','t','_','G','r','o','u','p',0,
+0x39, 0xfd, 0xfe, 0x0d, 'I','S','O','_','F','i','r','s','t','_','G','r','o','u','p','_','L','o','c','k',0,
+0xaa, 0x76, 0xfe, 0x0e, 'I','S','O','_','L','a','s','t','_','G','r','o','u','p',0,
+0x59, 0xfd, 0xfe, 0x0f, 'I','S','O','_','L','a','s','t','_','G','r','o','u','p','_','L','o','c','k',0,
+0xe9, 0xac, 0xfe, 0x20, 'I','S','O','_','L','e','f','t','_','T','a','b',0,
+0xe1, 0x3e, 0xfe, 0x21, 'I','S','O','_','M','o','v','e','_','L','i','n','e','_','U','p',0,
+0x85, 0xc8, 0xfe, 0x22, 'I','S','O','_','M','o','v','e','_','L','i','n','e','_','D','o','w','n',0,
+0x8e, 0x3e, 0xfe, 0x23, 'I','S','O','_','P','a','r','t','i','a','l','_','L','i','n','e','_','U','p',0,
+0x39, 0xc8, 0xfe, 0x24, 'I','S','O','_','P','a','r','t','i','a','l','_','L','i','n','e','_','D','o','w','n',0,
+0x83, 0x04, 0xfe, 0x25, 'I','S','O','_','P','a','r','t','i','a','l','_','S','p','a','c','e','_','L','e','f','t',0,
+0x06, 0xe8, 0xfe, 0x26, 'I','S','O','_','P','a','r','t','i','a','l','_','S','p','a','c','e','_','R','i','g','h','t',0,
+0xe6, 0xa4, 0xfe, 0x27, 'I','S','O','_','S','e','t','_','M','a','r','g','i','n','_','L','e','f','t',0,
+0xce, 0x28, 0xfe, 0x28, 'I','S','O','_','S','e','t','_','M','a','r','g','i','n','_','R','i','g','h','t',0,
+0x36, 0xa4, 0xfe, 0x29, 'I','S','O','_','R','e','l','e','a','s','e','_','M','a','r','g','i','n','_','L','e','f','t',0,
+0x6e, 0x28, 0xfe, 0x2a, 'I','S','O','_','R','e','l','e','a','s','e','_','M','a','r','g','i','n','_','R','i','g','h','t',0,
+0x48, 0x2b, 0xfe, 0x2b, 'I','S','O','_','R','e','l','e','a','s','e','_','B','o','t','h','_','M','a','r','g','i','n','s',0,
+0xae, 0xa4, 0xfe, 0x2c, 'I','S','O','_','F','a','s','t','_','C','u','r','s','o','r','_','L','e','f','t',0,
+0x5e, 0x28, 0xfe, 0x2d, 'I','S','O','_','F','a','s','t','_','C','u','r','s','o','r','_','R','i','g','h','t',0,
+0xeb, 0x76, 0xfe, 0x2e, 'I','S','O','_','F','a','s','t','_','C','u','r','s','o','r','_','U','p',0,
+0xae, 0xa8, 0xfe, 0x2f, 'I','S','O','_','F','a','s','t','_','C','u','r','s','o','r','_','D','o','w','n',0,
+0x81, 0x05, 0xfe, 0x30, 'I','S','O','_','C','o','n','t','i','n','u','o','u','s','_','U','n','d','e','r','l','i','n','e',0,
+0x81, 0x05, 0xfe, 0x31, 'I','S','O','_','D','i','s','c','o','n','t','i','n','u','o','u','s','_','U','n','d','e','r','l','i','n','e',0,
+0xd3, 0x25, 0xfe, 0x32, 'I','S','O','_','E','m','p','h','a','s','i','z','e',0,
+0xe3, 0xde, 0xfe, 0x33, 'I','S','O','_','C','e','n','t','e','r','_','O','b','j','e','c','t',0,
+0x9c, 0xec, 0xfe, 0x34, 'I','S','O','_','E','n','t','e','r',0,
+0x8f, 0x35, 0xfe, 0x50, 'd','e','a','d','_','g','r','a','v','e',0,
+0x8e, 0xa9, 0xfe, 0x51, 'd','e','a','d','_','a','c','u','t','e',0,
+0xe8, 0x52, 0xfe, 0x52, 'd','e','a','d','_','c','i','r','c','u','m','f','l','e','x',0,
+0x8f, 0xc5, 0xfe, 0x53, 'd','e','a','d','_','t','i','l','d','e',0,
+0x1e, 0x9c, 0xfe, 0x54, 'd','e','a','d','_','m','a','c','r','o','n',0,
+0x8e, 0xf5, 0xfe, 0x55, 'd','e','a','d','_','b','r','e','v','e',0,
+0x77, 0x4a, 0xfe, 0x56, 'd','e','a','d','_','a','b','o','v','e','d','o','t',0,
+0xf0, 0xb9, 0xfe, 0x57, 'd','e','a','d','_','d','i','a','e','r','e','s','i','s',0,
+0xef, 0x47, 0xfe, 0x58, 'd','e','a','d','_','a','b','o','v','e','r','i','n','g',0,
+0xdf, 0xe9, 0xfe, 0x59, 'd','e','a','d','_','d','o','u','b','l','e','a','c','u','t','e',0,
+0x8e, 0xac, 0xfe, 0x5a, 'd','e','a','d','_','c','a','r','o','n',0,
+0x3b, 0x51, 0xfe, 0x5b, 'd','e','a','d','_','c','e','d','i','l','l','a',0,
+0x1f, 0x75, 0xfe, 0x5c, 'd','e','a','d','_','o','g','o','n','e','k',0,
+0xc7, 0x7d, 0xfe, 0x5d, 'd','e','a','d','_','i','o','t','a',0,
+0x36, 0x1c, 0xfe, 0x5e, 'd','e','a','d','_','v','o','i','c','e','d','_','s','o','u','n','d',0,
+0xf6, 0x1c, 0xfe, 0x5f, 'd','e','a','d','_','s','e','m','i','v','o','i','c','e','d','_','s','o','u','n','d',0,
+0x78, 0x4a, 0xfe, 0x60, 'd','e','a','d','_','b','e','l','o','w','d','o','t',0,
+0xc7, 0x75, 0xfe, 0x61, 'd','e','a','d','_','h','o','o','k',0,
+0xc7, 0x7e, 0xfe, 0x62, 'd','e','a','d','_','h','o','r','n',0,
+0x1f, 0xac, 0xfe, 0xd0, 'F','i','r','s','t','_','V','i','r','t','u','a','l','_','S','c','r','e','e','n',0,
+0x1f, 0xac, 0xfe, 0xd1, 'P','r','e','v','_','V','i','r','t','u','a','l','_','S','c','r','e','e','n',0,
+0x1f, 0xac, 0xfe, 0xd2, 'N','e','x','t','_','V','i','r','t','u','a','l','_','S','c','r','e','e','n',0,
+0x1f, 0xac, 0xfe, 0xd4, 'L','a','s','t','_','V','i','r','t','u','a','l','_','S','c','r','e','e','n',0,
+0xe7, 0x94, 0xfe, 0xd5, 'T','e','r','m','i','n','a','t','e','_','S','e','r','v','e','r',0,
+0xae, 0x0d, 0xfe, 0x70, 'A','c','c','e','s','s','X','_','E','n','a','b','l','e',0,
+0x1f, 0x8d, 0xfe, 0x71, 'A','c','c','e','s','s','X','_','F','e','e','d','b','a','c','k','_','E','n','a','b','l','e',0,
+0xa5, 0x8d, 0xfe, 0x72, 'R','e','p','e','a','t','K','e','y','s','_','E','n','a','b','l','e',0,
+0xbd, 0x8d, 0xfe, 0x73, 'S','l','o','w','K','e','y','s','_','E','n','a','b','l','e',0,
+0xad, 0x8d, 0xfe, 0x74, 'B','o','u','n','c','e','K','e','y','s','_','E','n','a','b','l','e',0,
+0xed, 0x8d, 0xfe, 0x75, 'S','t','i','c','k','y','K','e','y','s','_','E','n','a','b','l','e',0,
+0x0d, 0x8d, 0xfe, 0x76, 'M','o','u','s','e','K','e','y','s','_','E','n','a','b','l','e',0,
+0x32, 0x0d, 0xfe, 0x77, 'M','o','u','s','e','K','e','y','s','_','A','c','c','e','l','_','E','n','a','b','l','e',0,
+0x90, 0x8d, 0xfe, 0x78, 'O','v','e','r','l','a','y','1','_','E','n','a','b','l','e',0,
+0x91, 0x0d, 0xfe, 0x79, 'O','v','e','r','l','a','y','2','_','E','n','a','b','l','e',0,
+0x09, 0x0d, 0xfe, 0x7a, 'A','u','d','i','b','l','e','B','e','l','l','_','E','n','a','b','l','e',0,
+0xe8, 0xa4, 0xfe, 0xe0, 'P','o','i','n','t','e','r','_','L','e','f','t',0,
+0xd2, 0x28, 0xfe, 0xe1, 'P','o','i','n','t','e','r','_','R','i','g','h','t',0,
+0x79, 0xf6, 0xfe, 0xe2, 'P','o','i','n','t','e','r','_','U','p',0,
+0xe8, 0xa8, 0xfe, 0xe3, 'P','o','i','n','t','e','r','_','D','o','w','n',0,
+0xa4, 0x94, 0xfe, 0xe4, 'P','o','i','n','t','e','r','_','U','p','L','e','f','t',0,
+0x4a, 0x08, 0xfe, 0xe5, 'P','o','i','n','t','e','r','_','U','p','R','i','g','h','t',0,
+0x8f, 0xb4, 0xfe, 0xe6, 'P','o','i','n','t','e','r','_','D','o','w','n','L','e','f','t',0,
+0x20, 0x48, 0xfe, 0xe7, 'P','o','i','n','t','e','r','_','D','o','w','n','R','i','g','h','t',0,
+0x8c, 0x74, 0xfe, 0xe8, 'P','o','i','n','t','e','r','_','B','u','t','t','o','n','_','D','f','l','t',0,
+0x48, 0x49, 0xfe, 0xe9, 'P','o','i','n','t','e','r','_','B','u','t','t','o','n','1',0,
+0x48, 0x4a, 0xfe, 0xea, 'P','o','i','n','t','e','r','_','B','u','t','t','o','n','2',0,
+0x48, 0x4b, 0xfe, 0xeb, 'P','o','i','n','t','e','r','_','B','u','t','t','o','n','3',0,
+0x48, 0x4c, 0xfe, 0xec, 'P','o','i','n','t','e','r','_','B','u','t','t','o','n','4',0,
+0x48, 0x4d, 0xfe, 0xed, 'P','o','i','n','t','e','r','_','B','u','t','t','o','n','5',0,
+0x37, 0x94, 0xfe, 0xee, 'P','o','i','n','t','e','r','_','D','b','l','C','l','i','c','k','_','D','f','l','t',0,
+0x12, 0xfb, 0xfe, 0xef, 'P','o','i','n','t','e','r','_','D','b','l','C','l','i','c','k','1',0,
+0x12, 0xfc, 0xfe, 0xf0, 'P','o','i','n','t','e','r','_','D','b','l','C','l','i','c','k','2',0,
+0x12, 0xfd, 0xfe, 0xf1, 'P','o','i','n','t','e','r','_','D','b','l','C','l','i','c','k','3',0,
+0x12, 0xfe, 0xfe, 0xf2, 'P','o','i','n','t','e','r','_','D','b','l','C','l','i','c','k','4',0,
+0x12, 0xff, 0xfe, 0xf3, 'P','o','i','n','t','e','r','_','D','b','l','C','l','i','c','k','5',0,
+0x1b, 0x14, 0xfe, 0xf4, 'P','o','i','n','t','e','r','_','D','r','a','g','_','D','f','l','t',0,
+0xd1, 0x33, 0xfe, 0xf5, 'P','o','i','n','t','e','r','_','D','r','a','g','1',0,
+0xd1, 0x34, 0xfe, 0xf6, 'P','o','i','n','t','e','r','_','D','r','a','g','2',0,
+0xd1, 0x35, 0xfe, 0xf7, 'P','o','i','n','t','e','r','_','D','r','a','g','3',0,
+0xd1, 0x36, 0xfe, 0xf8, 'P','o','i','n','t','e','r','_','D','r','a','g','4',0,
+0xd1, 0x37, 0xfe, 0xfd, 'P','o','i','n','t','e','r','_','D','r','a','g','5',0,
+0x36, 0x21, 0xfe, 0xf9, 'P','o','i','n','t','e','r','_','E','n','a','b','l','e','K','e','y','s',0,
+0x25, 0xf1, 0xfe, 0xfa, 'P','o','i','n','t','e','r','_','A','c','c','e','l','e','r','a','t','e',0,
+0x65, 0x48, 0xfe, 0xfb, 'P','o','i','n','t','e','r','_','D','f','l','t','B','t','n','N','e','x','t',0,
+0x65, 0x68, 0xfe, 0xfc, 'P','o','i','n','t','e','r','_','D','f','l','t','B','t','n','P','r','e','v',0,
+0x6a, 0x79, 0xfd, 0x01, '3','2','7','0','_','D','u','p','l','i','c','a','t','e',0,
+0x62, 0xbb, 0xfd, 0x02, '3','2','7','0','_','F','i','e','l','d','M','a','r','k',0,
+0xad, 0x82, 0xfd, 0x03, '3','2','7','0','_','R','i','g','h','t','2',0,
+0xd5, 0xfa, 0xfd, 0x04, '3','2','7','0','_','L','e','f','t','2',0,
+0x56, 0x1c, 0xfd, 0x05, '3','2','7','0','_','B','a','c','k','T','a','b',0,
+0xb2, 0x70, 0xfd, 0x06, '3','2','7','0','_','E','r','a','s','e','E','O','F',0,
+0xcc, 0xfe, 0xfd, 0x07, '3','2','7','0','_','E','r','a','s','e','I','n','p','u','t',0,
+0xd6, 0xb2, 0xfd, 0x08, '3','2','7','0','_','R','e','s','e','t',0,
+0x6b, 0x52, 0xfd, 0x09, '3','2','7','0','_','Q','u','i','t',0,
+0x34, 0xcb, 0xfd, 0x0a, '3','2','7','0','_','P','A','1',0,
+0x34, 0xcc, 0xfd, 0x0b, '3','2','7','0','_','P','A','2',0,
+0x34, 0xcd, 0xfd, 0x0c, '3','2','7','0','_','P','A','3',0,
+0x6b, 0x3e, 0xfd, 0x0d, '3','2','7','0','_','T','e','s','t',0,
+0x6a, 0xde, 0xfd, 0x0e, '3','2','7','0','_','A','t','t','n',0,
+0xad, 0xeb, 0xfd, 0x0f, '3','2','7','0','_','C','u','r','s','o','r','B','l','i','n','k',0,
+0x60, 0x5c, 0xfd, 0x10, '3','2','7','0','_','A','l','t','C','u','r','s','o','r',0,
+0xb3, 0x45, 0xfd, 0x11, '3','2','7','0','_','K','e','y','C','l','i','c','k',0,
+0x6b, 0x1e, 0xfd, 0x12, '3','2','7','0','_','J','u','m','p',0,
+0xd5, 0xf4, 0xfd, 0x13, '3','2','7','0','_','I','d','e','n','t',0,
+0x6b, 0x51, 0xfd, 0x14, '3','2','7','0','_','R','u','l','e',0,
+0x6a, 0xdd, 0xfd, 0x15, '3','2','7','0','_','C','o','p','y',0,
+0x6b, 0x1b, 0xfd, 0x16, '3','2','7','0','_','P','l','a','y',0,
+0xd6, 0xe2, 0xfd, 0x17, '3','2','7','0','_','S','e','t','u','p',0,
+0xad, 0x6c, 0xfd, 0x18, '3','2','7','0','_','R','e','c','o','r','d',0,
+0xfb, 0xac, 0xfd, 0x19, '3','2','7','0','_','C','h','a','n','g','e','S','c','r','e','e','n',0,
+0xc2, 0xcc, 0xfd, 0x1a, '3','2','7','0','_','D','e','l','e','t','e','W','o','r','d',0,
+0xb2, 0x5e, 0xfd, 0x1b, '3','2','7','0','_','E','x','S','e','l','e','c','t',0,
+0x5d, 0xde, 0xfd, 0x1c, '3','2','7','0','_','C','u','r','s','o','r','S','e','l','e','c','t',0,
+0xcf, 0xec, 0xfd, 0x1d, '3','2','7','0','_','P','r','i','n','t','S','c','r','e','e','n',0,
+0xd6, 0x2c, 0xfd, 0x1e, '3','2','7','0','_','E','n','t','e','r',0,
+0x0d, 0x5f, 0x00, 0x20, 's','p','a','c','e',0,
+0x1a, 0x17, 0x00, 0x21, 'e','x','c','l','a','m',0,
+0x70, 0xc8, 0x00, 0x22, 'q','u','o','t','e','d','b','l',0,
+0xba, 0x38, 0x00, 0x23, 'n','u','m','b','e','r','s','i','g','n',0,
+0x19, 0xb4, 0x00, 0x24, 'd','o','l','l','a','r',0,
+0x35, 0xbc, 0x00, 0x25, 'p','e','r','c','e','n','t',0,
+0xcd, 0x9c, 0x00, 0x26, 'a','m','p','e','r','s','a','n','d',0,
+0xa2, 0x4d, 0x00, 0x27, 'a','p','o','s','t','r','o','p','h','e',0,
+0xc5, 0x68, 0x00, 0x27, 'q','u','o','t','e','r','i','g','h','t',0,
+0xd6, 0xb4, 0x00, 0x28, 'p','a','r','e','n','l','e','f','t',0,
+0xae, 0x48, 0x00, 0x29, 'p','a','r','e','n','r','i','g','h','t',0,
+0x68, 0x95, 0x00, 0x2a, 'a','s','t','e','r','i','s','k',0,
+0x06, 0x8d, 0x00, 0x2b, 'p','l','u','s',0,
+0x0c, 0x97, 0x00, 0x2c, 'c','o','m','m','a',0,
+0x0d, 0x2d, 0x00, 0x2d, 'm','i','n','u','s',0,
+0x1a, 0xc6, 0x00, 0x2e, 'p','e','r','i','o','d',0,
+0x0d, 0x62, 0x00, 0x2f, 's','l','a','s','h',0,
+0x00, 0x30, 0x00, 0x30, '0',0,
+0x00, 0x31, 0x00, 0x31, '1',0,
+0x00, 0x32, 0x00, 0x32, '2',0,
+0x00, 0x33, 0x00, 0x33, '3',0,
+0x00, 0x34, 0x00, 0x34, '4',0,
+0x00, 0x35, 0x00, 0x35, '5',0,
+0x00, 0x36, 0x00, 0x36, '6',0,
+0x00, 0x37, 0x00, 0x37, '7',0,
+0x00, 0x38, 0x00, 0x38, '8',0,
+0x00, 0x39, 0x00, 0x39, '9',0,
+0x0c, 0xa4, 0x00, 0x3a, 'c','o','l','o','n',0,
+0xda, 0x84, 0x00, 0x3b, 's','e','m','i','c','o','l','o','n',0,
+0x06, 0x4d, 0x00, 0x3c, 'l','e','s','s',0,
+0x0c, 0xda, 0x00, 0x3d, 'e','q','u','a','l',0,
+0x34, 0x64, 0x00, 0x3e, 'g','r','e','a','t','e','r',0,
+0x70, 0x20, 0x00, 0x3f, 'q','u','e','s','t','i','o','n',0,
+0x01, 0x36, 0x00, 0x40, 'a','t',0,
+0x00, 0x41, 0x00, 0x41, 'A',0,
+0x00, 0x42, 0x00, 0x42, 'B',0,
+0x00, 0x43, 0x00, 0x43, 'C',0,
+0x00, 0x44, 0x00, 0x44, 'D',0,
+0x00, 0x45, 0x00, 0x45, 'E',0,
+0x00, 0x46, 0x00, 0x46, 'F',0,
+0x00, 0x47, 0x00, 0x47, 'G',0,
+0x00, 0x48, 0x00, 0x48, 'H',0,
+0x00, 0x49, 0x00, 0x49, 'I',0,
+0x00, 0x4a, 0x00, 0x4a, 'J',0,
+0x00, 0x4b, 0x00, 0x4b, 'K',0,
+0x00, 0x4c, 0x00, 0x4c, 'L',0,
+0x00, 0x4d, 0x00, 0x4d, 'M',0,
+0x00, 0x4e, 0x00, 0x4e, 'N',0,
+0x00, 0x4f, 0x00, 0x4f, 'O',0,
+0x00, 0x50, 0x00, 0x50, 'P',0,
+0x00, 0x51, 0x00, 0x51, 'Q',0,
+0x00, 0x52, 0x00, 0x52, 'R',0,
+0x00, 0x53, 0x00, 0x53, 'S',0,
+0x00, 0x54, 0x00, 0x54, 'T',0,
+0x00, 0x55, 0x00, 0x55, 'U',0,
+0x00, 0x56, 0x00, 0x56, 'V',0,
+0x00, 0x57, 0x00, 0x57, 'W',0,
+0x00, 0x58, 0x00, 0x58, 'X',0,
+0x00, 0x59, 0x00, 0x59, 'Y',0,
+0x00, 0x5a, 0x00, 0x5a, 'Z',0,
+0x33, 0x54, 0x00, 0x5b, 'b','r','a','c','k','e','t','l','e','f','t',0,
+0xc6, 0x02, 0x00, 0x5c, 'b','a','c','k','s','l','a','s','h',0,
+0x67, 0x88, 0x00, 0x5d, 'b','r','a','c','k','e','t','r','i','g','h','t',0,
+0x35, 0x23, 0x00, 0x5e, 'a','s','c','i','i','c','i','r','c','u','m',0,
+0xbe, 0xcd, 0x00, 0x5f, 'u','n','d','e','r','s','c','o','r','e',0,
+0x0c, 0xd5, 0x00, 0x60, 'g','r','a','v','e',0,
+0xe2, 0x44, 0x00, 0x60, 'q','u','o','t','e','l','e','f','t',0,
+0x00, 0x61, 0x00, 0x61, 'a',0,
+0x00, 0x62, 0x00, 0x62, 'b',0,
+0x00, 0x63, 0x00, 0x63, 'c',0,
+0x00, 0x64, 0x00, 0x64, 'd',0,
+0x00, 0x65, 0x00, 0x65, 'e',0,
+0x00, 0x66, 0x00, 0x66, 'f',0,
+0x00, 0x67, 0x00, 0x67, 'g',0,
+0x00, 0x68, 0x00, 0x68, 'h',0,
+0x00, 0x69, 0x00, 0x69, 'i',0,
+0x00, 0x6a, 0x00, 0x6a, 'j',0,
+0x00, 0x6b, 0x00, 0x6b, 'k',0,
+0x00, 0x6c, 0x00, 0x6c, 'l',0,
+0x00, 0x6d, 0x00, 0x6d, 'm',0,
+0x00, 0x6e, 0x00, 0x6e, 'n',0,
+0x00, 0x6f, 0x00, 0x6f, 'o',0,
+0x00, 0x70, 0x00, 0x70, 'p',0,
+0x00, 0x71, 0x00, 0x71, 'q',0,
+0x00, 0x72, 0x00, 0x72, 'r',0,
+0x00, 0x73, 0x00, 0x73, 's',0,
+0x00, 0x74, 0x00, 0x74, 't',0,
+0x00, 0x75, 0x00, 0x75, 'u',0,
+0x00, 0x76, 0x00, 0x76, 'v',0,
+0x00, 0x77, 0x00, 0x77, 'w',0,
+0x00, 0x78, 0x00, 0x78, 'x',0,
+0x00, 0x79, 0x00, 0x79, 'y',0,
+0x00, 0x7a, 0x00, 0x7a, 'z',0,
+0xcc, 0x24, 0x00, 0x7b, 'b','r','a','c','e','l','e','f','t',0,
+0x02, 0xbc, 0x00, 0x7c, 'b','a','r',0,
+0x99, 0x28, 0x00, 0x7d, 'b','r','a','c','e','r','i','g','h','t',0,
+0x9b, 0x45, 0x00, 0x7e, 'a','s','c','i','i','t','i','l','d','e',0,
+0xc7, 0x7f, 0x00, 0xa0, 'n','o','b','r','e','a','k','s','p','a','c','e',0,
+0xa7, 0xa8, 0x00, 0xa1, 'e','x','c','l','a','m','d','o','w','n',0,
+0x05, 0xfc, 0x00, 0xa2, 'c','e','n','t',0,
+0x70, 0x87, 0x00, 0xa3, 's','t','e','r','l','i','n','g',0,
+0x6a, 0x3f, 0x00, 0xa4, 'c','u','r','r','e','n','c','y',0,
+0x03, 0x1c, 0x00, 0xa5, 'y','e','n',0,
+0xd0, 0x9c, 0x00, 0xa6, 'b','r','o','k','e','n','b','a','r',0,
+0x36, 0x20, 0x00, 0xa7, 's','e','c','t','i','o','n',0,
+0xca, 0xb9, 0x00, 0xa8, 'd','i','a','e','r','e','s','i','s',0,
+0xd2, 0xe8, 0x00, 0xa9, 'c','o','p','y','r','i','g','h','t',0,
+0x6a, 0xc5, 0x00, 0xaa, 'o','r','d','f','e','m','i','n','i','n','e',0,
+0x69, 0x14, 0x00, 0xab, 'g','u','i','l','l','e','m','o','t','l','e','f','t',0,
+0x37, 0x18, 0x00, 0xac, 'n','o','t','s','i','g','n',0,
+0x1a, 0xe8, 0x00, 0xad, 'h','y','p','h','e','n',0,
+0xb2, 0x7e, 0x00, 0xae, 'r','e','g','i','s','t','e','r','e','d',0,
+0x19, 0xdc, 0x00, 0xaf, 'm','a','c','r','o','n',0,
+0x18, 0xff, 0x00, 0xb0, 'd','e','g','r','e','e',0,
+0xde, 0xcd, 0x00, 0xb1, 'p','l','u','s','m','i','n','u','s',0,
+0x9e, 0x94, 0x00, 0xb2, 't','w','o','s','u','p','e','r','i','o','r',0,
+0xe8, 0x94, 0x00, 0xb3, 't','h','r','e','e','s','u','p','e','r','i','o','r',0,
+0x0c, 0x49, 0x00, 0xb4, 'a','c','u','t','e',0,
+0x01, 0x4f, 0x00, 0xb5, 'm','u',0,
+0xd5, 0xec, 0x00, 0xb6, 'p','a','r','a','g','r','a','p','h',0,
+0x2b, 0xde, 0x00, 0xb7, 'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0,
+0x31, 0xd1, 0x00, 0xb8, 'c','e','d','i','l','l','a',0,
+0x6e, 0x94, 0x00, 0xb9, 'o','n','e','s','u','p','e','r','i','o','r',0,
+0xd4, 0x35, 0x00, 0xba, 'm','a','s','c','u','l','i','n','e',0,
+0xd3, 0x08, 0x00, 0xbb, 'g','u','i','l','l','e','m','o','t','r','i','g','h','t',0,
+0xb6, 0x0c, 0x00, 0xbc, 'o','n','e','q','u','a','r','t','e','r',0,
+0x35, 0xd2, 0x00, 0xbd, 'o','n','e','h','a','l','f',0,
+0xe6, 0x8b, 0x00, 0xbe, 't','h','r','e','e','q','u','a','r','t','e','r','s',0,
+0x08, 0x38, 0x00, 0xbf, 'q','u','e','s','t','i','o','n','d','o','w','n',0,
+0x14, 0xf5, 0x00, 0xc0, 'A','g','r','a','v','e',0,
+0x14, 0x69, 0x00, 0xc1, 'A','a','c','u','t','e',0,
+0xa0, 0x52, 0x00, 0xc2, 'A','c','i','r','c','u','m','f','l','e','x',0,
+0x15, 0x85, 0x00, 0xc3, 'A','t','i','l','d','e',0,
+0x4c, 0xb9, 0x00, 0xc4, 'A','d','i','a','e','r','e','s','i','s',0,
+0x0a, 0x87, 0x00, 0xc5, 'A','r','i','n','g',0,
+0x00, 0xc7, 0x00, 0xc6, 'A','E',0,
+0x53, 0x51, 0x00, 0xc7, 'C','c','e','d','i','l','l','a',0,
+0x15, 0x75, 0x00, 0xc8, 'E','g','r','a','v','e',0,
+0x14, 0xe9, 0x00, 0xc9, 'E','a','c','u','t','e',0,
+0xb0, 0x52, 0x00, 0xca, 'E','c','i','r','c','u','m','f','l','e','x',0,
+0x54, 0xb9, 0x00, 0xcb, 'E','d','i','a','e','r','e','s','i','s',0,
+0x15, 0xf5, 0x00, 0xcc, 'I','g','r','a','v','e',0,
+0x15, 0x69, 0x00, 0xcd, 'I','a','c','u','t','e',0,
+0xc0, 0x52, 0x00, 0xce, 'I','c','i','r','c','u','m','f','l','e','x',0,
+0x5c, 0xb9, 0x00, 0xcf, 'I','d','i','a','e','r','e','s','i','s',0,
+0x02, 0x04, 0x00, 0xd0, 'E','T','H',0,
+0x02, 0x64, 0x00, 0xd0, 'E','t','h',0,
+0x17, 0x25, 0x00, 0xd1, 'N','t','i','l','d','e',0,
+0x16, 0xb5, 0x00, 0xd2, 'O','g','r','a','v','e',0,
+0x16, 0x29, 0x00, 0xd3, 'O','a','c','u','t','e',0,
+0xd8, 0x52, 0x00, 0xd4, 'O','c','i','r','c','u','m','f','l','e','x',0,
+0x17, 0x45, 0x00, 0xd5, 'O','t','i','l','d','e',0,
+0x68, 0xb9, 0x00, 0xd6, 'O','d','i','a','e','r','e','s','i','s',0,
+0x6e, 0xd9, 0x00, 0xd7, 'm','u','l','t','i','p','l','y',0,
+0x5c, 0x9b, 0x00, 0xd8, 'O','o','b','l','i','q','u','e',0,
+0x17, 0x75, 0x00, 0xd9, 'U','g','r','a','v','e',0,
+0x16, 0xe9, 0x00, 0xda, 'U','a','c','u','t','e',0,
+0xf0, 0x52, 0x00, 0xdb, 'U','c','i','r','c','u','m','f','l','e','x',0,
+0x74, 0xb9, 0x00, 0xdc, 'U','d','i','a','e','r','e','s','i','s',0,
+0x17, 0x69, 0x00, 0xdd, 'Y','a','c','u','t','e',0,
+0x09, 0xae, 0x00, 0xde, 'T','H','O','R','N',0,
+0x0b, 0x8e, 0x00, 0xde, 'T','h','o','r','n',0,
+0x1b, 0xa8, 0x00, 0xdf, 's','s','h','a','r','p',0,
+0x18, 0xf5, 0x00, 0xe0, 'a','g','r','a','v','e',0,
+0x18, 0x69, 0x00, 0xe1, 'a','a','c','u','t','e',0,
+0x20, 0x52, 0x00, 0xe2, 'a','c','i','r','c','u','m','f','l','e','x',0,
+0x19, 0x85, 0x00, 0xe3, 'a','t','i','l','d','e',0,
+0x8c, 0xb9, 0x00, 0xe4, 'a','d','i','a','e','r','e','s','i','s',0,
+0x0c, 0x87, 0x00, 0xe5, 'a','r','i','n','g',0,
+0x01, 0x27, 0x00, 0xe6, 'a','e',0,
+0x63, 0x51, 0x00, 0xe7, 'c','c','e','d','i','l','l','a',0,
+0x19, 0x75, 0x00, 0xe8, 'e','g','r','a','v','e',0,
+0x18, 0xe9, 0x00, 0xe9, 'e','a','c','u','t','e',0,
+0x30, 0x52, 0x00, 0xea, 'e','c','i','r','c','u','m','f','l','e','x',0,
+0x94, 0xb9, 0x00, 0xeb, 'e','d','i','a','e','r','e','s','i','s',0,
+0x19, 0xf5, 0x00, 0xec, 'i','g','r','a','v','e',0,
+0x19, 0x69, 0x00, 0xed, 'i','a','c','u','t','e',0,
+0x40, 0x52, 0x00, 0xee, 'i','c','i','r','c','u','m','f','l','e','x',0,
+0x9c, 0xb9, 0x00, 0xef, 'i','d','i','a','e','r','e','s','i','s',0,
+0x02, 0xe4, 0x00, 0xf0, 'e','t','h',0,
+0x1b, 0x25, 0x00, 0xf1, 'n','t','i','l','d','e',0,
+0x1a, 0xb5, 0x00, 0xf2, 'o','g','r','a','v','e',0,
+0x1a, 0x29, 0x00, 0xf3, 'o','a','c','u','t','e',0,
+0x58, 0x52, 0x00, 0xf4, 'o','c','i','r','c','u','m','f','l','e','x',0,
+0x1b, 0x45, 0x00, 0xf5, 'o','t','i','l','d','e',0,
+0xa8, 0xb9, 0x00, 0xf6, 'o','d','i','a','e','r','e','s','i','s',0,
+0x68, 0x18, 0x00, 0xf7, 'd','i','v','i','s','i','o','n',0,
+0x1b, 0x42, 0x00, 0xf8, 'o','s','l','a','s','h',0,
+0x1b, 0x75, 0x00, 0xf9, 'u','g','r','a','v','e',0,
+0x1a, 0xe9, 0x00, 0xfa, 'u','a','c','u','t','e',0,
+0x70, 0x52, 0x00, 0xfb, 'u','c','i','r','c','u','m','f','l','e','x',0,
+0xb4, 0xb9, 0x00, 0xfc, 'u','d','i','a','e','r','e','s','i','s',0,
+0x1b, 0x69, 0x00, 0xfd, 'y','a','c','u','t','e',0,
+0x0d, 0x8e, 0x00, 0xfe, 't','h','o','r','n',0,
+0xbc, 0xb9, 0x00, 0xff, 'y','d','i','a','e','r','e','s','i','s',0,
+0x2a, 0xf5, 0x01, 0xa1, 'A','o','g','o','n','e','k',0,
+0x0c, 0x95, 0x01, 0xa2, 'b','r','e','v','e',0,
+0x2f, 0x27, 0x01, 0xa3, 'L','s','t','r','o','k','e',0,
+0x15, 0xcc, 0x01, 0xa5, 'L','c','a','r','o','n',0,
+0x16, 0xa9, 0x01, 0xa6, 'S','a','c','u','t','e',0,
+0x16, 0xac, 0x01, 0xa9, 'S','c','a','r','o','n',0,
+0x5b, 0x51, 0x01, 0xaa, 'S','c','e','d','i','l','l','a',0,
+0x16, 0xcc, 0x01, 0xab, 'T','c','a','r','o','n',0,
+0x17, 0x89, 0x01, 0xac, 'Z','a','c','u','t','e',0,
+0x17, 0x8c, 0x01, 0xae, 'Z','c','a','r','o','n',0,
+0xbe, 0x4a, 0x01, 0xaf, 'Z','a','b','o','v','e','d','o','t',0,
+0x32, 0xf5, 0x01, 0xb1, 'a','o','g','o','n','e','k',0,
+0x1a, 0xb5, 0x01, 0xb2, 'o','g','o','n','e','k',0,
+0x37, 0x27, 0x01, 0xb3, 'l','s','t','r','o','k','e',0,
+0x19, 0xcc, 0x01, 0xb5, 'l','c','a','r','o','n',0,
+0x1a, 0xa9, 0x01, 0xb6, 's','a','c','u','t','e',0,
+0x0c, 0x4c, 0x01, 0xb7, 'c','a','r','o','n',0,
+0x1a, 0xac, 0x01, 0xb9, 's','c','a','r','o','n',0,
+0x6b, 0x51, 0x01, 0xba, 's','c','e','d','i','l','l','a',0,
+0x1a, 0xcc, 0x01, 0xbb, 't','c','a','r','o','n',0,
+0x1b, 0x89, 0x01, 0xbc, 'z','a','c','u','t','e',0,
+0x47, 0xe9, 0x01, 0xbd, 'd','o','u','b','l','e','a','c','u','t','e',0,
+0x1b, 0x8c, 0x01, 0xbe, 'z','c','a','r','o','n',0,
+0xde, 0x4a, 0x01, 0xbf, 'z','a','b','o','v','e','d','o','t',0,
+0x16, 0x89, 0x01, 0xc0, 'R','a','c','u','t','e',0,
+0x14, 0xb5, 0x01, 0xc3, 'A','b','r','e','v','e',0,
+0x15, 0xc9, 0x01, 0xc5, 'L','a','c','u','t','e',0,
+0x14, 0xa9, 0x01, 0xc6, 'C','a','c','u','t','e',0,
+0x14, 0xac, 0x01, 0xc8, 'C','c','a','r','o','n',0,
+0x2b, 0xf5, 0x01, 0xca, 'E','o','g','o','n','e','k',0,
+0x14, 0xec, 0x01, 0xcc, 'E','c','a','r','o','n',0,
+0x14, 0xcc, 0x01, 0xcf, 'D','c','a','r','o','n',0,
+0x2d, 0x27, 0x01, 0xd0, 'D','s','t','r','o','k','e',0,
+0x16, 0x09, 0x01, 0xd1, 'N','a','c','u','t','e',0,
+0x16, 0x0c, 0x01, 0xd2, 'N','c','a','r','o','n',0,
+0xbf, 0xe9, 0x01, 0xd5, 'O','d','o','u','b','l','e','a','c','u','t','e',0,
+0x16, 0x8c, 0x01, 0xd8, 'R','c','a','r','o','n',0,
+0x0b, 0xc7, 0x01, 0xd9, 'U','r','i','n','g',0,
+0xef, 0xe9, 0x01, 0xdb, 'U','d','o','u','b','l','e','a','c','u','t','e',0,
+0x5b, 0xd1, 0x01, 0xde, 'T','c','e','d','i','l','l','a',0,
+0x1a, 0x89, 0x01, 0xe0, 'r','a','c','u','t','e',0,
+0x18, 0xb5, 0x01, 0xe3, 'a','b','r','e','v','e',0,
+0x19, 0xc9, 0x01, 0xe5, 'l','a','c','u','t','e',0,
+0x18, 0xa9, 0x01, 0xe6, 'c','a','c','u','t','e',0,
+0x18, 0xac, 0x01, 0xe8, 'c','c','a','r','o','n',0,
+0x33, 0xf5, 0x01, 0xea, 'e','o','g','o','n','e','k',0,
+0x18, 0xec, 0x01, 0xec, 'e','c','a','r','o','n',0,
+0x18, 0xcc, 0x01, 0xef, 'd','c','a','r','o','n',0,
+0x35, 0x27, 0x01, 0xf0, 'd','s','t','r','o','k','e',0,
+0x1a, 0x09, 0x01, 0xf1, 'n','a','c','u','t','e',0,
+0x1a, 0x0c, 0x01, 0xf2, 'n','c','a','r','o','n',0,
+0xbf, 0xe9, 0x01, 0xf5, 'o','d','o','u','b','l','e','a','c','u','t','e',0,
+0xef, 0xe9, 0x01, 0xfb, 'u','d','o','u','b','l','e','a','c','u','t','e',0,
+0x1a, 0x8c, 0x01, 0xf8, 'r','c','a','r','o','n',0,
+0x0d, 0xc7, 0x01, 0xf9, 'u','r','i','n','g',0,
+0x6b, 0xd1, 0x01, 0xfe, 't','c','e','d','i','l','l','a',0,
+0x64, 0x4a, 0x01, 0xff, 'a','b','o','v','e','d','o','t',0,
+0x2e, 0x27, 0x02, 0xa1, 'H','s','t','r','o','k','e',0,
+0xbc, 0x52, 0x02, 0xa6, 'H','c','i','r','c','u','m','f','l','e','x',0,
+0xad, 0x4a, 0x02, 0xa9, 'I','a','b','o','v','e','d','o','t',0,
+0x15, 0x75, 0x02, 0xab, 'G','b','r','e','v','e',0,
+0xc4, 0x52, 0x02, 0xac, 'J','c','i','r','c','u','m','f','l','e','x',0,
+0x36, 0x27, 0x02, 0xb1, 'h','s','t','r','o','k','e',0,
+0x3c, 0x52, 0x02, 0xb6, 'h','c','i','r','c','u','m','f','l','e','x',0,
+0x68, 0xed, 0x02, 0xb9, 'i','d','o','t','l','e','s','s',0,
+0x19, 0x75, 0x02, 0xbb, 'g','b','r','e','v','e',0,
+0x44, 0x52, 0x02, 0xbc, 'j','c','i','r','c','u','m','f','l','e','x',0,
+0xa7, 0x4a, 0x02, 0xc5, 'C','a','b','o','v','e','d','o','t',0,
+0xa8, 0x52, 0x02, 0xc6, 'C','c','i','r','c','u','m','f','l','e','x',0,
+0xab, 0x4a, 0x02, 0xd5, 'G','a','b','o','v','e','d','o','t',0,
+0xb8, 0x52, 0x02, 0xd8, 'G','c','i','r','c','u','m','f','l','e','x',0,
+0x17, 0x35, 0x02, 0xdd, 'U','b','r','e','v','e',0,
+0xe8, 0x52, 0x02, 0xde, 'S','c','i','r','c','u','m','f','l','e','x',0,
+0xc7, 0x4a, 0x02, 0xe5, 'c','a','b','o','v','e','d','o','t',0,
+0x28, 0x52, 0x02, 0xe6, 'c','c','i','r','c','u','m','f','l','e','x',0,
+0xcb, 0x4a, 0x02, 0xf5, 'g','a','b','o','v','e','d','o','t',0,
+0x38, 0x52, 0x02, 0xf8, 'g','c','i','r','c','u','m','f','l','e','x',0,
+0x1b, 0x35, 0x02, 0xfd, 'u','b','r','e','v','e',0,
+0x68, 0x52, 0x02, 0xfe, 's','c','i','r','c','u','m','f','l','e','x',0,
+0x02, 0xf1, 0x03, 0xa2, 'k','r','a',0,
+0x0c, 0xb9, 0x03, 0xa2, 'k','a','p','p','a',0,
+0x5a, 0xd1, 0x03, 0xa3, 'R','c','e','d','i','l','l','a',0,
+0x16, 0x85, 0x03, 0xa5, 'I','t','i','l','d','e',0,
+0x57, 0xd1, 0x03, 0xa6, 'L','c','e','d','i','l','l','a',0,
+0x2b, 0x1c, 0x03, 0xaa, 'E','m','a','c','r','o','n',0,
+0x55, 0x51, 0x03, 0xab, 'G','c','e','d','i','l','l','a',0,
+0x17, 0xe2, 0x03, 0xac, 'T','s','l','a','s','h',0,
+0x6a, 0xd1, 0x03, 0xb3, 'r','c','e','d','i','l','l','a',0,
+0x1a, 0x85, 0x03, 0xb5, 'i','t','i','l','d','e',0,
+0x67, 0xd1, 0x03, 0xb6, 'l','c','e','d','i','l','l','a',0,
+0x33, 0x1c, 0x03, 0xba, 'e','m','a','c','r','o','n',0,
+0x65, 0x51, 0x03, 0xbb, 'g','c','e','d','i','l','l','a',0,
+0x1b, 0xe2, 0x03, 0xbc, 't','s','l','a','s','h',0,
+0x01, 0xf7, 0x03, 0xbd, 'E','N','G',0,
+0x02, 0xd7, 0x03, 0xbf, 'e','n','g',0,
+0x2a, 0x1c, 0x03, 0xc0, 'A','m','a','c','r','o','n',0,
+0x2c, 0xf5, 0x03, 0xc7, 'I','o','g','o','n','e','k',0,
+0xa9, 0x4a, 0x03, 0xcc, 'E','a','b','o','v','e','d','o','t',0,
+0x2c, 0x1c, 0x03, 0xcf, 'I','m','a','c','r','o','n',0,
+0x58, 0xd1, 0x03, 0xd1, 'N','c','e','d','i','l','l','a',0,
+0x2d, 0x9c, 0x03, 0xd2, 'O','m','a','c','r','o','n',0,
+0x57, 0x51, 0x03, 0xd3, 'K','c','e','d','i','l','l','a',0,
+0x2f, 0xf5, 0x03, 0xd9, 'U','o','g','o','n','e','k',0,
+0x18, 0x05, 0x03, 0xdd, 'U','t','i','l','d','e',0,
+0x2f, 0x1c, 0x03, 0xde, 'U','m','a','c','r','o','n',0,
+0x32, 0x1c, 0x03, 0xe0, 'a','m','a','c','r','o','n',0,
+0x34, 0xf5, 0x03, 0xe7, 'i','o','g','o','n','e','k',0,
+0xc9, 0x4a, 0x03, 0xec, 'e','a','b','o','v','e','d','o','t',0,
+0x34, 0x1c, 0x03, 0xef, 'i','m','a','c','r','o','n',0,
+0x68, 0xd1, 0x03, 0xf1, 'n','c','e','d','i','l','l','a',0,
+0x35, 0x9c, 0x03, 0xf2, 'o','m','a','c','r','o','n',0,
+0x67, 0x51, 0x03, 0xf3, 'k','c','e','d','i','l','l','a',0,
+0x37, 0xf5, 0x03, 0xf9, 'u','o','g','o','n','e','k',0,
+0x1c, 0x05, 0x03, 0xfd, 'u','t','i','l','d','e',0,
+0x37, 0x1c, 0x03, 0xfe, 'u','m','a','c','r','o','n',0,
+0xa6, 0x4a, 0x12, 0xa1, 'B','a','b','o','v','e','d','o','t',0,
+0xc6, 0x4a, 0x12, 0xa2, 'b','a','b','o','v','e','d','o','t',0,
+0xa8, 0x4a, 0x12, 0xa6, 'D','a','b','o','v','e','d','o','t',0,
+0x17, 0xb5, 0x12, 0xa8, 'W','g','r','a','v','e',0,
+0x17, 0x29, 0x12, 0xaa, 'W','a','c','u','t','e',0,
+0xc8, 0x4a, 0x12, 0xab, 'd','a','b','o','v','e','d','o','t',0,
+0x17, 0xf5, 0x12, 0xac, 'Y','g','r','a','v','e',0,
+0xaa, 0x4a, 0x12, 0xb0, 'F','a','b','o','v','e','d','o','t',0,
+0xca, 0x4a, 0x12, 0xb1, 'f','a','b','o','v','e','d','o','t',0,
+0xb1, 0x4a, 0x12, 0xb4, 'M','a','b','o','v','e','d','o','t',0,
+0xd1, 0x4a, 0x12, 0xb5, 'm','a','b','o','v','e','d','o','t',0,
+0xb4, 0x4a, 0x12, 0xb7, 'P','a','b','o','v','e','d','o','t',0,
+0x1b, 0xb5, 0x12, 0xb8, 'w','g','r','a','v','e',0,
+0xd4, 0x4a, 0x12, 0xb9, 'p','a','b','o','v','e','d','o','t',0,
+0x1b, 0x29, 0x12, 0xba, 'w','a','c','u','t','e',0,
+0xb7, 0x4a, 0x12, 0xbb, 'S','a','b','o','v','e','d','o','t',0,
+0x1b, 0xf5, 0x12, 0xbc, 'y','g','r','a','v','e',0,
+0x78, 0xb9, 0x12, 0xbd, 'W','d','i','a','e','r','e','s','i','s',0,
+0xb8, 0xb9, 0x12, 0xbe, 'w','d','i','a','e','r','e','s','i','s',0,
+0xd7, 0x4a, 0x12, 0xbf, 's','a','b','o','v','e','d','o','t',0,
+0xf8, 0x52, 0x12, 0xd0, 'W','c','i','r','c','u','m','f','l','e','x',0,
+0xb8, 0x4a, 0x12, 0xd7, 'T','a','b','o','v','e','d','o','t',0,
+0x00, 0x52, 0x12, 0xde, 'Y','c','i','r','c','u','m','f','l','e','x',0,
+0x78, 0x52, 0x12, 0xf0, 'w','c','i','r','c','u','m','f','l','e','x',0,
+0xd8, 0x4a, 0x12, 0xf7, 't','a','b','o','v','e','d','o','t',0,
+0x80, 0x52, 0x12, 0xfe, 'y','c','i','r','c','u','m','f','l','e','x',0,
+0x00, 0xe3, 0x13, 0xbc, 'O','E',0,
+0x01, 0x43, 0x13, 0xbd, 'o','e',0,
+0x7c, 0xb9, 0x13, 0xbe, 'Y','d','i','a','e','r','e','s','i','s',0,
+0x6f, 0x05, 0x04, 0x7e, 'o','v','e','r','l','i','n','e',0,
+0xfc, 0x36, 0x04, 0xa1, 'k','a','n','a','_','f','u','l','l','s','t','o','p',0,
+0xa6, 0x52, 0x04, 0xa2, 'k','a','n','a','_','o','p','e','n','i','n','g','b','r','a','c','k','e','t',0,
+0x4a, 0x52, 0x04, 0xa3, 'k','a','n','a','_','c','l','o','s','i','n','g','b','r','a','c','k','e','t',0,
+0x9e, 0xb7, 0x04, 0xa4, 'k','a','n','a','_','c','o','m','m','a',0,
+0xcc, 0xc5, 0x04, 0xa5, 'k','a','n','a','_','c','o','n','j','u','n','c','t','i','v','e',0,
+0xf5, 0xca, 0x04, 0xa5, 'k','a','n','a','_','m','i','d','d','l','e','d','o','t',0,
+0x33, 0x41, 0x04, 0xa6, 'k','a','n','a','_','W','O',0,
+0x19, 0x83, 0x04, 0xa7, 'k','a','n','a','_','a',0,
+0x19, 0x8b, 0x04, 0xa8, 'k','a','n','a','_','i',0,
+0x19, 0x97, 0x04, 0xa9, 'k','a','n','a','_','u',0,
+0x19, 0x87, 0x04, 0xaa, 'k','a','n','a','_','e',0,
+0x19, 0x91, 0x04, 0xab, 'k','a','n','a','_','o',0,
+0x33, 0x97, 0x04, 0xac, 'k','a','n','a','_','y','a',0,
+0x33, 0xab, 0x04, 0xad, 'k','a','n','a','_','y','u',0,
+0x33, 0xa5, 0x04, 0xae, 'k','a','n','a','_','y','o',0,
+0x67, 0xb3, 0x04, 0xaf, 'k','a','n','a','_','t','s','u',0,
+0x33, 0xa1, 0x04, 0xaf, 'k','a','n','a','_','t','u',0,
+0xfa, 0xfc, 0x04, 0xb0, 'p','r','o','l','o','n','g','e','d','s','o','u','n','d',0,
+0x19, 0x63, 0x04, 0xb1, 'k','a','n','a','_','A',0,
+0x19, 0x6b, 0x04, 0xb2, 'k','a','n','a','_','I',0,
+0x19, 0x77, 0x04, 0xb3, 'k','a','n','a','_','U',0,
+0x19, 0x67, 0x04, 0xb4, 'k','a','n','a','_','E',0,
+0x19, 0x71, 0x04, 0xb5, 'k','a','n','a','_','O',0,
+0x33, 0x1b, 0x04, 0xb6, 'k','a','n','a','_','K','A',0,
+0x33, 0x23, 0x04, 0xb7, 'k','a','n','a','_','K','I',0,
+0x33, 0x2f, 0x04, 0xb8, 'k','a','n','a','_','K','U',0,
+0x33, 0x1f, 0x04, 0xb9, 'k','a','n','a','_','K','E',0,
+0x33, 0x29, 0x04, 0xba, 'k','a','n','a','_','K','O',0,
+0x33, 0x2b, 0x04, 0xbb, 'k','a','n','a','_','S','A',0,
+0x66, 0xad, 0x04, 0xbc, 'k','a','n','a','_','S','H','I',0,
+0x33, 0x3f, 0x04, 0xbd, 'k','a','n','a','_','S','U',0,
+0x33, 0x2f, 0x04, 0xbe, 'k','a','n','a','_','S','E',0,
+0x33, 0x39, 0x04, 0xbf, 'k','a','n','a','_','S','O',0,
+0x33, 0x2d, 0x04, 0xc0, 'k','a','n','a','_','T','A',0,
+0x66, 0x6d, 0x04, 0xc1, 'k','a','n','a','_','C','H','I',0,
+0x33, 0x35, 0x04, 0xc1, 'k','a','n','a','_','T','I',0,
+0x66, 0xd3, 0x04, 0xc2, 'k','a','n','a','_','T','S','U',0,
+0x33, 0x41, 0x04, 0xc2, 'k','a','n','a','_','T','U',0,
+0x33, 0x31, 0x04, 0xc3, 'k','a','n','a','_','T','E',0,
+0x33, 0x3b, 0x04, 0xc4, 'k','a','n','a','_','T','O',0,
+0x33, 0x21, 0x04, 0xc5, 'k','a','n','a','_','N','A',0,
+0x33, 0x29, 0x04, 0xc6, 'k','a','n','a','_','N','I',0,
+0x33, 0x35, 0x04, 0xc7, 'k','a','n','a','_','N','U',0,
+0x33, 0x25, 0x04, 0xc8, 'k','a','n','a','_','N','E',0,
+0x33, 0x2f, 0x04, 0xc9, 'k','a','n','a','_','N','O',0,
+0x33, 0x15, 0x04, 0xca, 'k','a','n','a','_','H','A',0,
+0x33, 0x1d, 0x04, 0xcb, 'k','a','n','a','_','H','I',0,
+0x33, 0x25, 0x04, 0xcc, 'k','a','n','a','_','F','U',0,
+0x33, 0x29, 0x04, 0xcc, 'k','a','n','a','_','H','U',0,
+0x33, 0x19, 0x04, 0xcd, 'k','a','n','a','_','H','E',0,
+0x33, 0x23, 0x04, 0xce, 'k','a','n','a','_','H','O',0,
+0x33, 0x1f, 0x04, 0xcf, 'k','a','n','a','_','M','A',0,
+0x33, 0x27, 0x04, 0xd0, 'k','a','n','a','_','M','I',0,
+0x33, 0x33, 0x04, 0xd1, 'k','a','n','a','_','M','U',0,
+0x33, 0x23, 0x04, 0xd2, 'k','a','n','a','_','M','E',0,
+0x33, 0x2d, 0x04, 0xd3, 'k','a','n','a','_','M','O',0,
+0x33, 0x37, 0x04, 0xd4, 'k','a','n','a','_','Y','A',0,
+0x33, 0x4b, 0x04, 0xd5, 'k','a','n','a','_','Y','U',0,
+0x33, 0x45, 0x04, 0xd6, 'k','a','n','a','_','Y','O',0,
+0x33, 0x29, 0x04, 0xd7, 'k','a','n','a','_','R','A',0,
+0x33, 0x31, 0x04, 0xd8, 'k','a','n','a','_','R','I',0,
+0x33, 0x3d, 0x04, 0xd9, 'k','a','n','a','_','R','U',0,
+0x33, 0x2d, 0x04, 0xda, 'k','a','n','a','_','R','E',0,
+0x33, 0x37, 0x04, 0xdb, 'k','a','n','a','_','R','O',0,
+0x33, 0x33, 0x04, 0xdc, 'k','a','n','a','_','W','A',0,
+0x19, 0x70, 0x04, 0xdd, 'k','a','n','a','_','N',0,
+0x83, 0xfc, 0x04, 0xde, 'v','o','i','c','e','d','s','o','u','n','d',0,
+0xfb, 0xfc, 0x04, 0xdf, 's','e','m','i','v','o','i','c','e','d','s','o','u','n','d',0,
+0x40, 0x56, 0xff, 0x7e, 'k','a','n','a','_','s','w','i','t','c','h',0,
+0x2a, 0xea, 0x05, 0x90, 'F','a','r','s','i','_','0',0,
+0x2a, 0xeb, 0x05, 0x91, 'F','a','r','s','i','_','1',0,
+0x2a, 0xec, 0x05, 0x92, 'F','a','r','s','i','_','2',0,
+0x2a, 0xed, 0x05, 0x93, 'F','a','r','s','i','_','3',0,
+0x2a, 0xee, 0x05, 0x94, 'F','a','r','s','i','_','4',0,
+0x2a, 0xef, 0x05, 0x95, 'F','a','r','s','i','_','5',0,
+0x2a, 0xf0, 0x05, 0x96, 'F','a','r','s','i','_','6',0,
+0x2a, 0xf1, 0x05, 0x97, 'F','a','r','s','i','_','7',0,
+0x2a, 0xf2, 0x05, 0x98, 'F','a','r','s','i','_','8',0,
+0x2a, 0xf3, 0x05, 0x99, 'F','a','r','s','i','_','9',0,
+0x6a, 0x3c, 0x05, 0xa5, 'A','r','a','b','i','c','_','p','e','r','c','e','n','t',0,
+0x0e, 0xd8, 0x05, 0xa6, 'A','r','a','b','i','c','_','s','u','p','e','r','s','c','r','i','p','t','_','a','l','e','f',0,
+0xad, 0x32, 0x05, 0xa7, 'A','r','a','b','i','c','_','t','t','e','h',0,
+0x56, 0x3a, 0x05, 0xa8, 'A','r','a','b','i','c','_','p','e','h',0,
+0x5a, 0x4a, 0x05, 0xa9, 'A','r','a','b','i','c','_','t','c','h','e','h',0,
+0xac, 0x6e, 0x05, 0xaa, 'A','r','a','b','i','c','_','d','d','a','l',0,
+0xad, 0x1a, 0x05, 0xab, 'A','r','a','b','i','c','_','r','r','e','h',0,
+0x59, 0xb7, 0x05, 0xac, 'A','r','a','b','i','c','_','c','o','m','m','a',0,
+0xd4, 0x36, 0x05, 0xae, 'A','r','a','b','i','c','_','f','u','l','l','s','t','o','p',0,
+0x55, 0x02, 0x05, 0xb0, 'A','r','a','b','i','c','_','0',0,
+0x55, 0x03, 0x05, 0xb1, 'A','r','a','b','i','c','_','1',0,
+0x55, 0x04, 0x05, 0xb2, 'A','r','a','b','i','c','_','2',0,
+0x55, 0x05, 0x05, 0xb3, 'A','r','a','b','i','c','_','3',0,
+0x55, 0x06, 0x05, 0xb4, 'A','r','a','b','i','c','_','4',0,
+0x55, 0x07, 0x05, 0xb5, 'A','r','a','b','i','c','_','5',0,
+0x55, 0x08, 0x05, 0xb6, 'A','r','a','b','i','c','_','6',0,
+0x55, 0x09, 0x05, 0xb7, 'A','r','a','b','i','c','_','7',0,
+0x55, 0x0a, 0x05, 0xb8, 'A','r','a','b','i','c','_','8',0,
+0x55, 0x0b, 0x05, 0xb9, 'A','r','a','b','i','c','_','9',0,
+0xac, 0x84, 0x05, 0xbb, 'A','r','a','b','i','c','_','s','e','m','i','c','o','l','o','n',0,
+0x30, 0x2b, 0x05, 0xbf, 'A','r','a','b','i','c','_','q','u','e','s','t','i','o','n','_','m','a','r','k',0,
+0x59, 0xb1, 0x05, 0xc1, 'A','r','a','b','i','c','_','h','a','m','z','a',0,
+0x86, 0xe8, 0x05, 0xc2, 'A','r','a','b','i','c','_','m','a','d','d','a','o','n','a','l','e','f',0,
+0x86, 0xe8, 0x05, 0xc3, 'A','r','a','b','i','c','_','h','a','m','z','a','o','n','a','l','e','f',0,
+0x43, 0x95, 0x05, 0xc4, 'A','r','a','b','i','c','_','h','a','m','z','a','o','n','w','a','w',0,
+0x40, 0xa8, 0x05, 0xc5, 'A','r','a','b','i','c','_','h','a','m','z','a','u','n','d','e','r','a','l','e','f',0,
+0x43, 0x96, 0x05, 0xc6, 'A','r','a','b','i','c','_','h','a','m','z','a','o','n','y','e','h',0,
+0xac, 0x78, 0x05, 0xc7, 'A','r','a','b','i','c','_','a','l','e','f',0,
+0x56, 0x02, 0x05, 0xc8, 'A','r','a','b','i','c','_','b','e','h',0,
+0x59, 0xad, 0x05, 0xc9, 'A','r','a','b','i','c','_','t','e','h','m','a','r','b','u','t','a',0,
+0x56, 0x4a, 0x05, 0xca, 'A','r','a','b','i','c','_','t','e','h',0,
+0xad, 0x02, 0x05, 0xcb, 'A','r','a','b','i','c','_','t','h','e','h',0,
+0xac, 0xab, 0x05, 0xcc, 'A','r','a','b','i','c','_','j','e','e','m',0,
+0x56, 0x12, 0x05, 0xcd, 'A','r','a','b','i','c','_','h','a','h',0,
+0xac, 0xb2, 0x05, 0xce, 'A','r','a','b','i','c','_','k','h','a','h',0,
+0x56, 0x06, 0x05, 0xcf, 'A','r','a','b','i','c','_','d','a','l',0,
+0xac, 0xfe, 0x05, 0xd0, 'A','r','a','b','i','c','_','t','h','a','l',0,
+0xaa, 0xe9, 0x05, 0xd1, 'A','r','a','b','i','c','_','r','a',0,
+0xad, 0x24, 0x05, 0xd2, 'A','r','a','b','i','c','_','z','a','i','n',0,
+0xac, 0xf4, 0x05, 0xd3, 'A','r','a','b','i','c','_','s','e','e','n',0,
+0x5a, 0x5c, 0x05, 0xd4, 'A','r','a','b','i','c','_','s','h','e','e','n',0,
+0x56, 0x3a, 0x05, 0xd5, 'A','r','a','b','i','c','_','s','a','d',0,
+0x55, 0xfe, 0x05, 0xd6, 'A','r','a','b','i','c','_','d','a','d',0,
+0x56, 0x42, 0x05, 0xd7, 'A','r','a','b','i','c','_','t','a','h',0,
+0x56, 0x5a, 0x05, 0xd8, 'A','r','a','b','i','c','_','z','a','h',0,
+0x56, 0x0c, 0x05, 0xd9, 'A','r','a','b','i','c','_','a','i','n',0,
+0x59, 0x94, 0x05, 0xda, 'A','r','a','b','i','c','_','g','h','a','i','n',0,
+0x6b, 0x62, 0x05, 0xe0, 'A','r','a','b','i','c','_','t','a','t','w','e','e','l',0,
+0x56, 0x12, 0x05, 0xe1, 'A','r','a','b','i','c','_','f','e','h',0,
+0x56, 0x34, 0x05, 0xe2, 'A','r','a','b','i','c','_','q','a','f',0,
+0x56, 0x1c, 0x05, 0xe3, 'A','r','a','b','i','c','_','k','a','f',0,
+0x56, 0x27, 0x05, 0xe4, 'A','r','a','b','i','c','_','l','a','m',0,
+0xac, 0xc3, 0x05, 0xe5, 'A','r','a','b','i','c','_','m','e','e','m',0,
+0xad, 0x08, 0x05, 0xe6, 'A','r','a','b','i','c','_','n','o','o','n',0,
+0xaa, 0xd5, 0x05, 0xe7, 'A','r','a','b','i','c','_','h','a',0,
+0x56, 0x1a, 0x05, 0xe7, 'A','r','a','b','i','c','_','h','e','h',0,
+0x56, 0x5d, 0x05, 0xe8, 'A','r','a','b','i','c','_','w','a','w',0,
+0x70, 0xc1, 0x05, 0xe9, 'A','r','a','b','i','c','_','a','l','e','f','m','a','k','s','u','r','a',0,
+0x56, 0x5e, 0x05, 0xea, 'A','r','a','b','i','c','_','y','e','h',0,
+0xcf, 0x48, 0x05, 0xeb, 'A','r','a','b','i','c','_','f','a','t','h','a','t','a','n',0,
+0xcd, 0xb8, 0x05, 0xec, 'A','r','a','b','i','c','_','d','a','m','m','a','t','a','n',0,
+0xd2, 0x48, 0x05, 0xed, 'A','r','a','b','i','c','_','k','a','s','r','a','t','a','n',0,
+0x59, 0x89, 0x05, 0xee, 'A','r','a','b','i','c','_','f','a','t','h','a',0,
+0x59, 0x57, 0x05, 0xef, 'A','r','a','b','i','c','_','d','a','m','m','a',0,
+0x59, 0xe9, 0x05, 0xf0, 'A','r','a','b','i','c','_','k','a','s','r','a',0,
+0xb4, 0xe1, 0x05, 0xf1, 'A','r','a','b','i','c','_','s','h','a','d','d','a',0,
+0x5a, 0xfc, 0x05, 0xf2, 'A','r','a','b','i','c','_','s','u','k','u','n',0,
+0x84, 0x4d, 0x05, 0xf3, 'A','r','a','b','i','c','_','m','a','d','d','a','_','a','b','o','v','e',0,
+0x84, 0x4d, 0x05, 0xf4, 'A','r','a','b','i','c','_','h','a','m','z','a','_','a','b','o','v','e',0,
+0x84, 0x6d, 0x05, 0xf5, 'A','r','a','b','i','c','_','h','a','m','z','a','_','b','e','l','o','w',0,
+0x56, 0x22, 0x05, 0xf6, 'A','r','a','b','i','c','_','j','e','h',0,
+0x56, 0x52, 0x05, 0xf7, 'A','r','a','b','i','c','_','v','e','h',0,
+0x59, 0xca, 0x05, 0xf8, 'A','r','a','b','i','c','_','k','e','h','e','h',0,
+0x56, 0x0c, 0x05, 0xf9, 'A','r','a','b','i','c','_','g','a','f',0,
+0xb5, 0xbd, 0x05, 0xfa, 'A','r','a','b','i','c','_','n','o','o','n','_','g','h','u','n','n','a',0,
+0xcb, 0xf3, 0x05, 0xfb, 'A','r','a','b','i','c','_','h','e','h','_','d','o','a','c','h','a','s','h','m','e','e',0,
+0xad, 0xfe, 0x05, 0xfc, 'F','a','r','s','i','_','y','e','h',0,
+0xaf, 0x7f, 0x05, 0xfd, 'A','r','a','b','i','c','_','y','e','h','_','b','a','r','e','e',0,
+0xcf, 0x52, 0x05, 0xfe, 'A','r','a','b','i','c','_','h','e','h','_','g','o','a','l',0,
+0xb6, 0x56, 0xff, 0x7e, 'A','r','a','b','i','c','_','s','w','i','t','c','h',0,
+0x29, 0x44, 0x06, 0x80, 'C','y','r','i','l','l','i','c','_','G','H','E','_','b','a','r',0,
+0x37, 0x44, 0x06, 0x90, 'C','y','r','i','l','l','i','c','_','g','h','e','_','b','a','r',0,
+0x9e, 0x2c, 0x06, 0x81, 'C','y','r','i','l','l','i','c','_','Z','H','E','_','d','e','s','c','e','n','d','e','r',0,
+0x1e, 0x2c, 0x06, 0x91, 'C','y','r','i','l','l','i','c','_','z','h','e','_','d','e','s','c','e','n','d','e','r',0,
+0x76, 0x2c, 0x06, 0x82, 'C','y','r','i','l','l','i','c','_','K','A','_','d','e','s','c','e','n','d','e','r',0,
+0xf6, 0x2c, 0x06, 0x92, 'C','y','r','i','l','l','i','c','_','k','a','_','d','e','s','c','e','n','d','e','r',0,
+0x17, 0x27, 0x06, 0x83, 'C','y','r','i','l','l','i','c','_','K','A','_','v','e','r','t','s','t','r','o','k','e',0,
+0x17, 0x27, 0x06, 0x93, 'C','y','r','i','l','l','i','c','_','k','a','_','v','e','r','t','s','t','r','o','k','e',0,
+0x7a, 0x2c, 0x06, 0x84, 'C','y','r','i','l','l','i','c','_','E','N','_','d','e','s','c','e','n','d','e','r',0,
+0xfa, 0x2c, 0x06, 0x94, 'C','y','r','i','l','l','i','c','_','e','n','_','d','e','s','c','e','n','d','e','r',0,
+0x9d, 0xf8, 0x06, 0x85, 'C','y','r','i','l','l','i','c','_','U','_','s','t','r','a','i','g','h','t',0,
+0xdd, 0xf8, 0x06, 0x95, 'C','y','r','i','l','l','i','c','_','u','_','s','t','r','a','i','g','h','t',0,
+0xe5, 0x34, 0x06, 0x86, 'C','y','r','i','l','l','i','c','_','U','_','s','t','r','a','i','g','h','t','_','b','a','r',0,
+0xe5, 0x34, 0x06, 0x96, 'C','y','r','i','l','l','i','c','_','u','_','s','t','r','a','i','g','h','t','_','b','a','r',0,
+0x5e, 0x2c, 0x06, 0x87, 'C','y','r','i','l','l','i','c','_','H','A','_','d','e','s','c','e','n','d','e','r',0,
+0xde, 0x2c, 0x06, 0x97, 'C','y','r','i','l','l','i','c','_','h','a','_','d','e','s','c','e','n','d','e','r',0,
+0x2e, 0x2c, 0x06, 0x88, 'C','y','r','i','l','l','i','c','_','C','H','E','_','d','e','s','c','e','n','d','e','r',0,
+0xae, 0x2c, 0x06, 0x98, 'C','y','r','i','l','l','i','c','_','c','h','e','_','d','e','s','c','e','n','d','e','r',0,
+0x87, 0x27, 0x06, 0x89, 'C','y','r','i','l','l','i','c','_','C','H','E','_','v','e','r','t','s','t','r','o','k','e',0,
+0x87, 0x27, 0x06, 0x99, 'C','y','r','i','l','l','i','c','_','c','h','e','_','v','e','r','t','s','t','r','o','k','e',0,
+0x65, 0x19, 0x06, 0x8a, 'C','y','r','i','l','l','i','c','_','S','H','H','A',0,
+0x66, 0xf9, 0x06, 0x9a, 'C','y','r','i','l','l','i','c','_','s','h','h','a',0,
+0xca, 0x77, 0x06, 0x8c, 'C','y','r','i','l','l','i','c','_','S','C','H','W','A',0,
+0xce, 0x57, 0x06, 0x9c, 'C','y','r','i','l','l','i','c','_','s','c','h','w','a',0,
+0x5f, 0x1c, 0x06, 0x8d, 'C','y','r','i','l','l','i','c','_','I','_','m','a','c','r','o','n',0,
+0x6f, 0x1c, 0x06, 0x9d, 'C','y','r','i','l','l','i','c','_','i','_','m','a','c','r','o','n',0,
+0xcb, 0xc4, 0x06, 0x8e, 'C','y','r','i','l','l','i','c','_','O','_','b','a','r',0,
+0xcd, 0xc4, 0x06, 0x9e, 'C','y','r','i','l','l','i','c','_','o','_','b','a','r',0,
+0x65, 0x1c, 0x06, 0x8f, 'C','y','r','i','l','l','i','c','_','U','_','m','a','c','r','o','n',0,
+0x75, 0x1c, 0x06, 0x9f, 'C','y','r','i','l','l','i','c','_','u','_','m','a','c','r','o','n',0,
+0xec, 0x01, 0x06, 0xa1, 'S','e','r','b','i','a','n','_','d','j','e',0,
+0xfd, 0xfd, 0x06, 0xa2, 'M','a','c','e','d','o','n','i','a','_','g','j','e',0,
+0xd9, 0x65, 0x06, 0xa3, 'C','y','r','i','l','l','i','c','_','i','o',0,
+0x02, 0x53, 0x06, 0xa4, 'U','k','r','a','i','n','i','a','n','_','i','e',0,
+0x01, 0x55, 0x06, 0xa4, 'U','k','r','a','n','i','a','n','_','j','e',0,
+0xfe, 0x03, 0x06, 0xa5, 'M','a','c','e','d','o','n','i','a','_','d','s','e',0,
+0x00, 0xf7, 0x06, 0xa6, 'U','k','r','a','i','n','i','a','n','_','i',0,
+0x80, 0x77, 0x06, 0xa6, 'U','k','r','a','n','i','a','n','_','i',0,
+0x02, 0x77, 0x06, 0xa7, 'U','k','r','a','i','n','i','a','n','_','y','i',0,
+0x01, 0x77, 0x06, 0xa7, 'U','k','r','a','n','i','a','n','_','y','i',0,
+0xd9, 0x5d, 0x06, 0xa8, 'C','y','r','i','l','l','i','c','_','j','e',0,
+0x75, 0xd5, 0x06, 0xa8, 'S','e','r','b','i','a','n','_','j','e',0,
+0xb3, 0x31, 0x06, 0xa9, 'C','y','r','i','l','l','i','c','_','l','j','e',0,
+0xec, 0x21, 0x06, 0xa9, 'S','e','r','b','i','a','n','_','l','j','e',0,
+0xb3, 0x39, 0x06, 0xaa, 'C','y','r','i','l','l','i','c','_','n','j','e',0,
+0xec, 0x29, 0x06, 0xaa, 'S','e','r','b','i','a','n','_','n','j','e',0,
+0xd9, 0x11, 0x06, 0xab, 'S','e','r','b','i','a','n','_','t','s','h','e',0,
+0xfe, 0x0d, 0x06, 0xac, 'M','a','c','e','d','o','n','i','a','_','k','j','e',0,
+0x12, 0x26, 0x06, 0xad, 'U','k','r','a','i','n','i','a','n','_','g','h','e','_','w','i','t','h','_','u','p','t','u','r','n',0,
+0x51, 0x3d, 0x06, 0xae, 'B','y','e','l','o','r','u','s','s','i','a','n','_','s','h','o','r','t','u',0,
+0x66, 0xcd, 0x06, 0xaf, 'C','y','r','i','l','l','i','c','_','d','z','h','e',0,
+0xec, 0x21, 0x06, 0xaf, 'S','e','r','b','i','a','n','_','d','z','e',0,
+0xbc, 0x68, 0x06, 0xb0, 'n','u','m','e','r','o','s','i','g','n',0,
+0xeb, 0x21, 0x06, 0xb1, 'S','e','r','b','i','a','n','_','D','J','E',0,
+0xfd, 0x1d, 0x06, 0xb2, 'M','a','c','e','d','o','n','i','a','_','G','J','E',0,
+0xd9, 0x05, 0x06, 0xb3, 'C','y','r','i','l','l','i','c','_','I','O',0,
+0x01, 0xf3, 0x06, 0xb4, 'U','k','r','a','i','n','i','a','n','_','I','E',0,
+0x00, 0xf5, 0x06, 0xb4, 'U','k','r','a','n','i','a','n','_','J','E',0,
+0xfd, 0x23, 0x06, 0xb5, 'M','a','c','e','d','o','n','i','a','_','D','S','E',0,
+0x00, 0xd7, 0x06, 0xb6, 'U','k','r','a','i','n','i','a','n','_','I',0,
+0x80, 0x57, 0x06, 0xb6, 'U','k','r','a','n','i','a','n','_','I',0,
+0x02, 0x17, 0x06, 0xb7, 'U','k','r','a','i','n','i','a','n','_','Y','I',0,
+0x01, 0x17, 0x06, 0xb7, 'U','k','r','a','n','i','a','n','_','Y','I',0,
+0xd8, 0xfd, 0x06, 0xb8, 'C','y','r','i','l','l','i','c','_','J','E',0,
+0x75, 0x75, 0x06, 0xb8, 'S','e','r','b','i','a','n','_','J','E',0,
+0xb2, 0x51, 0x06, 0xb9, 'C','y','r','i','l','l','i','c','_','L','J','E',0,
+0xeb, 0x41, 0x06, 0xb9, 'S','e','r','b','i','a','n','_','L','J','E',0,
+0xb2, 0x59, 0x06, 0xba, 'C','y','r','i','l','l','i','c','_','N','J','E',0,
+0xeb, 0x49, 0x06, 0xba, 'S','e','r','b','i','a','n','_','N','J','E',0,
+0xd7, 0x31, 0x06, 0xbb, 'S','e','r','b','i','a','n','_','T','S','H','E',0,
+0xfd, 0x2d, 0x06, 0xbc, 'M','a','c','e','d','o','n','i','a','_','K','J','E',0,
+0x1a, 0x46, 0x06, 0xbd, 'U','k','r','a','i','n','i','a','n','_','G','H','E','_','W','I','T','H','_','U','P','T','U','R','N',0,
+0x49, 0x5d, 0x06, 0xbe, 'B','y','e','l','o','r','u','s','s','i','a','n','_','S','H','O','R','T','U',0,
+0x64, 0xed, 0x06, 0xbf, 'C','y','r','i','l','l','i','c','_','D','Z','H','E',0,
+0xeb, 0x41, 0x06, 0xbf, 'S','e','r','b','i','a','n','_','D','Z','E',0,
+0xd9, 0x8b, 0x06, 0xc0, 'C','y','r','i','l','l','i','c','_','y','u',0,
+0x6c, 0x73, 0x06, 0xc1, 'C','y','r','i','l','l','i','c','_','a',0,
+0xd9, 0x4d, 0x06, 0xc2, 'C','y','r','i','l','l','i','c','_','b','e',0,
+0xb3, 0x63, 0x06, 0xc3, 'C','y','r','i','l','l','i','c','_','t','s','e',0,
+0xd9, 0x51, 0x06, 0xc4, 'C','y','r','i','l','l','i','c','_','d','e',0,
+0xd9, 0x5b, 0x06, 0xc5, 'C','y','r','i','l','l','i','c','_','i','e',0,
+0xd9, 0x54, 0x06, 0xc6, 'C','y','r','i','l','l','i','c','_','e','f',0,
+0xb3, 0x19, 0x06, 0xc7, 'C','y','r','i','l','l','i','c','_','g','h','e',0,
+0xd9, 0x55, 0x06, 0xc8, 'C','y','r','i','l','l','i','c','_','h','a',0,
+0x6c, 0x7b, 0x06, 0xc9, 'C','y','r','i','l','l','i','c','_','i',0,
+0x9d, 0xb1, 0x06, 0xca, 'C','y','r','i','l','l','i','c','_','s','h','o','r','t','i',0,
+0xd9, 0x5b, 0x06, 0xcb, 'C','y','r','i','l','l','i','c','_','k','a',0,
+0xd9, 0x5a, 0x06, 0xcc, 'C','y','r','i','l','l','i','c','_','e','l',0,
+0xd9, 0x5b, 0x06, 0xcd, 'C','y','r','i','l','l','i','c','_','e','m',0,
+0xd9, 0x5c, 0x06, 0xce, 'C','y','r','i','l','l','i','c','_','e','n',0,
+0x6c, 0x81, 0x06, 0xcf, 'C','y','r','i','l','l','i','c','_','o',0,
+0xd9, 0x69, 0x06, 0xd0, 'C','y','r','i','l','l','i','c','_','p','e',0,
+0xd9, 0x77, 0x06, 0xd1, 'C','y','r','i','l','l','i','c','_','y','a',0,
+0xd9, 0x60, 0x06, 0xd2, 'C','y','r','i','l','l','i','c','_','e','r',0,
+0xd9, 0x61, 0x06, 0xd3, 'C','y','r','i','l','l','i','c','_','e','s',0,
+0xd9, 0x71, 0x06, 0xd4, 'C','y','r','i','l','l','i','c','_','t','e',0,
+0x6c, 0x87, 0x06, 0xd5, 'C','y','r','i','l','l','i','c','_','u',0,
+0xb3, 0x65, 0x06, 0xd6, 'C','y','r','i','l','l','i','c','_','z','h','e',0,
+0xd9, 0x75, 0x06, 0xd7, 'C','y','r','i','l','l','i','c','_','v','e',0,
+0x78, 0xb8, 0x06, 0xd8, 'C','y','r','i','l','l','i','c','_','s','o','f','t','s','i','g','n',0,
+0x67, 0x45, 0x06, 0xd9, 'C','y','r','i','l','l','i','c','_','y','e','r','u',0,
+0xd9, 0x7d, 0x06, 0xda, 'C','y','r','i','l','l','i','c','_','z','e',0,
+0xb3, 0x45, 0x06, 0xdb, 'C','y','r','i','l','l','i','c','_','s','h','a',0,
+0x6c, 0x77, 0x06, 0xdc, 'C','y','r','i','l','l','i','c','_','e',0,
+0xce, 0x4d, 0x06, 0xdd, 'C','y','r','i','l','l','i','c','_','s','h','c','h','a',0,
+0xb3, 0x09, 0x06, 0xde, 'C','y','r','i','l','l','i','c','_','c','h','e',0,
+0x70, 0x38, 0x06, 0xdf, 'C','y','r','i','l','l','i','c','_','h','a','r','d','s','i','g','n',0,
+0xd9, 0x2b, 0x06, 0xe0, 'C','y','r','i','l','l','i','c','_','Y','U',0,
+0x6c, 0x53, 0x06, 0xe1, 'C','y','r','i','l','l','i','c','_','A',0,
+0xd8, 0xed, 0x06, 0xe2, 'C','y','r','i','l','l','i','c','_','B','E',0,
+0xb2, 0x83, 0x06, 0xe3, 'C','y','r','i','l','l','i','c','_','T','S','E',0,
+0xd8, 0xf1, 0x06, 0xe4, 'C','y','r','i','l','l','i','c','_','D','E',0,
+0xd8, 0xfb, 0x06, 0xe5, 'C','y','r','i','l','l','i','c','_','I','E',0,
+0xd8, 0xf4, 0x06, 0xe6, 'C','y','r','i','l','l','i','c','_','E','F',0,
+0xb2, 0x39, 0x06, 0xe7, 'C','y','r','i','l','l','i','c','_','G','H','E',0,
+0xd8, 0xf5, 0x06, 0xe8, 'C','y','r','i','l','l','i','c','_','H','A',0,
+0x6c, 0x5b, 0x06, 0xe9, 'C','y','r','i','l','l','i','c','_','I',0,
+0x95, 0xd1, 0x06, 0xea, 'C','y','r','i','l','l','i','c','_','S','H','O','R','T','I',0,
+0xd8, 0xfb, 0x06, 0xeb, 'C','y','r','i','l','l','i','c','_','K','A',0,
+0xd8, 0xfa, 0x06, 0xec, 'C','y','r','i','l','l','i','c','_','E','L',0,
+0xd8, 0xfb, 0x06, 0xed, 'C','y','r','i','l','l','i','c','_','E','M',0,
+0xd8, 0xfc, 0x06, 0xee, 'C','y','r','i','l','l','i','c','_','E','N',0,
+0x6c, 0x61, 0x06, 0xef, 'C','y','r','i','l','l','i','c','_','O',0,
+0xd9, 0x09, 0x06, 0xf0, 'C','y','r','i','l','l','i','c','_','P','E',0,
+0xd9, 0x17, 0x06, 0xf1, 'C','y','r','i','l','l','i','c','_','Y','A',0,
+0xd9, 0x00, 0x06, 0xf2, 'C','y','r','i','l','l','i','c','_','E','R',0,
+0xd9, 0x01, 0x06, 0xf3, 'C','y','r','i','l','l','i','c','_','E','S',0,
+0xd9, 0x11, 0x06, 0xf4, 'C','y','r','i','l','l','i','c','_','T','E',0,
+0x6c, 0x67, 0x06, 0xf5, 'C','y','r','i','l','l','i','c','_','U',0,
+0xb2, 0x85, 0x06, 0xf6, 'C','y','r','i','l','l','i','c','_','Z','H','E',0,
+0xd9, 0x15, 0x06, 0xf7, 'C','y','r','i','l','l','i','c','_','V','E',0,
+0x58, 0xd8, 0x06, 0xf8, 'C','y','r','i','l','l','i','c','_','S','O','F','T','S','I','G','N',0,
+0x65, 0x65, 0x06, 0xf9, 'C','y','r','i','l','l','i','c','_','Y','E','R','U',0,
+0xd9, 0x1d, 0x06, 0xfa, 'C','y','r','i','l','l','i','c','_','Z','E',0,
+0xb2, 0x65, 0x06, 0xfb, 'C','y','r','i','l','l','i','c','_','S','H','A',0,
+0x6c, 0x57, 0x06, 0xfc, 'C','y','r','i','l','l','i','c','_','E',0,
+0xca, 0x6d, 0x06, 0xfd, 'C','y','r','i','l','l','i','c','_','S','H','C','H','A',0,
+0xb2, 0x29, 0x06, 0xfe, 'C','y','r','i','l','l','i','c','_','C','H','E',0,
+0x50, 0x58, 0x06, 0xff, 'C','y','r','i','l','l','i','c','_','H','A','R','D','S','I','G','N',0,
+0xc0, 0x8c, 0x07, 0xa1, 'G','r','e','e','k','_','A','L','P','H','A','a','c','c','e','n','t',0,
+0x6d, 0x4c, 0x07, 0xa2, 'G','r','e','e','k','_','E','P','S','I','L','O','N','a','c','c','e','n','t',0,
+0x79, 0x8c, 0x07, 0xa3, 'G','r','e','e','k','_','E','T','A','a','c','c','e','n','t',0,
+0xf7, 0x8c, 0x07, 0xa4, 'G','r','e','e','k','_','I','O','T','A','a','c','c','e','n','t',0,
+0xe3, 0x39, 0x07, 0xa5, 'G','r','e','e','k','_','I','O','T','A','d','i','e','r','e','s','i','s',0,
+0xc7, 0x4c, 0x07, 0xa7, 'G','r','e','e','k','_','O','M','I','C','R','O','N','a','c','c','e','n','t',0,
+0x6d, 0x4c, 0x07, 0xa8, 'G','r','e','e','k','_','U','P','S','I','L','O','N','a','c','c','e','n','t',0,
+0xba, 0x39, 0x07, 0xa9, 'G','r','e','e','k','_','U','P','S','I','L','O','N','d','i','e','r','e','s','i','s',0,
+0xef, 0x0c, 0x07, 0xab, 'G','r','e','e','k','_','O','M','E','G','A','a','c','c','e','n','t',0,
+0xf2, 0x39, 0x07, 0xae, 'G','r','e','e','k','_','a','c','c','e','n','t','d','i','e','r','e','s','i','s',0,
+0x5c, 0x1c, 0x07, 0xaf, 'G','r','e','e','k','_','h','o','r','i','z','b','a','r',0,
+0xb8, 0x8c, 0x07, 0xb1, 'G','r','e','e','k','_','a','l','p','h','a','a','c','c','e','n','t',0,
+0x65, 0x4c, 0x07, 0xb2, 'G','r','e','e','k','_','e','p','s','i','l','o','n','a','c','c','e','n','t',0,
+0xb1, 0x8c, 0x07, 0xb3, 'G','r','e','e','k','_','e','t','a','a','c','c','e','n','t',0,
+0x6f, 0x8c, 0x07, 0xb4, 'G','r','e','e','k','_','i','o','t','a','a','c','c','e','n','t',0,
+0xc3, 0x39, 0x07, 0xb5, 'G','r','e','e','k','_','i','o','t','a','d','i','e','r','e','s','i','s',0,
+0xf2, 0x39, 0x07, 0xb6, 'G','r','e','e','k','_','i','o','t','a','a','c','c','e','n','t','d','i','e','r','e','s','i','s',0,
+0xbf, 0x4c, 0x07, 0xb7, 'G','r','e','e','k','_','o','m','i','c','r','o','n','a','c','c','e','n','t',0,
+0x65, 0x4c, 0x07, 0xb8, 'G','r','e','e','k','_','u','p','s','i','l','o','n','a','c','c','e','n','t',0,
+0x9a, 0x39, 0x07, 0xb9, 'G','r','e','e','k','_','u','p','s','i','l','o','n','d','i','e','r','e','s','i','s',0,
+0xb2, 0x39, 0x07, 0xba, 'G','r','e','e','k','_','u','p','s','i','l','o','n','a','c','c','e','n','t','d','i','e','r','e','s','i','s',0,
+0xe7, 0x0c, 0x07, 0xbb, 'G','r','e','e','k','_','o','m','e','g','a','a','c','c','e','n','t',0,
+0xc6, 0xa1, 0x07, 0xc1, 'G','r','e','e','k','_','A','L','P','H','A',0,
+0x63, 0x1d, 0x07, 0xc2, 'G','r','e','e','k','_','B','E','T','A',0,
+0xc6, 0xa7, 0x07, 0xc3, 'G','r','e','e','k','_','G','A','M','M','A',0,
+0xc6, 0xa1, 0x07, 0xc4, 'G','r','e','e','k','_','D','E','L','T','A',0,
+0x1d, 0x54, 0x07, 0xc5, 'G','r','e','e','k','_','E','P','S','I','L','O','N',0,
+0x63, 0xdd, 0x07, 0xc6, 'G','r','e','e','k','_','Z','E','T','A',0,
+0xb1, 0x85, 0x07, 0xc7, 'G','r','e','e','k','_','E','T','A',0,
+0xc7, 0x9d, 0x07, 0xc8, 'G','r','e','e','k','_','T','H','E','T','A',0,
+0x63, 0x7d, 0x07, 0xc9, 'G','r','e','e','k','_','I','O','T','A',0,
+0xc6, 0xf9, 0x07, 0xca, 'G','r','e','e','k','_','K','A','P','P','A',0,
+0xc6, 0xe5, 0x07, 0xcb, 'G','r','e','e','k','_','L','A','M','D','A',0,
+0x8e, 0x09, 0x07, 0xcb, 'G','r','e','e','k','_','L','A','M','B','D','A',0,
+0x58, 0xb3, 0x07, 0xcc, 'G','r','e','e','k','_','M','U',0,
+0x58, 0xb5, 0x07, 0xcd, 'G','r','e','e','k','_','N','U',0,
+0x58, 0xbd, 0x07, 0xce, 'G','r','e','e','k','_','X','I',0,
+0x1e, 0xbc, 0x07, 0xcf, 'G','r','e','e','k','_','O','M','I','C','R','O','N',0,
+0x58, 0xad, 0x07, 0xd0, 'G','r','e','e','k','_','P','I',0,
+0xb1, 0xaf, 0x07, 0xd1, 'G','r','e','e','k','_','R','H','O',0,
+0xc7, 0x8f, 0x07, 0xd2, 'G','r','e','e','k','_','S','I','G','M','A',0,
+0xb1, 0xaf, 0x07, 0xd4, 'G','r','e','e','k','_','T','A','U',0,
+0x21, 0x54, 0x07, 0xd5, 'G','r','e','e','k','_','U','P','S','I','L','O','N',0,
+0xb1, 0xa1, 0x07, 0xd6, 'G','r','e','e','k','_','P','H','I',0,
+0xb1, 0x6d, 0x07, 0xd7, 'G','r','e','e','k','_','C','H','I',0,
+0xb1, 0xb7, 0x07, 0xd8, 'G','r','e','e','k','_','P','S','I',0,
+0xc7, 0x5b, 0x07, 0xd9, 'G','r','e','e','k','_','O','M','E','G','A',0,
+0xca, 0x81, 0x07, 0xe1, 'G','r','e','e','k','_','a','l','p','h','a',0,
+0x64, 0xfd, 0x07, 0xe2, 'G','r','e','e','k','_','b','e','t','a',0,
+0xca, 0x87, 0x07, 0xe3, 'G','r','e','e','k','_','g','a','m','m','a',0,
+0xca, 0x81, 0x07, 0xe4, 'G','r','e','e','k','_','d','e','l','t','a',0,
+0x2d, 0x34, 0x07, 0xe5, 'G','r','e','e','k','_','e','p','s','i','l','o','n',0,
+0x65, 0xbd, 0x07, 0xe6, 'G','r','e','e','k','_','z','e','t','a',0,
+0xb2, 0x65, 0x07, 0xe7, 'G','r','e','e','k','_','e','t','a',0,
+0xcb, 0x7d, 0x07, 0xe8, 'G','r','e','e','k','_','t','h','e','t','a',0,
+0x65, 0x5d, 0x07, 0xe9, 'G','r','e','e','k','_','i','o','t','a',0,
+0xca, 0xd9, 0x07, 0xea, 'G','r','e','e','k','_','k','a','p','p','a',0,
+0xca, 0xc5, 0x07, 0xeb, 'G','r','e','e','k','_','l','a','m','d','a',0,
+0x95, 0xe9, 0x07, 0xeb, 'G','r','e','e','k','_','l','a','m','b','d','a',0,
+0x59, 0x13, 0x07, 0xec, 'G','r','e','e','k','_','m','u',0,
+0x59, 0x15, 0x07, 0xed, 'G','r','e','e','k','_','n','u',0,
+0x59, 0x1d, 0x07, 0xee, 'G','r','e','e','k','_','x','i',0,
+0x2e, 0x9c, 0x07, 0xef, 'G','r','e','e','k','_','o','m','i','c','r','o','n',0,
+0x59, 0x0d, 0x07, 0xf0, 'G','r','e','e','k','_','p','i',0,
+0xb2, 0x8f, 0x07, 0xf1, 'G','r','e','e','k','_','r','h','o',0,
+0xcb, 0x6f, 0x07, 0xf2, 'G','r','e','e','k','_','s','i','g','m','a',0,
+0x71, 0x4f, 0x07, 0xf3, 'G','r','e','e','k','_','f','i','n','a','l','s','m','a','l','l','s','i','g','m','a',0,
+0xb2, 0x8f, 0x07, 0xf4, 'G','r','e','e','k','_','t','a','u',0,
+0x31, 0x34, 0x07, 0xf5, 'G','r','e','e','k','_','u','p','s','i','l','o','n',0,
+0xb2, 0x81, 0x07, 0xf6, 'G','r','e','e','k','_','p','h','i',0,
+0xb2, 0x4d, 0x07, 0xf7, 'G','r','e','e','k','_','c','h','i',0,
+0xb2, 0x97, 0x07, 0xf8, 'G','r','e','e','k','_','p','s','i',0,
+0xcb, 0x3b, 0x07, 0xf9, 'G','r','e','e','k','_','o','m','e','g','a',0,
+0x98, 0x56, 0xff, 0x7e, 'G','r','e','e','k','_','s','w','i','t','c','h',0,
+0x4e, 0xe2, 0x08, 0xa1, 'l','e','f','t','r','a','d','i','c','a','l',0,
+0x3e, 0xe2, 0x08, 0xa2, 't','o','p','l','e','f','t','r','a','d','i','c','a','l',0,
+0xe8, 0x48, 0x08, 0xa3, 'h','o','r','i','z','c','o','n','n','e','c','t','o','r',0,
+0x88, 0xfe, 0x08, 0xa4, 't','o','p','i','n','t','e','g','r','a','l',0,
+0x44, 0xfe, 0x08, 0xa5, 'b','o','t','i','n','t','e','g','r','a','l',0,
+0x08, 0x48, 0x08, 0xa6, 'v','e','r','t','c','o','n','n','e','c','t','o','r',0,
+0x06, 0x52, 0x08, 0xa7, 't','o','p','l','e','f','t','s','q','b','r','a','c','k','e','t',0,
+0x86, 0x52, 0x08, 0xa8, 'b','o','t','l','e','f','t','s','q','b','r','a','c','k','e','t',0,
+0xee, 0x52, 0x08, 0xa9, 't','o','p','r','i','g','h','t','s','q','b','r','a','c','k','e','t',0,
+0xee, 0x52, 0x08, 0xaa, 'b','o','t','r','i','g','h','t','s','q','b','r','a','c','k','e','t',0,
+0x1f, 0x83, 0x08, 0xab, 't','o','p','l','e','f','t','p','a','r','e','n','s',0,
+0x0f, 0x83, 0x08, 0xac, 'b','o','t','l','e','f','t','p','a','r','e','n','s',0,
+0x5c, 0x83, 0x08, 0xad, 't','o','p','r','i','g','h','t','p','a','r','e','n','s',0,
+0x3c, 0x83, 0x08, 0xae, 'b','o','t','r','i','g','h','t','p','a','r','e','n','s',0,
+0x1e, 0x7f, 0x08, 0xaf, 'l','e','f','t','m','i','d','d','l','e','c','u','r','l','y','b','r','a','c','e',0,
+0x1e, 0x7f, 0x08, 0xb0, 'r','i','g','h','t','m','i','d','d','l','e','c','u','r','l','y','b','r','a','c','e',0,
+0x0b, 0x00, 0x08, 0xb1, 't','o','p','l','e','f','t','s','u','m','m','a','t','i','o','n',0,
+0x8b, 0x00, 0x08, 0xb2, 'b','o','t','l','e','f','t','s','u','m','m','a','t','i','o','n',0,
+0xd0, 0x48, 0x08, 0xb3, 't','o','p','v','e','r','t','s','u','m','m','a','t','i','o','n','c','o','n','n','e','c','t','o','r',0,
+0xd0, 0x48, 0x08, 0xb4, 'b','o','t','v','e','r','t','s','u','m','m','a','t','i','o','n','c','o','n','n','e','c','t','o','r',0,
+0xf3, 0x00, 0x08, 0xb5, 't','o','p','r','i','g','h','t','s','u','m','m','a','t','i','o','n',0,
+0xf3, 0x00, 0x08, 0xb6, 'b','o','t','r','i','g','h','t','s','u','m','m','a','t','i','o','n',0,
+0x1d, 0x00, 0x08, 0xb7, 'r','i','g','h','t','m','i','d','d','l','e','s','u','m','m','a','t','i','o','n',0,
+0x74, 0xda, 0x08, 0xbc, 'l','e','s','s','t','h','a','n','e','q','u','a','l',0,
+0x6e, 0x1a, 0x08, 0xbd, 'n','o','t','e','q','u','a','l',0,
+0xa2, 0xda, 0x08, 0xbe, 'g','r','e','a','t','e','r','t','h','a','n','e','q','u','a','l',0,
+0x6a, 0xfe, 0x08, 0xbf, 'i','n','t','e','g','r','a','l',0,
+0xdc, 0x05, 0x08, 0xc0, 't','h','e','r','e','f','o','r','e',0,
+0xdc, 0xc0, 0x08, 0xc1, 'v','a','r','i','a','t','i','o','n',0,
+0x69, 0xc5, 0x08, 0xc2, 'i','n','f','i','n','i','t','y',0,
+0x0c, 0xa9, 0x08, 0xc5, 'n','a','b','l','a',0,
+0x44, 0x89, 0x08, 0xc8, 'a','p','p','r','o','x','i','m','a','t','e',0,
+0xe8, 0x5a, 0x08, 0xc9, 's','i','m','i','l','a','r','e','q','u','a','l',0,
+0x69, 0x3c, 0x08, 0xcd, 'i','f','o','n','l','y','i','f',0,
+0x35, 0x21, 0x08, 0xce, 'i','m','p','l','i','e','s',0,
+0xcf, 0x42, 0x08, 0xcf, 'i','d','e','n','t','i','c','a','l',0,
+0x34, 0xe2, 0x08, 0xd6, 'r','a','d','i','c','a','l',0,
+0xa7, 0x58, 0x08, 0xda, 'i','n','c','l','u','d','e','d','i','n',0,
+0x69, 0x95, 0x08, 0xdb, 'i','n','c','l','u','d','e','s',0,
+0xbc, 0x20, 0x08, 0xdc, 'i','n','t','e','r','s','e','c','t','i','o','n',0,
+0x0d, 0xb0, 0x08, 0xdd, 'u','n','i','o','n',0,
+0xad, 0x54, 0x08, 0xde, 'l','o','g','i','c','a','l','a','n','d',0,
+0xd6, 0x98, 0x08, 0xdf, 'l','o','g','i','c','a','l','o','r',0,
+0x63, 0xa5, 0x08, 0xef, 'p','a','r','t','i','a','l','d','e','r','i','v','a','t','i','v','e',0,
+0x6a, 0xc0, 0x08, 0xf6, 'f','u','n','c','t','i','o','n',0,
+0xd3, 0x3d, 0x08, 0xfb, 'l','e','f','t','a','r','r','o','w',0,
+0x37, 0xfd, 0x08, 0xfc, 'u','p','a','r','r','o','w',0,
+0xb5, 0xbd, 0x08, 0xfd, 'r','i','g','h','t','a','r','r','o','w',0,
+0xd3, 0xbd, 0x08, 0xfe, 'd','o','w','n','a','r','r','o','w',0,
+0x0c, 0x4b, 0x09, 0xdf, 'b','l','a','n','k',0,
+0xf9, 0x94, 0x09, 0xe0, 's','o','l','i','d','d','i','a','m','o','n','d',0,
+0x4e, 0x64, 0x09, 0xe1, 'c','h','e','c','k','e','r','b','o','a','r','d',0,
+0x01, 0x44, 0x09, 0xe2, 'h','t',0,
+0x01, 0x32, 0x09, 0xe3, 'f','f',0,
+0x01, 0x38, 0x09, 0xe4, 'c','r',0,
+0x01, 0x3e, 0x09, 0xe5, 'l','f',0,
+0x01, 0x48, 0x09, 0xe8, 'n','l',0,
+0x01, 0x60, 0x09, 0xe9, 'v','t',0,
+0x93, 0xd4, 0x09, 0xea, 'l','o','w','r','i','g','h','t','c','o','r','n','e','r',0,
+0x3b, 0xd4, 0x09, 0xeb, 'u','p','r','i','g','h','t','c','o','r','n','e','r',0,
+0x0e, 0xd4, 0x09, 0xec, 'u','p','l','e','f','t','c','o','r','n','e','r',0,
+0xba, 0xd4, 0x09, 0xed, 'l','o','w','l','e','f','t','c','o','r','n','e','r',0,
+0x3e, 0xdd, 0x09, 0xee, 'c','r','o','s','s','i','n','g','l','i','n','e','s',0,
+0xed, 0x79, 0x09, 0xef, 'h','o','r','i','z','l','i','n','e','s','c','a','n','1',0,
+0xed, 0x7b, 0x09, 0xf0, 'h','o','r','i','z','l','i','n','e','s','c','a','n','3',0,
+0xed, 0x7d, 0x09, 0xf1, 'h','o','r','i','z','l','i','n','e','s','c','a','n','5',0,
+0xed, 0x7f, 0x09, 0xf2, 'h','o','r','i','z','l','i','n','e','s','c','a','n','7',0,
+0xed, 0x81, 0x09, 0xf3, 'h','o','r','i','z','l','i','n','e','s','c','a','n','9',0,
+0x0c, 0xdc, 0x09, 0xf4, 'l','e','f','t','t',0,
+0x1b, 0x04, 0x09, 0xf5, 'r','i','g','h','t','t',0,
+0x06, 0x28, 0x09, 0xf6, 'b','o','t','t',0,
+0x06, 0xb0, 0x09, 0xf7, 't','o','p','t',0,
+0x37, 0x9c, 0x09, 0xf8, 'v','e','r','t','b','a','r',0,
+0x34, 0x3f, 0x0a, 0xa1, 'e','m','s','p','a','c','e',0,
+0x34, 0x5f, 0x0a, 0xa2, 'e','n','s','p','a','c','e',0,
+0x61, 0x7f, 0x0a, 0xa3, 'e','m','3','s','p','a','c','e',0,
+0x61, 0x9f, 0x0a, 0xa4, 'e','m','4','s','p','a','c','e',0,
+0x9a, 0x9f, 0x0a, 0xa5, 'd','i','g','i','t','s','p','a','c','e',0,
+0xc0, 0x9f, 0x0a, 0xa6, 'p','u','n','c','t','s','p','a','c','e',0,
+0xdd, 0x5f, 0x0a, 0xa7, 't','h','i','n','s','p','a','c','e',0,
+0xce, 0x5f, 0x0a, 0xa8, 'h','a','i','r','s','p','a','c','e',0,
+0x19, 0x62, 0x0a, 0xa9, 'e','m','d','a','s','h',0,
+0x19, 0x72, 0x0a, 0xaa, 'e','n','d','a','s','h',0,
+0x6f, 0x4b, 0x0a, 0xac, 's','i','g','n','i','f','b','l','a','n','k',0,
+0x68, 0x21, 0x0a, 0xae, 'e','l','l','i','p','s','i','s',0,
+0x64, 0x8a, 0x0a, 0xaf, 'd','o','u','b','b','a','s','e','l','i','n','e','d','o','t',0,
+0x6d, 0x0c, 0x0a, 0xb0, 'o','n','e','t','h','i','r','d',0,
+0xe6, 0x8b, 0x0a, 0xb1, 't','w','o','t','h','i','r','d','s',0,
+0x6c, 0x30, 0x0a, 0xb2, 'o','n','e','f','i','f','t','h',0,
+0xe4, 0xd3, 0x0a, 0xb3, 't','w','o','f','i','f','t','h','s',0,
+0x77, 0x53, 0x0a, 0xb4, 't','h','r','e','e','f','i','f','t','h','s',0,
+0xab, 0x93, 0x0a, 0xb5, 'f','o','u','r','f','i','f','t','h','s',0,
+0x6d, 0x48, 0x0a, 0xb6, 'o','n','e','s','i','x','t','h',0,
+0xa5, 0x03, 0x0a, 0xb7, 'f','i','v','e','s','i','x','t','h','s',0,
+0x18, 0xd8, 0x0a, 0xb8, 'c','a','r','e','o','f',0,
+0x33, 0x02, 0x0a, 0xbb, 'f','i','g','d','a','s','h',0,
+0x9f, 0x52, 0x0a, 0xbc, 'l','e','f','t','a','n','g','l','e','b','r','a','c','k','e','t',0,
+0x4c, 0xac, 0x0a, 0xbd, 'd','e','c','i','m','a','l','p','o','i','n','t',0,
+0xdf, 0x52, 0x0a, 0xbe, 'r','i','g','h','t','a','n','g','l','e','b','r','a','c','k','e','t',0,
+0x1a, 0x28, 0x0a, 0xbf, 'm','a','r','k','e','r',0,
+0xd8, 0x98, 0x0a, 0xc3, 'o','n','e','e','i','g','h','t','h',0,
+0xee, 0xa3, 0x0a, 0xc4, 't','h','r','e','e','e','i','g','h','t','h','s',0,
+0x45, 0xa3, 0x0a, 0xc5, 'f','i','v','e','e','i','g','h','t','h','s',0,
+0xe7, 0x23, 0x0a, 0xc6, 's','e','v','e','n','e','i','g','h','t','h','s',0,
+0xde, 0x4b, 0x0a, 0xc9, 't','r','a','d','e','m','a','r','k',0,
+0xc3, 0x0b, 0x0a, 0xca, 's','i','g','n','a','t','u','r','e','m','a','r','k',0,
+0xb4, 0x49, 0x0a, 0xcb, 't','r','a','d','e','m','a','r','k','i','n','c','i','r','c','l','e',0,
+0x1f, 0xf9, 0x0a, 0xcc, 'l','e','f','t','o','p','e','n','t','r','i','a','n','g','l','e',0,
+0x5f, 0xf9, 0x0a, 0xcd, 'r','i','g','h','t','o','p','e','n','t','r','i','a','n','g','l','e',0,
+0x91, 0x49, 0x0a, 0xce, 'e','m','o','p','e','n','c','i','r','c','l','e',0,
+0x98, 0x19, 0x0a, 0xcf, 'e','m','o','p','e','n','r','e','c','t','a','n','g','l','e',0,
+0x54, 0x4b, 0x0a, 0xd0, 'l','e','f','t','s','i','n','g','l','e','q','u','o','t','e','m','a','r','k',0,
+0x54, 0x4b, 0x0a, 0xd1, 'r','i','g','h','t','s','i','n','g','l','e','q','u','o','t','e','m','a','r','k',0,
+0x9c, 0x4b, 0x0a, 0xd2, 'l','e','f','t','d','o','u','b','l','e','q','u','o','t','e','m','a','r','k',0,
+0x9c, 0x4b, 0x0a, 0xd3, 'r','i','g','h','t','d','o','u','b','l','e','q','u','o','t','e','m','a','r','k',0,
+0xed, 0xb0, 0x0a, 0xd4, 'p','r','e','s','c','r','i','p','t','i','o','n',0,
+0x35, 0xf5, 0x0a, 0xd6, 'm','i','n','u','t','e','s',0,
+0x35, 0xfb, 0x0a, 0xd7, 's','e','c','o','n','d','s',0,
+0xa7, 0xd5, 0x0a, 0xd9, 'l','a','t','i','n','c','r','o','s','s',0,
+0x68, 0x7f, 0x0a, 0xda, 'h','e','x','a','g','r','a','m',0,
+0xe9, 0x5e, 0x0a, 0xdb, 'f','i','l','l','e','d','r','e','c','t','b','u','l','l','e','t',0,
+0x09, 0x1e, 0x0a, 0xdc, 'f','i','l','l','e','d','l','e','f','t','t','r','i','b','u','l','l','e','t',0,
+0xf1, 0x1e, 0x0a, 0xdd, 'f','i','l','l','e','d','r','i','g','h','t','t','r','i','b','u','l','l','e','t',0,
+0xec, 0xc9, 0x0a, 0xde, 'e','m','f','i','l','l','e','d','c','i','r','c','l','e',0,
+0x7b, 0x3e, 0x0a, 0xdf, 'e','m','f','i','l','l','e','d','r','e','c','t',0,
+0x5a, 0x9e, 0x0a, 0xe0, 'e','n','o','p','e','n','c','i','r','c','b','u','l','l','e','t',0,
+0x13, 0x1e, 0x0a, 0xe1, 'e','n','o','p','e','n','s','q','u','a','r','e','b','u','l','l','e','t',0,
+0x71, 0x5e, 0x0a, 0xe2, 'o','p','e','n','r','e','c','t','b','u','l','l','e','t',0,
+0x05, 0xd2, 0x0a, 0xe3, 'o','p','e','n','t','r','i','b','u','l','l','e','t','u','p',0,
+0x18, 0x18, 0x0a, 0xe4, 'o','p','e','n','t','r','i','b','u','l','l','e','t','d','o','w','n',0,
+0x6d, 0x9c, 0x0a, 0xe5, 'o','p','e','n','s','t','a','r',0,
+0xd2, 0x9e, 0x0a, 0xe6, 'e','n','f','i','l','l','e','d','c','i','r','c','b','u','l','l','e','t',0,
+0xfd, 0x9e, 0x0a, 0xe7, 'e','n','f','i','l','l','e','d','s','q','b','u','l','l','e','t',0,
+0xf5, 0xd2, 0x0a, 0xe8, 'f','i','l','l','e','d','t','r','i','b','u','l','l','e','t','u','p',0,
+0xd8, 0x18, 0x0a, 0xe9, 'f','i','l','l','e','d','t','r','i','b','u','l','l','e','t','d','o','w','n',0,
+0x50, 0xec, 0x0a, 0xea, 'l','e','f','t','p','o','i','n','t','e','r',0,
+0xda, 0xec, 0x0a, 0xeb, 'r','i','g','h','t','p','o','i','n','t','e','r',0,
+0x06, 0x14, 0x0a, 0xec, 'c','l','u','b',0,
+0x32, 0x94, 0x0a, 0xed, 'd','i','a','m','o','n','d',0,
+0x0c, 0x84, 0x0a, 0xee, 'h','e','a','r','t',0,
+0xa0, 0xb5, 0x0a, 0xf0, 'm','a','l','t','e','s','e','c','r','o','s','s',0,
+0x18, 0xa0, 0x0a, 0xf1, 'd','a','g','g','e','r',0,
+0x8f, 0xe0, 0x0a, 0xf2, 'd','o','u','b','l','e','d','a','g','g','e','r',0,
+0xc9, 0x8b, 0x0a, 0xf3, 'c','h','e','c','k','m','a','r','k',0,
+0x23, 0x15, 0x0a, 0xf4, 'b','a','l','l','o','t','c','r','o','s','s',0,
+0xef, 0x88, 0x0a, 0xf5, 'm','u','s','i','c','a','l','s','h','a','r','p',0,
+0x77, 0x36, 0x0a, 0xf6, 'm','u','s','i','c','a','l','f','l','a','t',0,
+0xa6, 0x6a, 0x0a, 0xf7, 'm','a','l','e','s','y','m','b','o','l',0,
+0x6a, 0x6a, 0x0a, 0xf8, 'f','e','m','a','l','e','s','y','m','b','o','l',0,
+0xdb, 0x5d, 0x0a, 0xf9, 't','e','l','e','p','h','o','n','e',0,
+0xc8, 0xec, 0x0a, 0xfa, 't','e','l','e','p','h','o','n','e','r','e','c','o','r','d','e','r',0,
+0x2a, 0xe8, 0x0a, 0xfb, 'p','h','o','n','o','g','r','a','p','h','c','o','p','y','r','i','g','h','t',0,
+0x0c, 0x3e, 0x0a, 0xfc, 'c','a','r','e','t',0,
+0x7c, 0x4b, 0x0a, 0xfd, 's','i','n','g','l','e','l','o','w','q','u','o','t','e','m','a','r','k',0,
+0xbc, 0x4b, 0x0a, 0xfe, 'd','o','u','b','l','e','l','o','w','q','u','o','t','e','m','a','r','k',0,
+0x1a, 0x5c, 0x0a, 0xff, 'c','u','r','s','o','r',0,
+0xd2, 0xbe, 0x0b, 0xa3, 'l','e','f','t','c','a','r','e','t',0,
+0xb5, 0x3e, 0x0b, 0xa6, 'r','i','g','h','t','c','a','r','e','t',0,
+0xd3, 0x3e, 0x0b, 0xa8, 'd','o','w','n','c','a','r','e','t',0,
+0x37, 0x7e, 0x0b, 0xa9, 'u','p','c','a','r','e','t',0,
+0x37, 0x1c, 0x0b, 0xc0, 'o','v','e','r','b','a','r',0,
+0x69, 0xd5, 0x0b, 0xc2, 'd','o','w','n','t','a','c','k',0,
+0x1c, 0x1b, 0x0b, 0xc3, 'u','p','s','h','o','e',0,
+0xd4, 0xb1, 0x0b, 0xc4, 'd','o','w','n','s','t','i','l','e',0,
+0x6f, 0x1c, 0x0b, 0xc6, 'u','n','d','e','r','b','a','r',0,
+0x02, 0xfa, 0x0b, 0xca, 'j','o','t',0,
+0x06, 0x82, 0x0b, 0xcc, 'q','u','a','d',0,
+0x1b, 0xf5, 0x0b, 0xce, 'u','p','t','a','c','k',0,
+0x19, 0x49, 0x0b, 0xcf, 'c','i','r','c','l','e',0,
+0x38, 0xf1, 0x0b, 0xd3, 'u','p','s','t','i','l','e',0,
+0x69, 0xfb, 0x0b, 0xd6, 'd','o','w','n','s','h','o','e',0,
+0xda, 0xfb, 0x0b, 0xd8, 'r','i','g','h','t','s','h','o','e',0,
+0x69, 0xbb, 0x0b, 0xda, 'l','e','f','t','s','h','o','e',0,
+0x69, 0x95, 0x0b, 0xdc, 'l','e','f','t','t','a','c','k',0,
+0xda, 0xd5, 0x0b, 0xfc, 'r','i','g','h','t','t','a','c','k',0,
+0x45, 0x15, 0x0c, 0xdf, 'h','e','b','r','e','w','_','d','o','u','b','l','e','l','o','w','l','i','n','e',0,
+0x72, 0x6c, 0x0c, 0xe0, 'h','e','b','r','e','w','_','a','l','e','p','h',0,
+0x9c, 0x4e, 0x0c, 0xe1, 'h','e','b','r','e','w','_','b','e','t',0,
+0x39, 0x04, 0x0c, 0xe1, 'h','e','b','r','e','w','_','b','e','t','h',0,
+0x72, 0xc2, 0x0c, 0xe2, 'h','e','b','r','e','w','_','g','i','m','e','l',0,
+0xe6, 0x02, 0x0c, 0xe2, 'h','e','b','r','e','w','_','g','i','m','m','e','l',0,
+0x72, 0x56, 0x0c, 0xe3, 'h','e','b','r','e','w','_','d','a','l','e','t',0,
+0xe5, 0x14, 0x0c, 0xe3, 'h','e','b','r','e','w','_','d','a','l','e','t','h',0,
+0xcd, 0xf9, 0x0c, 0xe4, 'h','e','b','r','e','w','_','h','e',0,
+0x9c, 0x9d, 0x0c, 0xe5, 'h','e','b','r','e','w','_','w','a','w',0,
+0x39, 0xa4, 0x0c, 0xe6, 'h','e','b','r','e','w','_','z','a','i','n',0,
+0x73, 0xec, 0x0c, 0xe6, 'h','e','b','r','e','w','_','z','a','y','i','n',0,
+0x39, 0x06, 0x0c, 0xe7, 'h','e','b','r','e','w','_','c','h','e','t',0,
+0x9c, 0x66, 0x0c, 0xe7, 'h','e','b','r','e','w','_','h','e','t',0,
+0x9c, 0x96, 0x0c, 0xe8, 'h','e','b','r','e','w','_','t','e','t',0,
+0x39, 0x94, 0x0c, 0xe8, 'h','e','b','r','e','w','_','t','e','t','h',0,
+0x9c, 0xae, 0x0c, 0xe9, 'h','e','b','r','e','w','_','y','o','d',0,
+0x31, 0x04, 0x0c, 0xea, 'h','e','b','r','e','w','_','f','i','n','a','l','k','a','p','h',0,
+0x39, 0x34, 0x0c, 0xeb, 'h','e','b','r','e','w','_','k','a','p','h',0,
+0x72, 0xca, 0x0c, 0xec, 'h','e','b','r','e','w','_','l','a','m','e','d',0,
+0x98, 0x5b, 0x0c, 0xed, 'h','e','b','r','e','w','_','f','i','n','a','l','m','e','m',0,
+0x9c, 0x73, 0x0c, 0xee, 'h','e','b','r','e','w','_','m','e','m',0,
+0x98, 0x80, 0x0c, 0xef, 'h','e','b','r','e','w','_','f','i','n','a','l','n','u','n',0,
+0x9c, 0x98, 0x0c, 0xf0, 'h','e','b','r','e','w','_','n','u','n',0,
+0xe6, 0xda, 0x0c, 0xf1, 'h','e','b','r','e','w','_','s','a','m','e','c','h',0,
+0xe6, 0xea, 0x0c, 0xf1, 'h','e','b','r','e','w','_','s','a','m','e','k','h',0,
+0x39, 0x3c, 0x0c, 0xf2, 'h','e','b','r','e','w','_','a','y','i','n',0,
+0xcb, 0xfd, 0x0c, 0xf3, 'h','e','b','r','e','w','_','f','i','n','a','l','p','e',0,
+0xce, 0x09, 0x0c, 0xf4, 'h','e','b','r','e','w','_','p','e',0,
+0x31, 0x61, 0x0c, 0xf5, 'h','e','b','r','e','w','_','f','i','n','a','l','z','a','d','e',0,
+0x31, 0x65, 0x0c, 0xf5, 'h','e','b','r','e','w','_','f','i','n','a','l','z','a','d','i',0,
+0x39, 0x91, 0x0c, 0xf6, 'h','e','b','r','e','w','_','z','a','d','e',0,
+0x39, 0x95, 0x0c, 0xf6, 'h','e','b','r','e','w','_','z','a','d','i',0,
+0x39, 0x9c, 0x0c, 0xf7, 'h','e','b','r','e','w','_','q','o','p','h',0,
+0x9c, 0x84, 0x0c, 0xf7, 'h','e','b','r','e','w','_','k','u','f',0,
+0x39, 0x82, 0x0c, 0xf8, 'h','e','b','r','e','w','_','r','e','s','h',0,
+0x39, 0x88, 0x0c, 0xf9, 'h','e','b','r','e','w','_','s','h','i','n',0,
+0x9c, 0x91, 0x0c, 0xfa, 'h','e','b','r','e','w','_','t','a','w',0,
+0x9c, 0x80, 0x0c, 0xfa, 'h','e','b','r','e','w','_','t','a','f',0,
+0xe8, 0x56, 0xff, 0x7e, 'H','e','b','r','e','w','_','s','w','i','t','c','h',0,
+0x73, 0x9f, 0x0d, 0xa1, 'T','h','a','i','_','k','o','k','a','i',0,
+0xcf, 0x53, 0x0d, 0xa2, 'T','h','a','i','_','k','h','o','k','h','a','i',0,
+0x9f, 0x5a, 0x0d, 0xa3, 'T','h','a','i','_','k','h','o','k','h','u','a','t',0,
+0x9f, 0x57, 0x0d, 0xa4, 'T','h','a','i','_','k','h','o','k','h','w','a','i',0,
+0xcf, 0x74, 0x0d, 0xa5, 'T','h','a','i','_','k','h','o','k','h','o','n',0,
+0x7e, 0xd7, 0x0d, 0xa6, 'T','h','a','i','_','k','h','o','r','a','k','h','a','n','g',0,
+0xe7, 0xe3, 0x0d, 0xa7, 'T','h','a','i','_','n','g','o','n','g','u',0,
+0xcd, 0x18, 0x0d, 0xa8, 'T','h','a','i','_','c','h','o','c','h','a','n',0,
+0x9a, 0xb7, 0x0d, 0xa9, 'T','h','a','i','_','c','h','o','c','h','i','n','g',0,
+0x9a, 0x97, 0x0d, 0xaa, 'T','h','a','i','_','c','h','o','c','h','a','n','g',0,
+0xb9, 0xf9, 0x0d, 0xab, 'T','h','a','i','_','s','o','s','o',0,
+0xcd, 0x2b, 0x0d, 0xac, 'T','h','a','i','_','c','h','o','c','h','o','e',0,
+0xe9, 0xff, 0x0d, 0xad, 'T','h','a','i','_','y','o','y','i','n','g',0,
+0xcd, 0x7d, 0x0d, 0xae, 'T','h','a','i','_','d','o','c','h','a','d','a',0,
+0xd2, 0x65, 0x0d, 0xaf, 'T','h','a','i','_','t','o','p','a','t','a','k',0,
+0xd1, 0xe0, 0x0d, 0xb0, 'T','h','a','i','_','t','h','o','t','h','a','n',0,
+0x84, 0xcf, 0x0d, 0xb1, 'T','h','a','i','_','t','h','o','n','a','n','g','m','o','n','t','h','o',0,
+0x92, 0x41, 0x0d, 0xb2, 'T','h','a','i','_','t','h','o','p','h','u','t','h','a','o',0,
+0x73, 0xe8, 0x0d, 0xb3, 'T','h','a','i','_','n','o','n','e','n',0,
+0x73, 0x1d, 0x0d, 0xb4, 'T','h','a','i','_','d','o','d','e','k',0,
+0x74, 0x59, 0x0d, 0xb5, 'T','h','a','i','_','t','o','t','a','o',0,
+0xa4, 0x77, 0x0d, 0xb6, 'T','h','a','i','_','t','h','o','t','h','u','n','g',0,
+0x48, 0x98, 0x0d, 0xb7, 'T','h','a','i','_','t','h','o','t','h','a','h','a','n',0,
+0xa4, 0x5f, 0x0d, 0xb8, 'T','h','a','i','_','t','h','o','t','h','o','n','g',0,
+0xb9, 0xcd, 0x0d, 0xb9, 'T','h','a','i','_','n','o','n','u',0,
+0x9a, 0x37, 0x0d, 0xba, 'T','h','a','i','_','b','o','b','a','i','m','a','i',0,
+0x74, 0x11, 0x0d, 0xbb, 'T','h','a','i','_','p','o','p','l','a',0,
+0xa2, 0x37, 0x0d, 0xbc, 'T','h','a','i','_','p','h','o','p','h','u','n','g',0,
+0xb9, 0x69, 0x0d, 0xbd, 'T','h','a','i','_','f','o','f','a',0,
+0xd0, 0xc0, 0x0d, 0xbe, 'T','h','a','i','_','p','h','o','p','h','a','n',0,
+0x73, 0x40, 0x0d, 0xbf, 'T','h','a','i','_','f','o','f','a','n',0,
+0x89, 0x81, 0x0d, 0xc0, 'T','h','a','i','_','p','h','o','s','a','m','p','h','a','o',0,
+0xb9, 0xaf, 0x0d, 0xc1, 'T','h','a','i','_','m','o','m','a',0,
+0x74, 0xb9, 0x0d, 0xc2, 'T','h','a','i','_','y','o','y','a','k',0,
+0x74, 0x4b, 0x0d, 0xc3, 'T','h','a','i','_','r','o','r','u','a',0,
+0x2e, 0x2d, 0x0d, 0xc4, 'T','h','a','i','_','r','u',0,
+0xe7, 0xf7, 0x0d, 0xc5, 'T','h','a','i','_','l','o','l','i','n','g',0,
+0x2e, 0x21, 0x0d, 0xc6, 'T','h','a','i','_','l','u',0,
+0xe9, 0x84, 0x0d, 0xc7, 'T','h','a','i','_','w','o','w','a','e','n',0,
+0xe8, 0xe5, 0x0d, 0xc8, 'T','h','a','i','_','s','o','s','a','l','a',0,
+0xe9, 0x43, 0x0d, 0xc9, 'T','h','a','i','_','s','o','r','u','s','i',0,
+0x74, 0x5f, 0x0d, 0xca, 'T','h','a','i','_','s','o','s','u','a',0,
+0x73, 0x7a, 0x0d, 0xcb, 'T','h','a','i','_','h','o','h','i','p',0,
+0xcf, 0xdd, 0x0d, 0xcc, 'T','h','a','i','_','l','o','c','h','u','l','a',0,
+0xb9, 0x8f, 0x0d, 0xcd, 'T','h','a','i','_','o','a','n','g',0,
+0x9f, 0xbd, 0x0d, 0xce, 'T','h','a','i','_','h','o','n','o','k','h','u','k',0,
+0x40, 0x5f, 0x0d, 0xcf, 'T','h','a','i','_','p','a','i','y','a','n','n','o','i',0,
+0x73, 0xc3, 0x0d, 0xd0, 'T','h','a','i','_','s','a','r','a','a',0,
+0x76, 0x6a, 0x0d, 0xd1, 'T','h','a','i','_','m','a','i','h','a','n','a','k','a','t',0,
+0xe7, 0xe7, 0x0d, 0xd2, 'T','h','a','i','_','s','a','r','a','a','a',0,
+0xe7, 0xf3, 0x0d, 0xd3, 'T','h','a','i','_','s','a','r','a','a','m',0,
+0x73, 0xcb, 0x0d, 0xd4, 'T','h','a','i','_','s','a','r','a','i',0,
+0xe7, 0xff, 0x0d, 0xd5, 'T','h','a','i','_','s','a','r','a','i','i',0,
+0xe8, 0x13, 0x0d, 0xd6, 'T','h','a','i','_','s','a','r','a','u','e',0,
+0xd0, 0x8b, 0x0d, 0xd7, 'T','h','a','i','_','s','a','r','a','u','e','e',0,
+0x73, 0xd7, 0x0d, 0xd8, 'T','h','a','i','_','s','a','r','a','u',0,
+0xe8, 0x23, 0x0d, 0xd9, 'T','h','a','i','_','s','a','r','a','u','u',0,
+0xd0, 0x95, 0x0d, 0xda, 'T','h','a','i','_','p','h','i','n','t','h','u',0,
+0x66, 0xc7, 0x0d, 0xde, 'T','h','a','i','_','m','a','i','h','a','n','a','k','a','t','_','m','a','i','t','h','o',0,
+0xb9, 0x28, 0x0d, 0xdf, 'T','h','a','i','_','b','a','h','t',0,
+0x73, 0xc7, 0x0d, 0xe0, 'T','h','a','i','_','s','a','r','a','e',0,
+0xe7, 0xeb, 0x0d, 0xe1, 'T','h','a','i','_','s','a','r','a','a','e',0,
+0x73, 0xd1, 0x0d, 0xe2, 'T','h','a','i','_','s','a','r','a','o',0,
+0x2b, 0xdc, 0x0d, 0xe3, 'T','h','a','i','_','s','a','r','a','a','i','m','a','i','m','u','a','n',0,
+0x57, 0x93, 0x0d, 0xe4, 'T','h','a','i','_','s','a','r','a','a','i','m','a','i','m','a','l','a','i',0,
+0xed, 0xcd, 0x0d, 0xe5, 'T','h','a','i','_','l','a','k','k','h','a','n','g','y','a','o',0,
+0x9e, 0x75, 0x0d, 0xe6, 'T','h','a','i','_','m','a','i','y','a','m','o','k',0,
+0x3c, 0x89, 0x0d, 0xe7, 'T','h','a','i','_','m','a','i','t','a','i','k','h','u',0,
+0x73, 0x51, 0x0d, 0xe8, 'T','h','a','i','_','m','a','i','e','k',0,
+0xe7, 0x47, 0x0d, 0xe9, 'T','h','a','i','_','m','a','i','t','h','o',0,
+0xe7, 0x55, 0x0d, 0xea, 'T','h','a','i','_','m','a','i','t','r','i',0,
+0xec, 0x53, 0x0d, 0xeb, 'T','h','a','i','_','m','a','i','c','h','a','t','t','a','w','a',0,
+0x16, 0x3e, 0x0d, 0xec, 'T','h','a','i','_','t','h','a','n','t','h','a','k','h','a','t',0,
+0xa0, 0x0e, 0x0d, 0xed, 'T','h','a','i','_','n','i','k','h','a','h','i','t',0,
+0xe7, 0x8c, 0x0d, 0xf0, 'T','h','a','i','_','l','e','k','s','u','n',0,
+0xcf, 0x57, 0x0d, 0xf1, 'T','h','a','i','_','l','e','k','n','u','n','g',0,
+0xcf, 0x67, 0x0d, 0xf2, 'T','h','a','i','_','l','e','k','s','o','n','g',0,
+0xe7, 0x63, 0x0d, 0xf3, 'T','h','a','i','_','l','e','k','s','a','m',0,
+0x73, 0x83, 0x0d, 0xf4, 'T','h','a','i','_','l','e','k','s','i',0,
+0x73, 0x65, 0x0d, 0xf5, 'T','h','a','i','_','l','e','k','h','a',0,
+0xe7, 0x51, 0x0d, 0xf6, 'T','h','a','i','_','l','e','k','h','o','k',0,
+0xce, 0xc6, 0x0d, 0xf7, 'T','h','a','i','_','l','e','k','c','h','e','t',0,
+0xcf, 0x12, 0x0d, 0xf8, 'T','h','a','i','_','l','e','k','p','a','e','t',0,
+0xe7, 0x45, 0x0d, 0xf9, 'T','h','a','i','_','l','e','k','k','a','o',0,
+0x15, 0x72, 0xff, 0x31, 'H','a','n','g','u','l',0,
+0x74, 0x0c, 0xff, 0x32, 'H','a','n','g','u','l','_','S','t','a','r','t',0,
+0x5c, 0x6c, 0xff, 0x33, 'H','a','n','g','u','l','_','E','n','d',0,
+0x72, 0xd5, 0xff, 0x34, 'H','a','n','g','u','l','_','H','a','n','j','a',0,
+0xb9, 0x4d, 0xff, 0x35, 'H','a','n','g','u','l','_','J','a','m','o',0,
+0xe8, 0x11, 0xff, 0x36, 'H','a','n','g','u','l','_','R','o','m','a','j','a',0,
+0x33, 0x3e, 0xff, 0x37, 'H','a','n','g','u','l','_','C','o','d','e','i','n','p','u','t',0,
+0xe6, 0xb5, 0xff, 0x38, 'H','a','n','g','u','l','_','J','e','o','n','j','a',0,
+0x72, 0x75, 0xff, 0x39, 'H','a','n','g','u','l','_','B','a','n','j','a',0,
+0x9e, 0x95, 0xff, 0x3a, 'H','a','n','g','u','l','_','P','r','e','H','a','n','j','a',0,
+0x43, 0x35, 0xff, 0x3b, 'H','a','n','g','u','l','_','P','o','s','t','H','a','n','j','a',0,
+0x9a, 0x01, 0xff, 0x3c, 'H','a','n','g','u','l','_','S','i','n','g','l','e','C','a','n','d','i','d','a','t','e',0,
+0x32, 0x01, 0xff, 0x3d, 'H','a','n','g','u','l','_','M','u','l','t','i','p','l','e','C','a','n','d','i','d','a','t','e',0,
+0x6a, 0x01, 0xff, 0x3e, 'H','a','n','g','u','l','_','P','r','e','v','i','o','u','s','C','a','n','d','i','d','a','t','e',0,
+0xd0, 0x7a, 0xff, 0x3f, 'H','a','n','g','u','l','_','S','p','e','c','i','a','l',0,
+0xec, 0xd6, 0xff, 0x7e, 'H','a','n','g','u','l','_','s','w','i','t','c','h',0,
+0xe7, 0x51, 0x0e, 0xa1, 'H','a','n','g','u','l','_','K','i','y','e','o','g',0,
+0x12, 0x51, 0x0e, 0xa2, 'H','a','n','g','u','l','_','S','s','a','n','g','K','i','y','e','o','g',0,
+0x7a, 0x9d, 0x0e, 0xa3, 'H','a','n','g','u','l','_','K','i','y','e','o','g','S','i','o','s',0,
+0x73, 0x74, 0x0e, 0xa4, 'H','a','n','g','u','l','_','N','i','e','u','n',0,
+0x79, 0x50, 0x0e, 0xa5, 'H','a','n','g','u','l','_','N','i','e','u','n','J','i','e','u','j',0,
+0x79, 0x2e, 0x0e, 0xa6, 'H','a','n','g','u','l','_','N','i','e','u','n','H','i','e','u','h',0,
+0xe6, 0x0a, 0x0e, 0xa7, 'H','a','n','g','u','l','_','D','i','k','e','u','d',0,
+0x11, 0x0a, 0x0e, 0xa8, 'H','a','n','g','u','l','_','S','s','a','n','g','D','i','k','e','u','d',0,
+0x73, 0xb2, 0x0e, 0xa9, 'H','a','n','g','u','l','_','R','i','e','u','l',0,
+0x03, 0x11, 0x0e, 0xaa, 'H','a','n','g','u','l','_','R','i','e','u','l','K','i','y','e','o','g',0,
+0x81, 0x43, 0x0e, 0xab, 'H','a','n','g','u','l','_','R','i','e','u','l','M','i','e','u','m',0,
+0x81, 0x68, 0x0e, 0xac, 'H','a','n','g','u','l','_','R','i','e','u','l','P','i','e','u','b',0,
+0x40, 0xad, 0x0e, 0xad, 'H','a','n','g','u','l','_','R','i','e','u','l','S','i','o','s',0,
+0x81, 0xba, 0x0e, 0xae, 'H','a','n','g','u','l','_','R','i','e','u','l','T','i','e','u','t',0,
+0x03, 0x2c, 0x0e, 0xaf, 'H','a','n','g','u','l','_','R','i','e','u','l','P','h','i','e','u','f',0,
+0x80, 0xee, 0x0e, 0xb0, 'H','a','n','g','u','l','_','R','i','e','u','l','H','i','e','u','h',0,
+0x73, 0x63, 0x0e, 0xb1, 'H','a','n','g','u','l','_','M','i','e','u','m',0,
+0x73, 0x88, 0x0e, 0xb2, 'H','a','n','g','u','l','_','P','i','e','u','b',0,
+0x89, 0x08, 0x0e, 0xb3, 'H','a','n','g','u','l','_','S','s','a','n','g','P','i','e','u','b',0,
+0x3e, 0x0d, 0x0e, 0xb4, 'H','a','n','g','u','l','_','P','i','e','u','b','S','i','o','s',0,
+0xb9, 0xbd, 0x0e, 0xb5, 'H','a','n','g','u','l','_','S','i','o','s',0,
+0x44, 0x7d, 0x0e, 0xb6, 'H','a','n','g','u','l','_','S','s','a','n','g','S','i','o','s',0,
+0x73, 0x2f, 0x0e, 0xb7, 'H','a','n','g','u','l','_','I','e','u','n','g',0,
+0x73, 0x30, 0x0e, 0xb8, 'H','a','n','g','u','l','_','J','i','e','u','j',0,
+0x88, 0xb0, 0x0e, 0xb9, 'H','a','n','g','u','l','_','S','s','a','n','g','J','i','e','u','j',0,
+0x72, 0xb9, 0x0e, 0xba, 'H','a','n','g','u','l','_','C','i','e','u','c',0,
+0xe6, 0xd7, 0x0e, 0xbb, 'H','a','n','g','u','l','_','K','h','i','e','u','q',0,
+0x73, 0xda, 0x0e, 0xbc, 'H','a','n','g','u','l','_','T','i','e','u','t',0,
+0xe7, 0x6c, 0x0e, 0xbd, 'H','a','n','g','u','l','_','P','h','i','e','u','f',0,
+0x73, 0x0e, 0x0e, 0xbe, 'H','a','n','g','u','l','_','H','i','e','u','h',0,
+0x56, 0xc7, 0x0e, 0xbf, 'H','a','n','g','u','l','_','A',0,
+0xad, 0xd3, 0x0e, 0xc0, 'H','a','n','g','u','l','_','A','E',0,
+0xad, 0xff, 0x0e, 0xc1, 'H','a','n','g','u','l','_','Y','A',0,
+0x5c, 0x43, 0x0e, 0xc2, 'H','a','n','g','u','l','_','Y','A','E',0,
+0xad, 0xe5, 0x0e, 0xc3, 'H','a','n','g','u','l','_','E','O',0,
+0x56, 0xcb, 0x0e, 0xc4, 'H','a','n','g','u','l','_','E',0,
+0x5c, 0x55, 0x0e, 0xc5, 'H','a','n','g','u','l','_','Y','E','O',0,
+0xae, 0x03, 0x0e, 0xc6, 'H','a','n','g','u','l','_','Y','E',0,
+0x56, 0xd5, 0x0e, 0xc7, 'H','a','n','g','u','l','_','O',0,
+0xad, 0xfb, 0x0e, 0xc8, 'H','a','n','g','u','l','_','W','A',0,
+0x5c, 0x3b, 0x0e, 0xc9, 'H','a','n','g','u','l','_','W','A','E',0,
+0xad, 0xef, 0x0e, 0xca, 'H','a','n','g','u','l','_','O','E',0,
+0xae, 0x0d, 0x0e, 0xcb, 'H','a','n','g','u','l','_','Y','O',0,
+0x56, 0xdb, 0x0e, 0xcc, 'H','a','n','g','u','l','_','U',0,
+0x5c, 0x4d, 0x0e, 0xcd, 'H','a','n','g','u','l','_','W','E','O',0,
+0xad, 0xff, 0x0e, 0xce, 'H','a','n','g','u','l','_','W','E',0,
+0xae, 0x03, 0x0e, 0xcf, 'H','a','n','g','u','l','_','W','I',0,
+0xae, 0x13, 0x0e, 0xd0, 'H','a','n','g','u','l','_','Y','U',0,
+0xad, 0xeb, 0x0e, 0xd1, 'H','a','n','g','u','l','_','E','U',0,
+0xae, 0x07, 0x0e, 0xd2, 'H','a','n','g','u','l','_','Y','I',0,
+0x56, 0xcf, 0x0e, 0xd3, 'H','a','n','g','u','l','_','I',0,
+0x96, 0x51, 0x0e, 0xd4, 'H','a','n','g','u','l','_','J','_','K','i','y','e','o','g',0,
+0xf2, 0x51, 0x0e, 0xd5, 'H','a','n','g','u','l','_','J','_','S','s','a','n','g','K','i','y','e','o','g',0,
+0x6a, 0x9d, 0x0e, 0xd6, 'H','a','n','g','u','l','_','J','_','K','i','y','e','o','g','S','i','o','s',0,
+0xca, 0xf4, 0x0e, 0xd7, 'H','a','n','g','u','l','_','J','_','N','i','e','u','n',0,
+0x69, 0x50, 0x0e, 0xd8, 'H','a','n','g','u','l','_','J','_','N','i','e','u','n','J','i','e','u','j',0,
+0x69, 0x2e, 0x0e, 0xd9, 'H','a','n','g','u','l','_','J','_','N','i','e','u','n','H','i','e','u','h',0,
+0x95, 0x0a, 0x0e, 0xda, 'H','a','n','g','u','l','_','J','_','D','i','k','e','u','d',0,
+0xcb, 0x32, 0x0e, 0xdb, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l',0,
+0xe3, 0x11, 0x0e, 0xdc, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','K','i','y','e','o','g',0,
+0x71, 0x43, 0x0e, 0xdd, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','M','i','e','u','m',0,
+0x71, 0x68, 0x0e, 0xde, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','P','i','e','u','b',0,
+0xb8, 0xad, 0x0e, 0xdf, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','S','i','o','s',0,
+0x71, 0xba, 0x0e, 0xe0, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','T','i','e','u','t',0,
+0xe3, 0x2c, 0x0e, 0xe1, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','P','h','i','e','u','f',0,
+0x70, 0xee, 0x0e, 0xe2, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','H','i','e','u','h',0,
+0xca, 0xe3, 0x0e, 0xe3, 'H','a','n','g','u','l','_','J','_','M','i','e','u','m',0,
+0xcb, 0x08, 0x0e, 0xe4, 'H','a','n','g','u','l','_','J','_','P','i','e','u','b',0,
+0xb6, 0x0d, 0x0e, 0xe5, 'H','a','n','g','u','l','_','J','_','P','i','e','u','b','S','i','o','s',0,
+0xe5, 0x7d, 0x0e, 0xe6, 'H','a','n','g','u','l','_','J','_','S','i','o','s',0,
+0xbc, 0x7d, 0x0e, 0xe7, 'H','a','n','g','u','l','_','J','_','S','s','a','n','g','S','i','o','s',0,
+0xca, 0xaf, 0x0e, 0xe8, 'H','a','n','g','u','l','_','J','_','I','e','u','n','g',0,
+0xca, 0xb0, 0x0e, 0xe9, 'H','a','n','g','u','l','_','J','_','J','i','e','u','j',0,
+0xca, 0x39, 0x0e, 0xea, 'H','a','n','g','u','l','_','J','_','C','i','e','u','c',0,
+0x95, 0xd7, 0x0e, 0xeb, 'H','a','n','g','u','l','_','J','_','K','h','i','e','u','q',0,
+0xcb, 0x5a, 0x0e, 0xec, 'H','a','n','g','u','l','_','J','_','T','i','e','u','t',0,
+0x96, 0x6c, 0x0e, 0xed, 'H','a','n','g','u','l','_','J','_','P','h','i','e','u','f',0,
+0xca, 0x8e, 0x0e, 0xee, 'H','a','n','g','u','l','_','J','_','H','i','e','u','h',0,
+0x98, 0xae, 0x0e, 0xef, 'H','a','n','g','u','l','_','R','i','e','u','l','Y','e','o','r','i','n','H','i','e','u','h',0,
+0x7f, 0x63, 0x0e, 0xf0, 'H','a','n','g','u','l','_','S','u','n','k','y','e','o','n','g','e','u','m','M','i','e','u','m',0,
+0x7f, 0x88, 0x0e, 0xf1, 'H','a','n','g','u','l','_','S','u','n','k','y','e','o','n','g','e','u','m','P','i','e','u','b',0,
+0xce, 0x0d, 0x0e, 0xf2, 'H','a','n','g','u','l','_','P','a','n','S','i','o','s',0,
+0xb1, 0xcf, 0x0e, 0xf3, 'H','a','n','g','u','l','_','K','k','o','g','j','i','D','a','l','r','i','n','I','e','u','n','g',0,
+0xff, 0x6c, 0x0e, 0xf4, 'H','a','n','g','u','l','_','S','u','n','k','y','e','o','n','g','e','u','m','P','h','i','e','u','f',0,
+0x20, 0xae, 0x0e, 0xf5, 'H','a','n','g','u','l','_','Y','e','o','r','i','n','H','i','e','u','h',0,
+0x72, 0x8f, 0x0e, 0xf6, 'H','a','n','g','u','l','_','A','r','a','e','A',0,
+0xe5, 0x63, 0x0e, 0xf7, 'H','a','n','g','u','l','_','A','r','a','e','A','E',0,
+0x2c, 0x0d, 0x0e, 0xf8, 'H','a','n','g','u','l','_','J','_','P','a','n','S','i','o','s',0,
+0xb1, 0xcf, 0x0e, 0xf9, 'H','a','n','g','u','l','_','J','_','K','k','o','g','j','i','D','a','l','r','i','n','I','e','u','n','g',0,
+0x00, 0xae, 0x0e, 0xfa, 'H','a','n','g','u','l','_','J','_','Y','e','o','r','i','n','H','i','e','u','h',0,
+0x6f, 0xe0, 0x0e, 0xff, 'K','o','r','e','a','n','_','W','o','n',0,
+0x30, 0xb5, 0x14, 0xa1, 'A','r','m','e','n','i','a','n','_','e','t','e','r','n','i','t','y',0,
+0x8a, 0x25, 0x14, 0xa2, 'A','r','m','e','n','i','a','n','_','l','i','g','a','t','u','r','e','_','e','w',0,
+0x63, 0xa6, 0x14, 0xa3, 'A','r','m','e','n','i','a','n','_','f','u','l','l','_','s','t','o','p',0,
+0x36, 0x12, 0x14, 0xa3, 'A','r','m','e','n','i','a','n','_','v','e','r','j','a','k','e','t',0,
+0xca, 0x48, 0x14, 0xa4, 'A','r','m','e','n','i','a','n','_','p','a','r','e','n','r','i','g','h','t',0,
+0x64, 0xb4, 0x14, 0xa5, 'A','r','m','e','n','i','a','n','_','p','a','r','e','n','l','e','f','t',0,
+0x93, 0x08, 0x14, 0xa6, 'A','r','m','e','n','i','a','n','_','g','u','i','l','l','e','m','o','t','r','i','g','h','t',0,
+0x49, 0x14, 0x14, 0xa7, 'A','r','m','e','n','i','a','n','_','g','u','i','l','l','e','m','o','t','l','e','f','t',0,
+0x96, 0x42, 0x14, 0xa8, 'A','r','m','e','n','i','a','n','_','e','m','_','d','a','s','h',0,
+0x79, 0x1a, 0x14, 0xa9, 'A','r','m','e','n','i','a','n','_','d','o','t',0,
+0x98, 0x72, 0x14, 0xa9, 'A','r','m','e','n','i','a','n','_','m','i','j','a','k','e','t',0,
+0x50, 0x2b, 0x14, 0xaa, 'A','r','m','e','n','i','a','n','_','s','e','p','a','r','a','t','i','o','n','_','m','a','r','k',0,
+0x79, 0x1e, 0x14, 0xaa, 'A','r','m','e','n','i','a','n','_','b','u','t',0,
+0xe5, 0x77, 0x14, 0xab, 'A','r','m','e','n','i','a','n','_','c','o','m','m','a',0,
+0x96, 0x62, 0x14, 0xac, 'A','r','m','e','n','i','a','n','_','e','n','_','d','a','s','h',0,
+0xcc, 0xa8, 0x14, 0xad, 'A','r','m','e','n','i','a','n','_','h','y','p','h','e','n',0,
+0x37, 0xb9, 0x14, 0xad, 'A','r','m','e','n','i','a','n','_','y','e','n','t','a','m','n','a',0,
+0x2f, 0x21, 0x14, 0xae, 'A','r','m','e','n','i','a','n','_','e','l','l','i','p','s','i','s',0,
+0xcb, 0xd7, 0x14, 0xaf, 'A','r','m','e','n','i','a','n','_','e','x','c','l','a','m',0,
+0xca, 0x9d, 0x14, 0xaf, 'A','r','m','e','n','i','a','n','_','a','m','a','n','a','k',0,
+0xca, 0x0c, 0x14, 0xb0, 'A','r','m','e','n','i','a','n','_','a','c','c','e','n','t',0,
+0xcc, 0xd8, 0x14, 0xb0, 'A','r','m','e','n','i','a','n','_','s','h','e','s','h','t',0,
+0x37, 0x20, 0x14, 0xb1, 'A','r','m','e','n','i','a','n','_','q','u','e','s','t','i','o','n',0,
+0xcc, 0x91, 0x14, 0xb1, 'A','r','m','e','n','i','a','n','_','p','a','r','u','y','k',0,
+0x78, 0x30, 0x14, 0xb2, 'A','r','m','e','n','i','a','n','_','A','Y','B',0,
+0x79, 0x10, 0x14, 0xb3, 'A','r','m','e','n','i','a','n','_','a','y','b',0,
+0x78, 0x18, 0x14, 0xb4, 'A','r','m','e','n','i','a','n','_','B','E','N',0,
+0x78, 0xf8, 0x14, 0xb5, 'A','r','m','e','n','i','a','n','_','b','e','n',0,
+0x78, 0x33, 0x14, 0xb6, 'A','r','m','e','n','i','a','n','_','G','I','M',0,
+0x79, 0x13, 0x14, 0xb7, 'A','r','m','e','n','i','a','n','_','g','i','m',0,
+0xbb, 0xe5, 0x14, 0xb8, 'A','r','m','e','n','i','a','n','_','D','A',0,
+0xbc, 0x45, 0x14, 0xb9, 'A','r','m','e','n','i','a','n','_','d','a',0,
+0xf1, 0x1a, 0x14, 0xba, 'A','r','m','e','n','i','a','n','_','Y','E','C','H',0,
+0xf2, 0xfa, 0x14, 0xbb, 'A','r','m','e','n','i','a','n','_','y','e','c','h',0,
+0xbc, 0x11, 0x14, 0xbc, 'A','r','m','e','n','i','a','n','_','Z','A',0,
+0xbc, 0x71, 0x14, 0xbd, 'A','r','m','e','n','i','a','n','_','z','a',0,
+0x5d, 0xd3, 0x14, 0xbe, 'A','r','m','e','n','i','a','n','_','E',0,
+0x5d, 0xf3, 0x14, 0xbf, 'A','r','m','e','n','i','a','n','_','e',0,
+0xbb, 0xf2, 0x14, 0xc0, 'A','r','m','e','n','i','a','n','_','A','T',0,
+0xbc, 0x52, 0x14, 0xc1, 'A','r','m','e','n','i','a','n','_','a','t',0,
+0xbc, 0x13, 0x14, 0xc2, 'A','r','m','e','n','i','a','n','_','T','O',0,
+0xbc, 0x73, 0x14, 0xc3, 'A','r','m','e','n','i','a','n','_','t','o',0,
+0x78, 0x75, 0x14, 0xc4, 'A','r','m','e','n','i','a','n','_','Z','H','E',0,
+0x79, 0x55, 0x14, 0xc5, 'A','r','m','e','n','i','a','n','_','z','h','e',0,
+0x78, 0x41, 0x14, 0xc6, 'A','r','m','e','n','i','a','n','_','I','N','I',0,
+0x79, 0x21, 0x14, 0xc7, 'A','r','m','e','n','i','a','n','_','i','n','i',0,
+0xf1, 0x2c, 0x14, 0xc8, 'A','r','m','e','n','i','a','n','_','L','Y','U','N',0,
+0xf3, 0x0c, 0x14, 0xc9, 'A','r','m','e','n','i','a','n','_','l','y','u','n',0,
+0x78, 0x39, 0x14, 0xca, 'A','r','m','e','n','i','a','n','_','K','H','E',0,
+0x79, 0x19, 0x14, 0xcb, 'A','r','m','e','n','i','a','n','_','k','h','e',0,
+0x78, 0x6f, 0x14, 0xcc, 'A','r','m','e','n','i','a','n','_','T','S','A',0,
+0x79, 0x4f, 0x14, 0xcd, 'A','r','m','e','n','i','a','n','_','t','s','a',0,
+0x78, 0x3c, 0x14, 0xce, 'A','r','m','e','n','i','a','n','_','K','E','N',0,
+0x79, 0x1c, 0x14, 0xcf, 'A','r','m','e','n','i','a','n','_','k','e','n',0,
+0xbb, 0xfb, 0x14, 0xd0, 'A','r','m','e','n','i','a','n','_','H','O',0,
+0xbc, 0x5b, 0x14, 0xd1, 'A','r','m','e','n','i','a','n','_','h','o',0,
+0x78, 0x3d, 0x14, 0xd2, 'A','r','m','e','n','i','a','n','_','D','Z','A',0,
+0x79, 0x1d, 0x14, 0xd3, 'A','r','m','e','n','i','a','n','_','d','z','a',0,
+0xf0, 0x9e, 0x14, 0xd4, 'A','r','m','e','n','i','a','n','_','G','H','A','T',0,
+0xf2, 0x7e, 0x14, 0xd5, 'A','r','m','e','n','i','a','n','_','g','h','a','t',0,
+0xf0, 0xf1, 0x14, 0xd6, 'A','r','m','e','n','i','a','n','_','T','C','H','E',0,
+0xf2, 0xd1, 0x14, 0xd7, 'A','r','m','e','n','i','a','n','_','t','c','h','e',0,
+0x78, 0x44, 0x14, 0xd8, 'A','r','m','e','n','i','a','n','_','M','E','N',0,
+0x79, 0x24, 0x14, 0xd9, 'A','r','m','e','n','i','a','n','_','m','e','n',0,
+0xbb, 0xf5, 0x14, 0xda, 'A','r','m','e','n','i','a','n','_','H','I',0,
+0xbc, 0x55, 0x14, 0xdb, 'A','r','m','e','n','i','a','n','_','h','i',0,
+0xbc, 0x0d, 0x14, 0xdc, 'A','r','m','e','n','i','a','n','_','N','U',0,
+0xbc, 0x6d, 0x14, 0xdd, 'A','r','m','e','n','i','a','n','_','n','u',0,
+0x78, 0x55, 0x14, 0xde, 'A','r','m','e','n','i','a','n','_','S','H','A',0,
+0x79, 0x35, 0x14, 0xdf, 'A','r','m','e','n','i','a','n','_','s','h','a',0,
+0xbc, 0x17, 0x14, 0xe0, 'A','r','m','e','n','i','a','n','_','V','O',0,
+0xbc, 0x77, 0x14, 0xe1, 'A','r','m','e','n','i','a','n','_','v','o',0,
+0x78, 0x15, 0x14, 0xe2, 'A','r','m','e','n','i','a','n','_','C','H','A',0,
+0x78, 0xf5, 0x14, 0xe3, 'A','r','m','e','n','i','a','n','_','c','h','a',0,
+0xbc, 0x01, 0x14, 0xe4, 'A','r','m','e','n','i','a','n','_','P','E',0,
+0xbc, 0x61, 0x14, 0xe5, 'A','r','m','e','n','i','a','n','_','p','e',0,
+0xbb, 0xf5, 0x14, 0xe6, 'A','r','m','e','n','i','a','n','_','J','E',0,
+0xbc, 0x55, 0x14, 0xe7, 'A','r','m','e','n','i','a','n','_','j','e',0,
+0xbc, 0x01, 0x14, 0xe8, 'A','r','m','e','n','i','a','n','_','R','A',0,
+0xbc, 0x61, 0x14, 0xe9, 'A','r','m','e','n','i','a','n','_','r','a',0,
+0xbc, 0x07, 0x14, 0xea, 'A','r','m','e','n','i','a','n','_','S','E',0,
+0xbc, 0x67, 0x14, 0xeb, 'A','r','m','e','n','i','a','n','_','s','e',0,
+0x78, 0x70, 0x14, 0xec, 'A','r','m','e','n','i','a','n','_','V','E','V',0,
+0x79, 0x50, 0x14, 0xed, 'A','r','m','e','n','i','a','n','_','v','e','v',0,
+0xf1, 0x6c, 0x14, 0xee, 'A','r','m','e','n','i','a','n','_','T','Y','U','N',0,
+0xf3, 0x4c, 0x14, 0xef, 'A','r','m','e','n','i','a','n','_','t','y','u','n',0,
+0xbc, 0x05, 0x14, 0xf0, 'A','r','m','e','n','i','a','n','_','R','E',0,
+0xbc, 0x65, 0x14, 0xf1, 'A','r','m','e','n','i','a','n','_','r','e',0,
+0x78, 0x7d, 0x14, 0xf2, 'A','r','m','e','n','i','a','n','_','T','S','O',0,
+0x79, 0x5d, 0x14, 0xf3, 'A','r','m','e','n','i','a','n','_','t','s','o',0,
+0xf1, 0x7c, 0x14, 0xf4, 'A','r','m','e','n','i','a','n','_','V','Y','U','N',0,
+0xf3, 0x5c, 0x14, 0xf5, 'A','r','m','e','n','i','a','n','_','v','y','u','n',0,
+0xf1, 0x50, 0x14, 0xf6, 'A','r','m','e','n','i','a','n','_','P','Y','U','R',0,
+0xf3, 0x30, 0x14, 0xf7, 'A','r','m','e','n','i','a','n','_','p','y','u','r',0,
+0xbb, 0xf7, 0x14, 0xf8, 'A','r','m','e','n','i','a','n','_','K','E',0,
+0xbc, 0x57, 0x14, 0xf9, 'A','r','m','e','n','i','a','n','_','k','e',0,
+0x5d, 0xdd, 0x14, 0xfa, 'A','r','m','e','n','i','a','n','_','O',0,
+0x5d, 0xfd, 0x14, 0xfb, 'A','r','m','e','n','i','a','n','_','o',0,
+0xbb, 0xed, 0x14, 0xfc, 'A','r','m','e','n','i','a','n','_','F','E',0,
+0xbc, 0x4d, 0x14, 0xfd, 'A','r','m','e','n','i','a','n','_','f','e',0,
+0xbe, 0x4d, 0x14, 0xfe, 'A','r','m','e','n','i','a','n','_','a','p','o','s','t','r','o','p','h','e',0,
+0x40, 0x68, 0x14, 0xff, 'A','r','m','e','n','i','a','n','_','s','e','c','t','i','o','n','_','s','i','g','n',0,
+0xc1, 0x0c, 0x15, 0xd0, 'G','e','o','r','g','i','a','n','_','a','n',0,
+0x82, 0x70, 0x15, 0xd1, 'G','e','o','r','g','i','a','n','_','b','a','n',0,
+0x82, 0x84, 0x15, 0xd2, 'G','e','o','r','g','i','a','n','_','g','a','n',0,
+0x82, 0x94, 0x15, 0xd3, 'G','e','o','r','g','i','a','n','_','d','o','n',0,
+0xc1, 0x14, 0x15, 0xd4, 'G','e','o','r','g','i','a','n','_','e','n',0,
+0x82, 0xd0, 0x15, 0xd5, 'G','e','o','r','g','i','a','n','_','v','i','n',0,
+0x82, 0xd8, 0x15, 0xd6, 'G','e','o','r','g','i','a','n','_','z','e','n',0,
+0x82, 0xb8, 0x15, 0xd7, 'G','e','o','r','g','i','a','n','_','t','a','n',0,
+0xc1, 0x1c, 0x15, 0xd8, 'G','e','o','r','g','i','a','n','_','i','n',0,
+0x82, 0x94, 0x15, 0xd9, 'G','e','o','r','g','i','a','n','_','k','a','n',0,
+0x82, 0x9d, 0x15, 0xda, 'G','e','o','r','g','i','a','n','_','l','a','s',0,
+0x82, 0x9c, 0x15, 0xdb, 'G','e','o','r','g','i','a','n','_','m','a','n',0,
+0x82, 0xa4, 0x15, 0xdc, 'G','e','o','r','g','i','a','n','_','n','a','r',0,
+0xc1, 0x28, 0x15, 0xdd, 'G','e','o','r','g','i','a','n','_','o','n',0,
+0x82, 0xac, 0x15, 0xde, 'G','e','o','r','g','i','a','n','_','p','a','r',0,
+0x06, 0x14, 0x15, 0xdf, 'G','e','o','r','g','i','a','n','_','z','h','a','r',0,
+0x82, 0xa7, 0x15, 0xe0, 'G','e','o','r','g','i','a','n','_','r','a','e',0,
+0x82, 0xb4, 0x15, 0xe1, 'G','e','o','r','g','i','a','n','_','s','a','n',0,
+0x82, 0xbc, 0x15, 0xe2, 'G','e','o','r','g','i','a','n','_','t','a','r',0,
+0xc1, 0x34, 0x15, 0xe3, 'G','e','o','r','g','i','a','n','_','u','n',0,
+0x05, 0xc4, 0x15, 0xe4, 'G','e','o','r','g','i','a','n','_','p','h','a','r',0,
+0x05, 0x9c, 0x15, 0xe5, 'G','e','o','r','g','i','a','n','_','k','h','a','r',0,
+0x05, 0x78, 0x15, 0xe6, 'G','e','o','r','g','i','a','n','_','g','h','a','n',0,
+0x82, 0xb0, 0x15, 0xe7, 'G','e','o','r','g','i','a','n','_','q','a','r',0,
+0x05, 0xe8, 0x15, 0xe8, 'G','e','o','r','g','i','a','n','_','s','h','i','n',0,
+0x05, 0x68, 0x15, 0xe9, 'G','e','o','r','g','i','a','n','_','c','h','i','n',0,
+0x82, 0x74, 0x15, 0xea, 'G','e','o','r','g','i','a','n','_','c','a','n',0,
+0x82, 0x9e, 0x15, 0xeb, 'G','e','o','r','g','i','a','n','_','j','i','l',0,
+0x82, 0x82, 0x15, 0xec, 'G','e','o','r','g','i','a','n','_','c','i','l',0,
+0x05, 0x5c, 0x15, 0xed, 'G','e','o','r','g','i','a','n','_','c','h','a','r',0,
+0x82, 0xc8, 0x15, 0xee, 'G','e','o','r','g','i','a','n','_','x','a','n',0,
+0x05, 0x90, 0x15, 0xef, 'G','e','o','r','g','i','a','n','_','j','h','a','n',0,
+0x82, 0x7f, 0x15, 0xf0, 'G','e','o','r','g','i','a','n','_','h','a','e',0,
+0xc1, 0x11, 0x15, 0xf1, 'G','e','o','r','g','i','a','n','_','h','e',0,
+0x82, 0x8f, 0x15, 0xf2, 'G','e','o','r','g','i','a','n','_','h','i','e',0,
+0xc1, 0x2f, 0x15, 0xf3, 'G','e','o','r','g','i','a','n','_','w','e',0,
+0x82, 0x8c, 0x15, 0xf4, 'G','e','o','r','g','i','a','n','_','h','a','r',0,
+0x82, 0x9b, 0x15, 0xf5, 'G','e','o','r','g','i','a','n','_','h','o','e',0,
+0xc1, 0x11, 0x15, 0xf6, 'G','e','o','r','g','i','a','n','_','f','i',0,
+0xb5, 0x4a, 0x16, 0xa2, 'C','c','e','d','i','l','l','a','a','b','o','v','e','d','o','t',0,
+0xbc, 0x4a, 0x16, 0xa3, 'X','a','b','o','v','e','d','o','t',0,
+0xb5, 0x4a, 0x16, 0xa5, 'Q','a','b','o','v','e','d','o','t',0,
+0x15, 0xb5, 0x16, 0xa6, 'I','b','r','e','v','e',0,
+0x00, 0xd7, 0x16, 0xa7, 'I','E',0,
+0x00, 0xf9, 0x16, 0xa8, 'U','O',0,
+0x32, 0xa7, 0x16, 0xa9, 'Z','s','t','r','o','k','e',0,
+0x15, 0x2c, 0x16, 0xaa, 'G','c','a','r','o','n',0,
+0x2c, 0x96, 0x16, 0xaf, 'O','b','a','r','r','e','d',0,
+0xb5, 0x4a, 0x16, 0xb2, 'c','c','e','d','i','l','l','a','a','b','o','v','e','d','o','t',0,
+0xdc, 0x4a, 0x16, 0xb3, 'x','a','b','o','v','e','d','o','t',0,
+0x16, 0x2c, 0x16, 0xb4, 'O','c','a','r','o','n',0,
+0xd5, 0x4a, 0x16, 0xb5, 'q','a','b','o','v','e','d','o','t',0,
+0x19, 0xb5, 0x16, 0xb6, 'i','b','r','e','v','e',0,
+0x01, 0x37, 0x16, 0xb7, 'i','e',0,
+0x01, 0x59, 0x16, 0xb8, 'u','o',0,
+0x3a, 0xa7, 0x16, 0xb9, 'z','s','t','r','o','k','e',0,
+0x19, 0x2c, 0x16, 0xba, 'g','c','a','r','o','n',0,
+0x1a, 0x2c, 0x16, 0xbd, 'o','c','a','r','o','n',0,
+0x34, 0x96, 0x16, 0xbf, 'o','b','a','r','r','e','d',0,
+0x09, 0x57, 0x16, 0xc6, 'S','C','H','W','A',0,
+0x0d, 0x37, 0x16, 0xf6, 's','c','h','w','a',0,
+0xb1, 0x4a, 0x16, 0xd1, 'L','b','e','l','o','w','d','o','t',0,
+0x8c, 0x4a, 0x16, 0xd2, 'L','s','t','r','o','k','e','b','e','l','o','w','d','o','t',0,
+0xd1, 0x4a, 0x16, 0xe1, 'l','b','e','l','o','w','d','o','t',0,
+0x8c, 0x4a, 0x16, 0xe2, 'l','s','t','r','o','k','e','b','e','l','o','w','d','o','t',0,
+0x16, 0x45, 0x16, 0xd3, 'G','t','i','l','d','e',0,
+0x1a, 0x45, 0x16, 0xe3, 'g','t','i','l','d','e',0,
+0xa6, 0x4a, 0x1e, 0xa0, 'A','b','e','l','o','w','d','o','t',0,
+0xc6, 0x4a, 0x1e, 0xa1, 'a','b','e','l','o','w','d','o','t',0,
+0x0a, 0x55, 0x1e, 0xa2, 'A','h','o','o','k',0,
+0x0c, 0x55, 0x1e, 0xa3, 'a','h','o','o','k',0,
+0x16, 0x89, 0x1e, 0xa4, 'A','c','i','r','c','u','m','f','l','e','x','a','c','u','t','e',0,
+0x16, 0x89, 0x1e, 0xa5, 'a','c','i','r','c','u','m','f','l','e','x','a','c','u','t','e',0,
+0x17, 0x15, 0x1e, 0xa6, 'A','c','i','r','c','u','m','f','l','e','x','g','r','a','v','e',0,
+0x17, 0x15, 0x1e, 0xa7, 'a','c','i','r','c','u','m','f','l','e','x','g','r','a','v','e',0,
+0x0b, 0x65, 0x1e, 0xa8, 'A','c','i','r','c','u','m','f','l','e','x','h','o','o','k',0,
+0x0b, 0x65, 0x1e, 0xa9, 'a','c','i','r','c','u','m','f','l','e','x','h','o','o','k',0,
+0x17, 0xa5, 0x1e, 0xaa, 'A','c','i','r','c','u','m','f','l','e','x','t','i','l','d','e',0,
+0x17, 0xa5, 0x1e, 0xab, 'a','c','i','r','c','u','m','f','l','e','x','t','i','l','d','e',0,
+0xb7, 0x4a, 0x1e, 0xac, 'A','c','i','r','c','u','m','f','l','e','x','b','e','l','o','w','d','o','t',0,
+0xb7, 0x4a, 0x1e, 0xad, 'a','c','i','r','c','u','m','f','l','e','x','b','e','l','o','w','d','o','t',0,
+0xa2, 0xe9, 0x1e, 0xae, 'A','b','r','e','v','e','a','c','u','t','e',0,
+0x22, 0xe9, 0x1e, 0xaf, 'a','b','r','e','v','e','a','c','u','t','e',0,
+0xa3, 0x75, 0x1e, 0xb0, 'A','b','r','e','v','e','g','r','a','v','e',0,
+0x23, 0x75, 0x1e, 0xb1, 'a','b','r','e','v','e','g','r','a','v','e',0,
+0x51, 0x95, 0x1e, 0xb2, 'A','b','r','e','v','e','h','o','o','k',0,
+0x91, 0x95, 0x1e, 0xb3, 'a','b','r','e','v','e','h','o','o','k',0,
+0xa4, 0x05, 0x1e, 0xb4, 'A','b','r','e','v','e','t','i','l','d','e',0,
+0x24, 0x05, 0x1e, 0xb5, 'a','b','r','e','v','e','t','i','l','d','e',0,
+0x1a, 0x4a, 0x1e, 0xb6, 'A','b','r','e','v','e','b','e','l','o','w','d','o','t',0,
+0x1a, 0x4a, 0x1e, 0xb7, 'a','b','r','e','v','e','b','e','l','o','w','d','o','t',0,
+0xaa, 0x4a, 0x1e, 0xb8, 'E','b','e','l','o','w','d','o','t',0,
+0xca, 0x4a, 0x1e, 0xb9, 'e','b','e','l','o','w','d','o','t',0,
+0x0a, 0x95, 0x1e, 0xba, 'E','h','o','o','k',0,
+0x0c, 0x95, 0x1e, 0xbb, 'e','h','o','o','k',0,
+0x16, 0x05, 0x1e, 0xbc, 'E','t','i','l','d','e',0,
+0x1a, 0x05, 0x1e, 0xbd, 'e','t','i','l','d','e',0,
+0x16, 0x89, 0x1e, 0xbe, 'E','c','i','r','c','u','m','f','l','e','x','a','c','u','t','e',0,
+0x16, 0x89, 0x1e, 0xbf, 'e','c','i','r','c','u','m','f','l','e','x','a','c','u','t','e',0,
+0x17, 0x15, 0x1e, 0xc0, 'E','c','i','r','c','u','m','f','l','e','x','g','r','a','v','e',0,
+0x17, 0x15, 0x1e, 0xc1, 'e','c','i','r','c','u','m','f','l','e','x','g','r','a','v','e',0,
+0x0b, 0x65, 0x1e, 0xc2, 'E','c','i','r','c','u','m','f','l','e','x','h','o','o','k',0,
+0x0b, 0x65, 0x1e, 0xc3, 'e','c','i','r','c','u','m','f','l','e','x','h','o','o','k',0,
+0x17, 0xa5, 0x1e, 0xc4, 'E','c','i','r','c','u','m','f','l','e','x','t','i','l','d','e',0,
+0x17, 0xa5, 0x1e, 0xc5, 'e','c','i','r','c','u','m','f','l','e','x','t','i','l','d','e',0,
+0xb7, 0x4a, 0x1e, 0xc6, 'E','c','i','r','c','u','m','f','l','e','x','b','e','l','o','w','d','o','t',0,
+0xb7, 0x4a, 0x1e, 0xc7, 'e','c','i','r','c','u','m','f','l','e','x','b','e','l','o','w','d','o','t',0,
+0x0a, 0xd5, 0x1e, 0xc8, 'I','h','o','o','k',0,
+0x0c, 0xd5, 0x1e, 0xc9, 'i','h','o','o','k',0,
+0xae, 0x4a, 0x1e, 0xca, 'I','b','e','l','o','w','d','o','t',0,
+0xce, 0x4a, 0x1e, 0xcb, 'i','b','e','l','o','w','d','o','t',0,
+0xb4, 0x4a, 0x1e, 0xcc, 'O','b','e','l','o','w','d','o','t',0,
+0xd4, 0x4a, 0x1e, 0xcd, 'o','b','e','l','o','w','d','o','t',0,
+0x0b, 0x35, 0x1e, 0xce, 'O','h','o','o','k',0,
+0x0d, 0x35, 0x1e, 0xcf, 'o','h','o','o','k',0,
+0x16, 0x89, 0x1e, 0xd0, 'O','c','i','r','c','u','m','f','l','e','x','a','c','u','t','e',0,
+0x16, 0x89, 0x1e, 0xd1, 'o','c','i','r','c','u','m','f','l','e','x','a','c','u','t','e',0,
+0x17, 0x15, 0x1e, 0xd2, 'O','c','i','r','c','u','m','f','l','e','x','g','r','a','v','e',0,
+0x17, 0x15, 0x1e, 0xd3, 'o','c','i','r','c','u','m','f','l','e','x','g','r','a','v','e',0,
+0x8b, 0x65, 0x1e, 0xd4, 'O','c','i','r','c','u','m','f','l','e','x','h','o','o','k',0,
+0x8b, 0x65, 0x1e, 0xd5, 'o','c','i','r','c','u','m','f','l','e','x','h','o','o','k',0,
+0x17, 0xa5, 0x1e, 0xd6, 'O','c','i','r','c','u','m','f','l','e','x','t','i','l','d','e',0,
+0x17, 0xa5, 0x1e, 0xd7, 'o','c','i','r','c','u','m','f','l','e','x','t','i','l','d','e',0,
+0xb7, 0x4a, 0x1e, 0xd8, 'O','c','i','r','c','u','m','f','l','e','x','b','e','l','o','w','d','o','t',0,
+0xb7, 0x4a, 0x1e, 0xd9, 'o','c','i','r','c','u','m','f','l','e','x','b','e','l','o','w','d','o','t',0,
+0x74, 0x09, 0x1e, 0xda, 'O','h','o','r','n','a','c','u','t','e',0,
+0xb4, 0x09, 0x1e, 0xdb, 'o','h','o','r','n','a','c','u','t','e',0,
+0x74, 0x95, 0x1e, 0xdc, 'O','h','o','r','n','g','r','a','v','e',0,
+0xb4, 0x95, 0x1e, 0xdd, 'o','h','o','r','n','g','r','a','v','e',0,
+0xba, 0x25, 0x1e, 0xde, 'O','h','o','r','n','h','o','o','k',0,
+0xda, 0x25, 0x1e, 0xdf, 'o','h','o','r','n','h','o','o','k',0,
+0x75, 0x25, 0x1e, 0xe0, 'O','h','o','r','n','t','i','l','d','e',0,
+0xb5, 0x25, 0x1e, 0xe1, 'o','h','o','r','n','t','i','l','d','e',0,
+0xa3, 0x4a, 0x1e, 0xe2, 'O','h','o','r','n','b','e','l','o','w','d','o','t',0,
+0xa3, 0x4a, 0x1e, 0xe3, 'o','h','o','r','n','b','e','l','o','w','d','o','t',0,
+0xba, 0x4a, 0x1e, 0xe4, 'U','b','e','l','o','w','d','o','t',0,
+0xda, 0x4a, 0x1e, 0xe5, 'u','b','e','l','o','w','d','o','t',0,
+0x0b, 0x95, 0x1e, 0xe6, 'U','h','o','o','k',0,
+0x0d, 0x95, 0x1e, 0xe7, 'u','h','o','o','k',0,
+0x80, 0x09, 0x1e, 0xe8, 'U','h','o','r','n','a','c','u','t','e',0,
+0xc0, 0x09, 0x1e, 0xe9, 'u','h','o','r','n','a','c','u','t','e',0,
+0x80, 0x95, 0x1e, 0xea, 'U','h','o','r','n','g','r','a','v','e',0,
+0xc0, 0x95, 0x1e, 0xeb, 'u','h','o','r','n','g','r','a','v','e',0,
+0xc0, 0x25, 0x1e, 0xec, 'U','h','o','r','n','h','o','o','k',0,
+0xe0, 0x25, 0x1e, 0xed, 'u','h','o','r','n','h','o','o','k',0,
+0x81, 0x25, 0x1e, 0xee, 'U','h','o','r','n','t','i','l','d','e',0,
+0xc1, 0x25, 0x1e, 0xef, 'u','h','o','r','n','t','i','l','d','e',0,
+0x03, 0x4a, 0x1e, 0xf0, 'U','h','o','r','n','b','e','l','o','w','d','o','t',0,
+0x03, 0x4a, 0x1e, 0xf1, 'u','h','o','r','n','b','e','l','o','w','d','o','t',0,
+0xbe, 0x4a, 0x1e, 0xf4, 'Y','b','e','l','o','w','d','o','t',0,
+0xde, 0x4a, 0x1e, 0xf5, 'y','b','e','l','o','w','d','o','t',0,
+0x0b, 0xd5, 0x1e, 0xf6, 'Y','h','o','o','k',0,
+0x0d, 0xd5, 0x1e, 0xf7, 'y','h','o','o','k',0,
+0x18, 0x85, 0x1e, 0xf8, 'Y','t','i','l','d','e',0,
+0x1c, 0x85, 0x1e, 0xf9, 'y','t','i','l','d','e',0,
+0x0b, 0x3e, 0x1e, 0xfa, 'O','h','o','r','n',0,
+0x0d, 0x3e, 0x1e, 0xfb, 'o','h','o','r','n',0,
+0x0b, 0x9e, 0x1e, 0xfc, 'U','h','o','r','n',0,
+0x0d, 0x9e, 0x1e, 0xfd, 'u','h','o','r','n',0,
+0xd3, 0x05, 0x1e, 0x9f, 'c','o','m','b','i','n','i','n','g','_','t','i','l','d','e',0,
+0xd2, 0x75, 0x1e, 0xf2, 'c','o','m','b','i','n','i','n','g','_','g','r','a','v','e',0,
+0xd1, 0xe9, 0x1e, 0xf3, 'c','o','m','b','i','n','i','n','g','_','a','c','u','t','e',0,
+0xe9, 0x15, 0x1e, 0xfe, 'c','o','m','b','i','n','i','n','g','_','h','o','o','k',0,
+0x92, 0x4a, 0x1e, 0xff, 'c','o','m','b','i','n','i','n','g','_','b','e','l','o','w','d','o','t',0,
+0x2a, 0x68, 0x20, 0xa0, 'E','c','u','S','i','g','n',0,
+0xaf, 0xb8, 0x20, 0xa1, 'C','o','l','o','n','S','i','g','n',0,
+0xab, 0x68, 0x20, 0xa2, 'C','r','u','z','e','i','r','o','S','i','g','n',0,
+0x3c, 0xa8, 0x20, 0xa3, 'F','F','r','a','n','c','S','i','g','n',0,
+0x5a, 0x08, 0x20, 0xa4, 'L','i','r','a','S','i','g','n',0,
+0x5a, 0x78, 0x20, 0xa5, 'M','i','l','l','S','i','g','n',0,
+0xb2, 0x88, 0x20, 0xa6, 'N','a','i','r','a','S','i','g','n',0,
+0x71, 0xc8, 0x20, 0xa7, 'P','e','s','e','t','a','S','i','g','n',0,
+0xc0, 0xe8, 0x20, 0xa8, 'R','u','p','e','e','S','i','g','n',0,
+0x2f, 0xf8, 0x20, 0xa9, 'W','o','n','S','i','g','n',0,
+0x59, 0x98, 0x20, 0xaa, 'N','e','w','S','h','e','q','e','l','S','i','g','n',0,
+0x57, 0x68, 0x20, 0xab, 'D','o','n','g','S','i','g','n',0,
+0x5a, 0x68, 0x20, 0xac, 'E','u','r','o','S','i','g','n',0
+};
+
+#define KTABLESIZE 2909
+#define KMAXHASH 10
+
+static const unsigned short hashString[KTABLESIZE] = {
+0x0000, 0x0000, 0x21eb, 0x0000, 0x0000, 0x2356, 0x2302, 0x0000,
+0x4090, 0x0000, 0x0000, 0x0000, 0x0000, 0x2c60, 0x220f, 0x522c,
+0x666b, 0x3d02, 0x19d9, 0x0000, 0x1487, 0x0000, 0x2362, 0x0000,
+0x0000, 0x622d, 0x21f7, 0x0000, 0x5717, 0x230e, 0x239e, 0x0000,
+0x43da, 0x6164, 0x23ce, 0x534a, 0x0262, 0x5601, 0x22c6, 0x0223,
+0x1e57, 0x48bb, 0x23c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x17a9,
+0x124c, 0x1252, 0x1258, 0x125e, 0x1264, 0x126a, 0x1270, 0x1276,
+0x127c, 0x1282, 0x6547, 0x5283, 0x0000, 0x426d, 0x2115, 0x0000,
+0x0000, 0x12d3, 0x12d9, 0x12df, 0x12e5, 0x12eb, 0x12f1, 0x12f7,
+0x12fd, 0x1303, 0x1309, 0x130f, 0x1315, 0x131b, 0x1321, 0x026d,
+0x132d, 0x1333, 0x0bea, 0x133f, 0x1345, 0x134b, 0x1351, 0x1357,
+0x135d, 0x1363, 0x1369, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x13d5, 0x13db, 0x13e1, 0x13e7, 0x13ed, 0x13f3, 0x13f9,
+0x13ff, 0x1405, 0x140b, 0x1411, 0x1417, 0x141d, 0x1423, 0x1429,
+0x142f, 0x1435, 0x143b, 0x1441, 0x1447, 0x144d, 0x1453, 0x1459,
+0x145f, 0x1465, 0x146b, 0x1cf2, 0x3371, 0x07d2, 0x0000, 0x405a,
+0x0000, 0x0000, 0x3c6a, 0x6566, 0x0000, 0x0000, 0x28a4, 0x0842,
+0x2eed, 0x4f73, 0x0000, 0x176a, 0x0000, 0x0000, 0x227d, 0x4f3c,
+0x391a, 0x0000, 0x3ede, 0x0000, 0x0000, 0x17e8, 0x1a14, 0x0000,
+0x4e1c, 0x3f7a, 0x0000, 0x6378, 0x003d, 0x0000, 0x4111, 0x0112,
+0x0000, 0x0317, 0x3489, 0x2264, 0x0000, 0x1339, 0x070c, 0x0000,
+0x0000, 0x5e0c, 0x645e, 0x6326, 0x0718, 0x4937, 0x5cf7, 0x03f4,
+0x0db8, 0x01ad, 0x0000, 0x1c2d, 0x0000, 0x0000, 0x4af6, 0x33ba,
+0x0000, 0x491b, 0x0000, 0x03e6, 0x0000, 0x04b4, 0x04bb, 0x04c2,
+0x04c9, 0x04d0, 0x04d7, 0x04de, 0x04e5, 0x04ec, 0x0000, 0x16ab,
+0x0000, 0x0503, 0x0512, 0x0521, 0x0530, 0x053f, 0x054e, 0x055d,
+0x056c, 0x057b, 0x19ef, 0x19cc, 0x0000, 0x059a, 0x05a9, 0x05b8,
+0x05c7, 0x05d6, 0x05e5, 0x05f4, 0x0603, 0x0612, 0x0000, 0x1f43,
+0x2a8c, 0x30cd, 0x0c1a, 0x2072, 0x0000, 0x0000, 0x0679, 0x312c,
+0x0000, 0x1b54, 0x0000, 0x0000, 0x0685, 0x270c, 0x3c87, 0x1327,
+0x0000, 0x6528, 0x0a7f, 0x0000, 0x6642, 0x0b1d, 0x0000, 0x0000,
+0x5fd2, 0x5e91, 0x0000, 0x1f38, 0x0000, 0x3eb2, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x4073, 0x0000, 0x0000, 0x0000,
+0x0000, 0x489b, 0x0000, 0x0000, 0x1ede, 0x5bb7, 0x0000, 0x0b08,
+0x0000, 0x0000, 0x11c4, 0x0000, 0x0000, 0x62d2, 0x0000, 0x5deb,
+0x275a, 0x0000, 0x0209, 0x0000, 0x267a, 0x036e, 0x0000, 0x0000,
+0x26ed, 0x0000, 0x31d8, 0x0000, 0x0000, 0x0000, 0x2787, 0x1847,
+0x1db4, 0x0000, 0x183d, 0x2054, 0x136f, 0x5c3d, 0x0000, 0x0000,
+0x0000, 0x64d9, 0x3cba, 0x0000, 0x02ff, 0x0000, 0x12cc, 0x5f02,
+0x1995, 0x4f01, 0x1223, 0x044c, 0x09fd, 0x2e49, 0x0ac1, 0x0000,
+0x1b39, 0x27e7, 0x0000, 0x0052, 0x3cb3, 0x5c91, 0x28c6, 0x1288,
+0x3ccf, 0x3f99, 0x30ad, 0x1e7c, 0x3b7b, 0x0000, 0x043d, 0x15be,
+0x0000, 0x0000, 0x0000, 0x0d23, 0x24d0, 0x0000, 0x0000, 0x0d55,
+0x0000, 0x0387, 0x0000, 0x0000, 0x1d6c, 0x0000, 0x1536, 0x17d3,
+0x3cd6, 0x0000, 0x25b7, 0x087e, 0x269f, 0x0000, 0x0000, 0x31fe,
+0x2e68, 0x0000, 0x651a, 0x0000, 0x294e, 0x6143, 0x217c, 0x44b8,
+0x4e33, 0x4b8c, 0x38e0, 0x5dda, 0x2778, 0x0000, 0x5d94, 0x179e,
+0x13bd, 0x4da0, 0x1fd1, 0x38a6, 0x3981, 0x12a9, 0x041c, 0x3d96,
+0x5e1c, 0x0000, 0x0000, 0x32e2, 0x0000, 0x0000, 0x0000, 0x1d1b,
+0x5be9, 0x0000, 0x15d3, 0x2816, 0x1dd7, 0x0000, 0x197a, 0x3341,
+0x00a0, 0x5c5e, 0x5d83, 0x2c00, 0x0000, 0x0000, 0x0000, 0x0000,
+0x5c80, 0x0000, 0x0000, 0x5cc4, 0x0000, 0x3ca2, 0x0000, 0x19e4,
+0x36b5, 0x3a20, 0x0000, 0x2227, 0x5d3d, 0x0000, 0x0000, 0x2fe9,
+0x1e87, 0x0000, 0x04f3, 0x04fb, 0x050a, 0x0519, 0x0528, 0x0537,
+0x0546, 0x0555, 0x0564, 0x0573, 0x05fb, 0x060a, 0x0000, 0x306a,
+0x0000, 0x0000, 0x32b2, 0x323e, 0x1fea, 0x2efd, 0x4d4c, 0x0000,
+0x3311, 0x3321, 0x058a, 0x42fa, 0x40cd, 0x2e7a, 0x0000, 0x3b11,
+0x0000, 0x32f1, 0x0000, 0x653c, 0x5c1b, 0x0000, 0x47bb, 0x0000,
+0x122d, 0x3331, 0x0000, 0x1918, 0x0000, 0x3361, 0x163e, 0x3301,
+0x62c8, 0x15b4, 0x0621, 0x0631, 0x0641, 0x0651, 0x0661, 0x0671,
+0x0000, 0x655c, 0x0000, 0x01cc, 0x0000, 0x40fe, 0x4243, 0x0000,
+0x5d19, 0x6472, 0x0000, 0x31ee, 0x45f3, 0x0000, 0x0000, 0x1b82,
+0x0000, 0x64e8, 0x1b8d, 0x0000, 0x4483, 0x0000, 0x0000, 0x1e08,
+0x0000, 0x429e, 0x0000, 0x1b6c, 0x2044, 0x39e9, 0x0000, 0x5405,
+0x0000, 0x0000, 0x117c, 0x0000, 0x1729, 0x1242, 0x0000, 0x0000,
+0x0000, 0x0000, 0x3c50, 0x0000, 0x4cc8, 0x2ff8, 0x0aa2, 0x0000,
+0x0000, 0x3019, 0x1baf, 0x6442, 0x3039, 0x1bdc, 0x5fdc, 0x0000,
+0x0000, 0x25cc, 0x309d, 0x1739, 0x30bd, 0x2d6d, 0x3eed, 0x609a,
+0x30fc, 0x310c, 0x394e, 0x0000, 0x0401, 0x175a, 0x0f43, 0x0000,
+0x0000, 0x30dc, 0x1106, 0x0000, 0x273a, 0x0000, 0x03d8, 0x1866,
+0x4edf, 0x1496, 0x1ba4, 0x327f, 0x0000, 0x02f2, 0x5779, 0x30ec,
+0x6468, 0x0000, 0x40ab, 0x17fd, 0x59f7, 0x1925, 0x24c0, 0x0000,
+0x0000, 0x6218, 0x0000, 0x0000, 0x0000, 0x1579, 0x0000, 0x0000,
+0x5b56, 0x1dbf, 0x0000, 0x2fd9, 0x0000, 0x296e, 0x3774, 0x4228,
+0x120d, 0x0000, 0x545c, 0x3c06, 0x0250, 0x0000, 0x09cd, 0x0000,
+0x17b4, 0x26ce, 0x0000, 0x0000, 0x5a9d, 0x0000, 0x6030, 0x0000,
+0x5a37, 0x0000, 0x0000, 0x6450, 0x0dd0, 0x0de4, 0x0df8, 0x0e0c,
+0x0e20, 0x2824, 0x1c09, 0x0829, 0x0000, 0x27d8, 0x5f27, 0x0000,
+0x3049, 0x3cc1, 0x5f1c, 0x0000, 0x001e, 0x0000, 0x0000, 0x1f5c,
+0x6532, 0x293f, 0x2026, 0x0000, 0x0000, 0x3cc8, 0x0000, 0x0000,
+0x0000, 0x1e70, 0x0e34, 0x63a8, 0x56d5, 0x0000, 0x50dc, 0x1cd4,
+0x0000, 0x0000, 0x42ad, 0x0000, 0x1ec5, 0x41c4, 0x58a7, 0x43cf,
+0x0000, 0x0ed2, 0x0ee4, 0x0ef6, 0x0f08, 0x0f1a, 0x0000, 0x0000,
+0x3758, 0x4042, 0x0000, 0x0000, 0x0000, 0x1292, 0x0000, 0x0000,
+0x0000, 0x55c2, 0x24f0, 0x3fd6, 0x0000, 0x0000, 0x5973, 0x0000,
+0x1c8e, 0x21a8, 0x0000, 0x0000, 0x266a, 0x21c9, 0x53a0, 0x189b,
+0x155f, 0x21b3, 0x0000, 0x014d, 0x3fab, 0x39fb, 0x23da, 0x21d4,
+0x3bbf, 0x2769, 0x0000, 0x185b, 0x147f, 0x21be, 0x0000, 0x4442,
+0x5843, 0x5a57, 0x0000, 0x0f8a, 0x0000, 0x0000, 0x57b9, 0x2c9c,
+0x0000, 0x2121, 0x5bfa, 0x0092, 0x0000, 0x18a6, 0x5abd, 0x1a41,
+0x4a88, 0x212c, 0x5fa1, 0x0000, 0x0f72, 0x0000, 0x6130, 0x1c49,
+0x0000, 0x0000, 0x3618, 0x0000, 0x414e, 0x2137, 0x431b, 0x26be,
+0x0000, 0x0000, 0x0000, 0x0000, 0x18c5, 0x5f74, 0x06f4, 0x3bd9,
+0x5f32, 0x0000, 0x0000, 0x0000, 0x0700, 0x0000, 0x441b, 0x2833,
+0x0000, 0x1d64, 0x0000, 0x427d, 0x0000, 0x0000, 0x50ea, 0x27f6,
+0x0000, 0x0d46, 0x11ad, 0x139e, 0x5a07, 0x0a70, 0x0000, 0x4606,
+0x5b37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5dfb,
+0x0000, 0x0000, 0x0000, 0x0000, 0x5fac, 0x0000, 0x0000, 0x1b77,
+0x0000, 0x5c4d, 0x1a2b, 0x0000, 0x43f3, 0x4472, 0x0000, 0x0062,
+0x0000, 0x65c9, 0x0000, 0x0000, 0x14e8, 0x4568, 0x0000, 0x3ea4,
+0x0000, 0x5c6f, 0x156e, 0x0000, 0x0000, 0x26dd, 0x5854, 0x0000,
+0x272a, 0x1ce2, 0x0000, 0x0000, 0x50f8, 0x0000, 0x0ab1, 0x0000,
+0x1692, 0x485a, 0x26fc, 0x54ca, 0x2fc9, 0x0000, 0x26ae, 0x14b6,
+0x138d, 0x0000, 0x3686, 0x1890, 0x2806, 0x1bed, 0x0000, 0x0770,
+0x0000, 0x5ca1, 0x0000, 0x62fc, 0x4d8e, 0x4011, 0x59c6, 0x3e89,
+0x0000, 0x4835, 0x0000, 0x6191, 0x2f4e, 0x0000, 0x2500, 0x1bc6,
+0x3be8, 0x38ce, 0x1bd1, 0x0179, 0x0000, 0x0000, 0x3d70, 0x0000,
+0x271a, 0x0582, 0x0000, 0x0592, 0x5ebb, 0x05a1, 0x55af, 0x05b0,
+0x4d2f, 0x05bf, 0x0000, 0x05ce, 0x409c, 0x05dd, 0x1956, 0x05ec,
+0x3993, 0x2689, 0x5832, 0x326f, 0x46ac, 0x5876, 0x3f40, 0x18e3,
+0x466e, 0x0000, 0x5018, 0x0000, 0x0000, 0x5922, 0x42be, 0x32a2,
+0x0137, 0x32d2, 0x0000, 0x4ab1, 0x507a, 0x469d, 0x464e, 0x0000,
+0x0ebc, 0x3a33, 0x4515, 0x35b8, 0x287c, 0x0000, 0x0d34, 0x0000,
+0x3445, 0x44c6, 0x58ff, 0x29af, 0x4ffb, 0x0000, 0x08dc, 0x0000,
+0x4380, 0x601b, 0x0000, 0x3d13, 0x0893, 0x0000, 0x0000, 0x0000,
+0x0000, 0x48ad, 0x3659, 0x15f2, 0x1610, 0x53d0, 0x4817, 0x0000,
+0x1158, 0x5a68, 0x0394, 0x3a4c, 0x45bf, 0x18b6, 0x57ca, 0x0000,
+0x0000, 0x33dc, 0x617c, 0x3e27, 0x5d07, 0x5f10, 0x5ace, 0x0000,
+0x0000, 0x0c88, 0x0000, 0x0000, 0x0000, 0x5f48, 0x1066, 0x2af6,
+0x0000, 0x325e, 0x0000, 0x0fcf, 0x0000, 0x0000, 0x0000, 0x49a2,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x16b2, 0x1677,
+0x0000, 0x1a56, 0x46dc, 0x1dcc, 0x1c62, 0x0000, 0x0000, 0x1b61,
+0x5d4e, 0x2f1c, 0x1bfe, 0x5e3e, 0x0000, 0x0000, 0x393b, 0x5119,
+0x0000, 0x042d, 0x263a, 0x0000, 0x0a3a, 0x47cc, 0x3e68, 0x15a2,
+0x4dde, 0x0000, 0x4f62, 0x0000, 0x48cc, 0x33a9, 0x0000, 0x0000,
+0x2e8a, 0x0000, 0x0190, 0x0000, 0x27c9, 0x0000, 0x552b, 0x1a36,
+0x0000, 0x3c10, 0x1a4b, 0x3802, 0x0000, 0x0000, 0x4d69, 0x0000,
+0x0000, 0x0000, 0x14db, 0x03af, 0x5cb2, 0x486c, 0x0a8e, 0x0000,
+0x634e, 0x0000, 0x0000, 0x107b, 0x0000, 0x3350, 0x0000, 0x0b3d,
+0x0000, 0x4db7, 0x2f3d, 0x2624, 0x1237, 0x5f09, 0x0000, 0x0000,
+0x0000, 0x0000, 0x14f0, 0x18ee, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x4c23, 0x0000, 0x2195, 0x0000,
+0x0000, 0x0000, 0x48ef, 0x0d79, 0x1fb8, 0x20c6, 0x0000, 0x47dd,
+0x0000, 0x477b, 0x0000, 0x305a, 0x0000, 0x0000, 0x1554, 0x193b,
+0x0000, 0x0000, 0x0000, 0x0000, 0x41da, 0x3af8, 0x0000, 0x3029,
+0x0000, 0x4579, 0x5d72, 0x63b7, 0x0000, 0x2bad, 0x0000, 0x44e5,
+0x5475, 0x4808, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x1909, 0x0000, 0x3da0, 0x2cea, 0x25f6, 0x0000, 0x3b23, 0x0c5e,
+0x0000, 0x0000, 0x3e4b, 0x0913, 0x0000, 0x63e4, 0x43c4, 0x0000,
+0x4982, 0x47f4, 0x0000, 0x01dd, 0x649f, 0x15e6, 0x459c, 0x0000,
+0x0000, 0x0000, 0x0000, 0x1970, 0x428e, 0x3e7c, 0x487a, 0x0000,
+0x0000, 0x0000, 0x2859, 0x18cd, 0x2d4c, 0x0000, 0x0000, 0x1fc6,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b2c, 0x0000, 0x0000,
+0x0000, 0x53ee, 0x60b2, 0x1d49, 0x0000, 0x63f2, 0x0000, 0x0000,
+0x0000, 0x0000, 0x3647, 0x6570, 0x0000, 0x0000, 0x045a, 0x0463,
+0x046c, 0x0475, 0x047e, 0x0487, 0x0490, 0x0499, 0x04a2, 0x04ab,
+0x0000, 0x0000, 0x0000, 0x23e5, 0x4f2c, 0x0000, 0x0000, 0x0000,
+0x10cb, 0x1058, 0x0000, 0x3d25, 0x0000, 0x0000, 0x0000, 0x4614,
+0x5af1, 0x4f9a, 0x0000, 0x3c91, 0x0000, 0x5f52, 0x0000, 0x0000,
+0x1e93, 0x28d7, 0x4b57, 0x4e9c, 0x0000, 0x62b0, 0x4dcd, 0x1965,
+0x0000, 0x2d8c, 0x60e2, 0x27ba, 0x4c13, 0x0000, 0x0000, 0x0000,
+0x41f2, 0x2dad, 0x3794, 0x0c9e, 0x0000, 0x0000, 0x0000, 0x0000,
+0x1f91, 0x0000, 0x0000, 0x6082, 0x0000, 0x3194, 0x4769, 0x63d5,
+0x0000, 0x1731, 0x0000, 0x0000, 0x2a72, 0x59b5, 0x51cd, 0x1a6e,
+0x0000, 0x0000, 0x1650, 0x56b3, 0x658e, 0x137f, 0x10d9, 0x0000,
+0x0000, 0x10a0, 0x55eb, 0x0000, 0x38c0, 0x3f4b, 0x6481, 0x0000,
+0x0000, 0x0000, 0x0000, 0x3008, 0x1813, 0x313b, 0x4757, 0x0000,
+0x0000, 0x0010, 0x4cda, 0x0798, 0x0000, 0x0000, 0x17f2, 0x4bb3,
+0x0000, 0x0000, 0x4175, 0x3a7b, 0x0000, 0x0000, 0x65a2, 0x0000,
+0x0000, 0x104a, 0x4202, 0x1fad, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x5546, 0x0000, 0x0000, 0x35f2, 0x6006,
+0x0000, 0x320d, 0x0000, 0x0000, 0x0619, 0x1015, 0x5245, 0x0629,
+0x33c9, 0x4e87, 0x0639, 0x0000, 0x02a9, 0x0649, 0x02d0, 0x54b3,
+0x0659, 0x529a, 0x2c24, 0x0669, 0x02bd, 0x1f1c, 0x29d2, 0x0000,
+0x421c, 0x4bc3, 0x2491, 0x0000, 0x0000, 0x57db, 0x0000, 0x0000,
+0x1dfd, 0x0000, 0x2df1, 0x5911, 0x0000, 0x0000, 0x65fa, 0x0000,
+0x0000, 0x0000, 0x0000, 0x32c2, 0x0200, 0x0000, 0x5db7, 0x440e,
+0x021a, 0x28fa, 0x39bd, 0x01f7, 0x0000, 0x0000, 0x0000, 0x0000,
+0x58c9, 0x0000, 0x6294, 0x0000, 0x5e7f, 0x65ec, 0x4736, 0x0000,
+0x62a2, 0x0000, 0x49f8, 0x1ef7, 0x0000, 0x02a0, 0x4ac0, 0x0000,
+0x0000, 0x3e35, 0x0000, 0x274b, 0x0000, 0x0000, 0x4a08, 0x640f,
+0x64ca, 0x1946, 0x4927, 0x0297, 0x0000, 0x39d3, 0x0000, 0x0000,
+0x425f, 0x438d, 0x4a27, 0x0855, 0x61f0, 0x0000, 0x0000, 0x0000,
+0x0239, 0x0000, 0x08c2, 0x20ed, 0x0000, 0x650c, 0x0000, 0x2f81,
+0x434b, 0x3e40, 0x2c89, 0x0000, 0x3e0a, 0x0000, 0x4a37, 0x1c9b,
+0x2542, 0x0784, 0x255c, 0x2569, 0x2576, 0x2583, 0x2590, 0x259d,
+0x25aa, 0x1a08, 0x458d, 0x0000, 0x0000, 0x0000, 0x4a67, 0x6430,
+0x51e5, 0x0000, 0x0bd2, 0x0000, 0x1c13, 0x4122, 0x3ef8, 0x35d2,
+0x55d7, 0x0000, 0x0000, 0x58ed, 0x0000, 0x0000, 0x3e5b, 0x028e,
+0x19fa, 0x3399, 0x0000, 0x2142, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x22ea, 0x0000, 0x20de, 0x0000, 0x231a, 0x0000, 0x21df,
+0x1de4, 0x22f6, 0x4c80, 0x2203, 0x0000, 0x22ae, 0x61c6, 0x1e10,
+0x0000, 0x22d2, 0x2326, 0x233e, 0x0000, 0x1cfd, 0x0b5b, 0x221b,
+0x0000, 0x2258, 0x44a6, 0x0a1a, 0x2080, 0x2296, 0x0000, 0x234a,
+0x6044, 0x2271, 0x4cb3, 0x236e, 0x22ba, 0x224c, 0x1da7, 0x22a2,
+0x0000, 0x23aa, 0x0000, 0x2234, 0x0000, 0x0358, 0x57fd, 0x0b71,
+0x23b6, 0x037b, 0x0000, 0x2392, 0x034c, 0x2be4, 0x2240, 0x237a,
+0x0000, 0x0000, 0x5214, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x2b5e, 0x0000, 0x28b5, 0x4d7c, 0x0000, 0x0000, 0x0000, 0x31a5,
+0x0000, 0x0000, 0x36ed, 0x3e97, 0x2dbe, 0x5789, 0x0000, 0x3ba6,
+0x2b92, 0x22de, 0x5b03, 0x0000, 0x0000, 0x43b3, 0x0000, 0x5ef7,
+0x3403, 0x0000, 0x5175, 0x0000, 0x14c5, 0x3419, 0x0000, 0x5dc8,
+0x392b, 0x03a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c74, 0x0000,
+0x0a4c, 0x4e0a, 0x4e71, 0x0000, 0x1b1d, 0x0000, 0x5a79, 0x0000,
+0x6490, 0x0000, 0x657a, 0x3f04, 0x4213, 0x0000, 0x0000, 0x0000,
+0x2386, 0x25e5, 0x2f9f, 0x3608, 0x4adf, 0x1d0d, 0x5adf, 0x2510,
+0x0000, 0x3627, 0x209c, 0x2158, 0x4543, 0x0000, 0x0000, 0x1592,
+0x3dab, 0x5a27, 0x1d39, 0x0000, 0x0000, 0x2189, 0x315c, 0x3dfb,
+0x0000, 0x2170, 0x295d, 0x563f, 0x433d, 0x0000, 0x0000, 0x2164,
+0x0000, 0x4fe0, 0x0000, 0x01bc, 0x4847, 0x0000, 0x1623, 0x53b3,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x625a,
+0x0b9d, 0x0000, 0x0000, 0x228a, 0x2425, 0x12a0, 0x0000, 0x0000,
+0x0b4d, 0x0bab, 0x43a6, 0x2079, 0x0000, 0x0000, 0x641e, 0x0000,
+0x0000, 0x5963, 0x0000, 0x0000, 0x0000, 0x0000, 0x1518, 0x36a5,
+0x1989, 0x5ff1, 0x0f9d, 0x1a94, 0x3f8b, 0x0000, 0x0000, 0x2c76,
+0x2eab, 0x4b23, 0x0731, 0x562b, 0x0000, 0x0000, 0x0000, 0x5821,
+0x0000, 0x57a9, 0x2f6f, 0x3695, 0x4b0e, 0x4453, 0x0000, 0x3cdd,
+0x0000, 0x0000, 0x0ce4, 0x0000, 0x0000, 0x0000, 0x575b, 0x07fd,
+0x0000, 0x1b98, 0x43bb, 0x0000, 0x5865, 0x0000, 0x16d5, 0x0000,
+0x0000, 0x5da5, 0x4e44, 0x0000, 0x3dbd, 0x121a, 0x63c6, 0x633a,
+0x0000, 0x0000, 0x5b47, 0x56c4, 0x0000, 0x311c, 0x0000, 0x3de1,
+0x0000, 0x2796, 0x2f5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x314c, 0x0000, 0x5cd5, 0x0000, 0x418b, 0x4963, 0x5f60,
+0x1eb9, 0x0000, 0x075b, 0x0000, 0x0000, 0x4029, 0x37c3, 0x0000,
+0x3db4, 0x4aa3, 0x24df, 0x33ed, 0x435a, 0x0000, 0x0000, 0x2cb2,
+0x0000, 0x3184, 0x0000, 0x1186, 0x56f7, 0x0000, 0x0000, 0x1808,
+0x2c4a, 0x4fed, 0x0000, 0x56a2, 0x0e4e, 0x0e64, 0x0e7a, 0x0e90,
+0x0ea6, 0x56e6, 0x0000, 0x3dc9, 0x5933, 0x1ca6, 0x5b27, 0x1791,
+0x0000, 0x0000, 0x5887, 0x324e, 0x0000, 0x08aa, 0x3a90, 0x1f83,
+0x59d7, 0x6311, 0x0000, 0x0000, 0x4462, 0x58b8, 0x44f6, 0x559e,
+0x0000, 0x0000, 0x0000, 0x0000, 0x5953, 0x57ec, 0x1584, 0x4943,
+0x3821, 0x0000, 0x5799, 0x3dd5, 0x0000, 0x4401, 0x5995, 0x0000,
+0x12b3, 0x0bb9, 0x0000, 0x2aa7, 0x39a8, 0x0000, 0x3637, 0x0000,
+0x0f5a, 0x0f2c, 0x0cf8, 0x2034, 0x0000, 0x0000, 0x543d, 0x0000,
+0x0000, 0x3b6e, 0x1881, 0x3ed1, 0x34bb, 0x0000, 0x0000, 0x0000,
+0x0000, 0x371a, 0x5484, 0x3b95, 0x4558, 0x2b78, 0x0000, 0x0000,
+0x0000, 0x505d, 0x3668, 0x5667, 0x45e3, 0x0000, 0x0000, 0x3676,
+0x01ea, 0x50b2, 0x0000, 0x4304, 0x5707, 0x1f4e, 0x0000, 0x0000,
+0x58db, 0x5042, 0x3ec2, 0x0000, 0x5b75, 0x0000, 0x2a58, 0x4b77,
+0x0000, 0x1c39, 0x5366, 0x0000, 0x5943, 0x0000, 0x374a, 0x0000,
+0x0000, 0x0000, 0x5897, 0x3c79, 0x1f0e, 0x4534, 0x0000, 0x0000,
+0x0746, 0x6242, 0x0000, 0x0000, 0x370c, 0x0000, 0x5a47, 0x0000,
+0x5026, 0x50ce, 0x2cd8, 0x0000, 0x3766, 0x13ae, 0x0000, 0x0000,
+0x2d1b, 0x0000, 0x5050, 0x3961, 0x3f2a, 0x0000, 0x59a5, 0x5383,
+0x0d66, 0x0000, 0x2ddf, 0x3d37, 0x0000, 0x3d4a, 0x0000, 0x1023,
+0x1030, 0x103d, 0x467d, 0x3d83, 0x5bd8, 0x5009, 0x00ea, 0x0691,
+0x468d, 0x0000, 0x479a, 0x0000, 0x28e9, 0x069f, 0x0000, 0x50a3,
+0x1c20, 0x463e, 0x0000, 0x4fbd, 0x4524, 0x43e6, 0x3bcd, 0x5033,
+0x0000, 0x0000, 0x0000, 0x097d, 0x465e, 0x0000, 0x0000, 0x0000,
+0x10ae, 0x3971, 0x0000, 0x60c2, 0x44d5, 0x27a7, 0x0000, 0x0000,
+0x2ebd, 0x1e9f, 0x0000, 0x0000, 0x0000, 0x5691, 0x4c71, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x62e7, 0x0000, 0x665f, 0x0000,
+0x45d1, 0x34a1, 0x0000, 0x29e6, 0x3cf0, 0x0242, 0x5132, 0x5e8a,
+0x0000, 0x0000, 0x3079, 0x0000, 0x5729, 0x0000, 0x2e9b, 0x1d2b,
+0x2d2d, 0x0000, 0x0000, 0x0000, 0x4d14, 0x5617, 0x0000, 0x0084,
+0x0000, 0x0cc9, 0x07ea, 0x1602, 0x2e39, 0x3bb3, 0x580f, 0x6286,
+0x46ff, 0x4b48, 0x0000, 0x1bba, 0x4fac, 0x0000, 0x086d, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x16ca, 0x6101, 0x0000, 0x3aae,
+0x1687, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c04, 0x1e63, 0x0000,
+0x385c, 0x0000, 0x0000, 0x0000, 0x345a, 0x0000, 0x0000, 0x4bd4,
+0x0000, 0x0000, 0x5b15, 0x171a, 0x1661, 0x0d8d, 0x0000, 0x4ceb,
+0x0000, 0x2e0f, 0x38ee, 0x64fa, 0x0000, 0x667d, 0x4746, 0x3f59,
+0x0000, 0x0000, 0x0000, 0x4bf5, 0x0000, 0x0c42, 0x0000, 0x0000,
+0x2102, 0x0000, 0x0000, 0x0000, 0x0000, 0x2fb7, 0x5a8b, 0x0000,
+0x0000, 0x4789, 0x37e4, 0x0000, 0x4374, 0x34fd, 0x6390, 0x18d8,
+0x0000, 0x0000, 0x0000, 0x0000, 0x08f7, 0x4495, 0x2d0b, 0x46cd,
+0x0000, 0x0000, 0x4ec9, 0x0000, 0x0000, 0x1e18, 0x0000, 0x321d,
+0x0000, 0x0000, 0x3b60, 0x0000, 0x60f2, 0x0000, 0x07ac, 0x0000,
+0x4ca1, 0x0000, 0x0000, 0x5e63, 0x2890, 0x6634, 0x3a66, 0x0000,
+0x0000, 0x2654, 0x0000, 0x0000, 0x3888, 0x1eab, 0x3f6a, 0x0000,
+0x2d5d, 0x0000, 0x0000, 0x49d5, 0x38fc, 0x1a63, 0x0000, 0x2994,
+0x1ed2, 0x24a4, 0x0000, 0x0411, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x4ad0, 0x0000, 0x0000, 0x1cb6, 0x0000, 0x0000, 0x4a58,
+0x0000, 0x51fd, 0x0000, 0x0000, 0x0000, 0x3b52, 0x23f5, 0x0000,
+0x0000, 0x0000, 0x0000, 0x47aa, 0x0000, 0x3bf5, 0x1d8e, 0x14a5,
+0x11b8, 0x4c91, 0x65b6, 0x0000, 0x52ac, 0x0000, 0x0000, 0x03c0,
+0x2016, 0x65e0, 0x1f9f, 0x2b26, 0x0000, 0x46bb, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5bc7, 0x1632, 0x567d,
+0x5c2c, 0x34ea, 0x0000, 0x1823, 0x0000, 0x3387, 0x0000, 0x2842,
+0x0000, 0x184e, 0x0000, 0x0000, 0x49e4, 0x0000, 0x0000, 0x030c,
+0x0000, 0x488c, 0x0000, 0x29f8, 0x5ce6, 0x2409, 0x1775, 0x0000,
+0x0000, 0x322e, 0x0af5, 0x0000, 0x49b0, 0x0000, 0x0000, 0x0000,
+0x0000, 0x4084, 0x3738, 0x199f, 0x2e58, 0x0000, 0x0000, 0x214d,
+0x5d60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x019e, 0x0000,
+0x0000, 0x2cfa, 0x0000, 0x0000, 0x1784, 0x02e0, 0x3ffd, 0x6120,
+0x1b43, 0x260d, 0x37b3, 0x606d, 0x0000, 0x2a3d, 0x0000, 0x0000,
+0x0000, 0x3f19, 0x0000, 0x0000, 0x2f2d, 0x0000, 0x5653, 0x0000,
+0x0000, 0x0000, 0x0000, 0x490c, 0x14fe, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x4953, 0x1c72, 0x0da2, 0x0000, 0x1d54, 0x0000,
+0x0000, 0x4826, 0x0000, 0x29bd, 0x4fcf, 0x0000, 0x0000, 0x4973,
+0x208f, 0x0000, 0x0000, 0x0000, 0x5581, 0x0000, 0x0000, 0x5ed0,
+0x0000, 0x0000, 0x3dee, 0x0000, 0x2adc, 0x515d, 0x0000, 0x0000,
+0x41af, 0x0000, 0x0000, 0x2419, 0x1c57, 0x2431, 0x243d, 0x2449,
+0x2455, 0x2461, 0x246d, 0x2479, 0x2485, 0x4f51, 0x012a, 0x0000,
+0x0000, 0x0000, 0x0000, 0x2edc, 0x00ca, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x1ff9, 0x099a, 0x0d0c, 0x0000, 0x0ff2,
+0x31b4, 0x5b65, 0x0000, 0x0165, 0x1006, 0x0815, 0x54e0, 0x3c43,
+0x1c7e, 0x0000, 0x2c37, 0x10f6, 0x0000, 0x0000, 0x011d, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1d9b, 0x0000, 0x0000,
+0x0000, 0x0000, 0x4137, 0x0000, 0x166c, 0x576a, 0x4eb2, 0x0000,
+0x0159, 0x0fb0, 0x52e9, 0x31c7, 0x0000, 0x0000, 0x0000, 0x18fe,
+0x0000, 0x17c4, 0x0000, 0x0000, 0x0000, 0x1f75, 0x4ba1, 0x0000,
+0x0000, 0x4629, 0x36ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x48fd,
+0x36c6, 0x0000, 0x36d3, 0x0000, 0x0000, 0x5a17, 0x619c, 0x0000,
+0x0000, 0x0000, 0x36e0, 0x0a62, 0x1f2a, 0x297d, 0x4ef0, 0x0000,
+0x0000, 0x11d2, 0x0000, 0x2bc8, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x2a22, 0x02b2, 0x1e4a, 0x0000,
+0x0000, 0x0000, 0x54f8, 0x0000, 0x1ac3, 0x0000, 0x64ae, 0x1ace,
+0x0000, 0x4c45, 0x0000, 0x0000, 0x10e7, 0x0000, 0x5aad, 0x5f3e,
+0x1aad, 0x0000, 0x2ecd, 0x0000, 0x0000, 0x573b, 0x0000, 0x5e2d,
+0x49c2, 0x0000, 0x15c5, 0x556c, 0x2cc8, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0324, 0x032e, 0x0338, 0x0342, 0x0000, 0x0000, 0x1af0,
+0x0fc0, 0x4b67, 0x0000, 0x3b45, 0x1142, 0x0000, 0x4f17, 0x1930,
+0x0000, 0x424e, 0x2d3d, 0x0000, 0x0000, 0x0000, 0x3869, 0x0000,
+0x3831, 0x5e4e, 0x387b, 0x0000, 0x2d9d, 0x6400, 0x092b, 0x1871,
+0x3842, 0x46ed, 0x384f, 0x5b85, 0x150a, 0x4be5, 0x0000, 0x1ae5,
+0x52fc, 0x0000, 0x0ad0, 0x48db, 0x0000, 0x0000, 0x0000, 0x0000,
+0x00f7, 0x550f, 0x0000, 0x3b30, 0x0000, 0x0000, 0x661a, 0x0000,
+0x0000, 0x2b42, 0x116d, 0x0000, 0x1548, 0x1a89, 0x0000, 0x5f82,
+0x1f02, 0x518d, 0x40e5, 0x4e5b, 0x0000, 0x0001, 0x17de, 0x0000,
+0x0000, 0x3b85, 0x0000, 0x1a1f, 0x0079, 0x00b4, 0x0000, 0x0000,
+0x0000, 0x0000, 0x4c60, 0x3fc1, 0x0000, 0x0000, 0x0000, 0x0000,
+0x3588, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0364, 0x0000,
+0x0000, 0x0000, 0x0000, 0x09b3, 0x0000, 0x2e27, 0x6172, 0x5ea4,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2f0d, 0x0000, 0x11fe,
+0x4c34, 0x660b, 0x0000, 0x12bf, 0x0000, 0x0000, 0x1ad9, 0x0000,
+0x1130, 0x0000, 0x0000, 0x1cc4, 0x0000, 0x4398, 0x353f, 0x549a,
+0x3acc, 0x0000, 0x4991, 0x0000, 0x0ae2, 0x0000, 0x5428, 0x0000,
+0x0000, 0x0000, 0x0fe0, 0x0000, 0x6186, 0x4a18, 0x5b9d, 0x0000,
+0x4506, 0x2c12, 0x0000, 0x3784, 0x2062, 0x0000, 0x52c3, 0x0000,
+0x0000, 0x37a3, 0x2521, 0x0000, 0x0000, 0x1e3e, 0x0000, 0x06ad,
+0x50c0, 0x0000, 0x4368, 0x3ae2, 0x16ff, 0x60d2, 0x3c1f, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c55, 0x352b, 0x0000,
+0x16bf, 0x10bd, 0x111c, 0x0000, 0x0000, 0x06bb, 0x0000, 0x0cb4,
+0x0c2f, 0x0000, 0x5d2b, 0x0000, 0x0258, 0x0000, 0x0000, 0x0000,
+0x09e4, 0x2868, 0x11f0, 0x3471, 0x0000, 0x37f2, 0x0000, 0x0724,
+0x0000, 0x0000, 0x108e, 0x0000, 0x1e30, 0x2d7d, 0x0000, 0x022d,
+0x0000, 0x0000, 0x4711, 0x5fba, 0x0000, 0x11e1, 0x0000, 0x0107,
+0x0000, 0x64bc, 0x14ce, 0x555b, 0x0000, 0x3172, 0x0000, 0x0000,
+0x0000, 0x0000, 0x06e0, 0x0000, 0x0000, 0x59e7, 0x627c, 0x0000,
+0x06ea, 0x0000, 0x0000, 0x3811, 0x006e, 0x5fc8, 0x0000, 0x0000,
+0x0033, 0x372a, 0x61b1, 0x0000, 0x4cff, 0x13c7, 0x668a, 0x182e,
+0x0000, 0x0000, 0x0000, 0x0000, 0x1a79, 0x0000, 0x0000, 0x5e98,
+0x0000, 0x1df0, 0x119e, 0x0000, 0x1ab8, 0x34d1, 0x0000, 0x19ab,
+0x61db, 0x02c6, 0x0000, 0x2911, 0x5f96, 0x0000, 0x42e2, 0x1fdf,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x574b, 0x0000, 0x5eaf,
+0x0000, 0x1eeb, 0x0000, 0x1191, 0x0c02, 0x0000, 0x0000, 0x16a1,
+0x514a, 0x3c5e, 0x3554, 0x308d, 0x5337, 0x0000, 0x45b0, 0x0000,
+0x0000, 0x0000, 0x0b8b, 0x0000, 0x5984, 0x5096, 0x0000, 0x0000,
+0x16f4, 0x0000, 0x5ee9, 0x35a0, 0x0000, 0x5c0a, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x42cc, 0x506b, 0x0000, 0x0000, 0x0000,
+0x3513, 0x0000, 0x3d5d, 0x0000, 0x1b07, 0x00e0, 0x52d6, 0x1b12,
+0x0000, 0x0000, 0x0277, 0x2928, 0x0000, 0x390a, 0x0000, 0x0026,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a0d, 0x4232, 0x0000,
+0x2008, 0x06ca, 0x0000, 0x4198, 0x0000, 0x5416, 0x0000, 0x06d5,
+0x0000, 0x0000, 0x0000, 0x0000, 0x174f, 0x0000, 0x0000, 0x5ede,
+0x5088, 0x0000, 0x0000, 0x0000, 0x6651, 0x6272, 0x0000, 0x5e71,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4161, 0x1e24, 0x0000,
+0x6363, 0x525d, 0x3fec, 0x0000, 0x0000, 0x4f89, 0x2b0e, 0x3431,
+0x4332, 0x3896, 0x0000, 0x0944, 0x0000, 0x6627, 0x0000, 0x2535,
+0x5105, 0x3e19, 0x0283, 0x254f, 0x0000, 0x37d5, 0x170a, 0x1471,
+0x0000, 0x4722, 0x0000, 0x0000, 0x6204, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x6058, 0x3c2d, 0x51a1, 0x4429, 0x5270, 0x07bf,
+0x0000, 0x0000, 0x0000, 0x5323, 0x6156, 0x0000, 0x0000, 0x0000,
+0x1afb, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b35, 0x2a0d, 0x328e,
+0x0185, 0x4df4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ac2, 0x0048,
+0x1d83, 0x1526, 0x0000, 0x0000, 0x1aa2, 0x6110, 0x0000, 0x1b2e,
+0x16e5, 0x2dce, 0x0000, 0x0000, 0x1f67, 0x62be, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x51b4, 0x0000, 0x0000, 0x6552, 0x20ae,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1d76, 0x0000,
+0x0210, 0x0000, 0x40b8, 0x0000, 0x19b6, 0x0000, 0x356b, 0x19c1,
+0x0000, 0x4a47, 0x0000, 0x0000, 0x5310, 0x0000, 0x03cb, 0x2332,
+0x1744, 0x0960, 0x0000, 0x4a77, 0x0000
+};
+#endif /* NEEDKTABLE */
+
+#ifdef NEEDVTABLE
+#define VTABLESIZE 2341
+#define VMAXHASH 9
+
+static const unsigned short hashKeysym[VTABLESIZE] = {
+0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x5f76, 0x0000, 0x5f84, 0x0000, 0x5fa3, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x4df6, 0x0000, 0x0000, 0x0000, 0x4939, 0x0000,
+0x117e, 0x1188, 0x1193, 0x11a0, 0x11af, 0x11ba, 0x11c6, 0x11d4,
+0x11f2, 0x1200, 0x120f, 0x121c, 0x1225, 0x122f, 0x1239, 0x1244,
+0x124e, 0x1254, 0x125a, 0x1260, 0x1266, 0x126c, 0x1272, 0x1278,
+0x127e, 0x1284, 0x128a, 0x1294, 0x12a2, 0x12ab, 0x12b5, 0x12c1,
+0x12ce, 0x12d5, 0x12db, 0x12e1, 0x12e7, 0x12ed, 0x12f3, 0x12f9,
+0x12ff, 0x1305, 0x130b, 0x1311, 0x1317, 0x131d, 0x1323, 0x1329,
+0x132f, 0x1335, 0x133b, 0x1341, 0x1347, 0x134d, 0x1353, 0x1359,
+0x135f, 0x1365, 0x136b, 0x1371, 0x1381, 0x138f, 0x13a0, 0x13b0,
+0x13bf, 0x13d7, 0x13dd, 0x13e3, 0x13e9, 0x13ef, 0x13f5, 0x13fb,
+0x1401, 0x1407, 0x140d, 0x1413, 0x1419, 0x141f, 0x1425, 0x142b,
+0x1431, 0x1437, 0x143d, 0x1443, 0x1449, 0x144f, 0x1455, 0x145b,
+0x1461, 0x1467, 0x146d, 0x1473, 0x1481, 0x1489, 0x1498, 0x0000,
+0x4c25, 0x4a49, 0x4c36, 0x0000, 0x4c47, 0x0000, 0x2018, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2028, 0x56d7, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x2036, 0x0000, 0x56f9, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x14a7, 0x14b8, 0x14c7, 0x14d0, 0x14dd, 0x14ea, 0x14f2, 0x1500,
+0x150c, 0x151a, 0x1528, 0x1538, 0x154a, 0x1556, 0x1561, 0x1570,
+0x157b, 0x1586, 0x1594, 0x15a4, 0x15b6, 0x15c0, 0x15c7, 0x15d5,
+0x15e8, 0x15f4, 0x1604, 0x1612, 0x1625, 0x1634, 0x1640, 0x1652,
+0x1663, 0x166e, 0x1679, 0x1689, 0x1694, 0x16a3, 0x16ad, 0x16b4,
+0x16c1, 0x16cc, 0x16d7, 0x16e7, 0x16f6, 0x1701, 0x170c, 0x171c,
+0x172b, 0x173b, 0x1746, 0x1751, 0x175c, 0x176c, 0x1777, 0x1786,
+0x1793, 0x17a0, 0x17ab, 0x17b6, 0x17c6, 0x17d5, 0x17e0, 0x17f4,
+0x17ff, 0x180a, 0x1815, 0x1825, 0x1830, 0x183f, 0x1849, 0x1850,
+0x185d, 0x1868, 0x1873, 0x1883, 0x1892, 0x189d, 0x18a8, 0x18b8,
+0x18c7, 0x18cf, 0x18da, 0x18e5, 0x18f0, 0x1900, 0x190b, 0x191a,
+0x1927, 0x1932, 0x193d, 0x1948, 0x1958, 0x1967, 0x1972, 0x197c,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62fe, 0x1f10,
+0x6572, 0x0000, 0x1f1e, 0x0000, 0x6328, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1f2c, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x1f3a, 0x0000, 0x63aa, 0x0000,
+0x0000, 0x0000, 0x1f45, 0x0000, 0x63c8, 0x1f50, 0x0000, 0x63d7,
+0x1f5e, 0x0000, 0x63e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x1f69, 0x0000, 0x6420, 0x1f77,
+0x0000, 0x0000, 0x0000, 0x0000, 0x6444, 0x0000, 0x0000, 0x0000,
+0x1f85, 0x0000, 0x6460, 0x1f93, 0x0000, 0x0000, 0x661c, 0x0000,
+0x6474, 0x1fa1, 0x6636, 0x0000, 0x1faf, 0x2046, 0x6492, 0x1fba,
+0x0000, 0x0000, 0x1fc8, 0x0000, 0x64b0, 0x1fd3, 0x668c, 0x0000,
+0x1fe1, 0x0000, 0x64cc, 0x1fec, 0x0000, 0x0000, 0x1ffb, 0x0000,
+0x0000, 0x200a, 0x5a49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x2064, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x2074, 0x207b, 0x2082, 0x3c89, 0x5a9f, 0x3c93,
+0x0000, 0x3ca4, 0x0000, 0x3cb5, 0x3dcb, 0x3cbc, 0x3de3, 0x3cc3,
+0x3dfd, 0x3cca, 0x3e1b, 0x3e29, 0x3e37, 0x3e42, 0x0000, 0x3cd1,
+0x0000, 0x3cd8, 0x3e6a, 0x3cdf, 0x3e8b, 0x3cf2, 0x3ea6, 0x3d04,
+0x3ec4, 0x3d15, 0x3ee0, 0x3d27, 0x0000, 0x3d39, 0x3efa, 0x3d4c,
+0x3f1b, 0x3d5f, 0x3f42, 0x3d72, 0x0000, 0x3d85, 0x3f4d, 0x3d98,
+0x3f6c, 0x198b, 0x1997, 0x19a1, 0x3f8d, 0x19ad, 0x19b8, 0x3dbf,
+0x3fd8, 0x19c3, 0x19ce, 0x19db, 0x19e6, 0x4044, 0x19f1, 0x19fc,
+0x0000, 0x1a0a, 0x1a16, 0x1a21, 0x409e, 0x1a2d, 0x1a38, 0x1a43,
+0x40e7, 0x1a4d, 0x1a58, 0x1a65, 0x1a70, 0x1a7b, 0x1a8b, 0x1a96,
+0x1aa4, 0x419a, 0x41b1, 0x1aaf, 0x41dc, 0x1aba, 0x1ac5, 0x4215,
+0x1ad0, 0x422a, 0x1adb, 0x4234, 0x1ae7, 0x4250, 0x4261, 0x1af2,
+0x1afd, 0x1b09, 0x1b14, 0x42af, 0x42c0, 0x1b1f, 0x42e4, 0x42fc,
+0x1b30, 0x1b3b, 0x4334, 0x1b45, 0x0000, 0x0000, 0x1b56, 0x0000,
+0x1b63, 0x0000, 0x0000, 0x1b6e, 0x0000, 0x1b79, 0x1b84, 0x0000,
+0x1b8f, 0x0000, 0x1b9a, 0x0000, 0x1ba6, 0x0000, 0x0000, 0x1bb1,
+0x1bbc, 0x1bc8, 0x1bd3, 0x0000, 0x0000, 0x1bde, 0x4ef2, 0x0000,
+0x1c00, 0x1c0b, 0x0000, 0x1bef, 0x4f2e, 0x0000, 0x1c15, 0x1c22,
+0x4f53, 0x0000, 0x4f64, 0x0000, 0x4f75, 0x0000, 0x4f8b, 0x0000,
+0x4f9c, 0x2056, 0x4fae, 0x442b, 0x4fbf, 0x0000, 0x4444, 0x0000,
+0x0000, 0x4455, 0x0000, 0x0000, 0x4474, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x505f, 0x0000, 0x0000, 0x0000, 0x507c, 0x0000,
+0x508a, 0x0000, 0x5098, 0x0000, 0x50a5, 0x0000, 0x50b4, 0x0000,
+0x50c2, 0x0000, 0x456a, 0x0000, 0x50de, 0x0000, 0x0000, 0x0000,
+0x50fa, 0x0000, 0x0000, 0x0000, 0x511b, 0x0000, 0x5134, 0x0000,
+0x514c, 0x0000, 0x515f, 0x0000, 0x5177, 0x0000, 0x518f, 0x0000,
+0x51a3, 0x0000, 0x51b6, 0x0000, 0x51cf, 0x0000, 0x51e7, 0x0000,
+0x4640, 0x0000, 0x5216, 0x4660, 0x522e, 0x0000, 0x467f, 0x5486,
+0x549c, 0x54b5, 0x5272, 0x54fa, 0x5511, 0x552d, 0x529c, 0x555d,
+0x52ae, 0x55b1, 0x52c5, 0x55d9, 0x52d8, 0x5619, 0x52eb, 0x5669,
+0x52fe, 0x4f3e, 0x5312, 0x56c6, 0x5325, 0x56e8, 0x5339, 0x5709,
+0x534c, 0x572b, 0x3da2, 0x574d, 0x5385, 0x3dad, 0x53a2, 0x578b,
+0x3db6, 0x57ab, 0x53d2, 0x57cc, 0x53f0, 0x57ee, 0x433f, 0x5811,
+0x5418, 0x434d, 0x542a, 0x435c, 0x436a, 0x5878, 0x545e, 0x5899,
+0x58a9, 0x58ba, 0x58cb, 0x58dd, 0x58ef, 0x5901, 0x5913, 0x5924,
+0x5477, 0x5945, 0x5955, 0x5965, 0x5975, 0x5986, 0x5997, 0x59a7,
+0x59b7, 0x59c8, 0x59d9, 0x4376, 0x59f9, 0x4382, 0x438f, 0x439a,
+0x5a39, 0x1c2f, 0x5a59, 0x5a6a, 0x5a7b, 0x43b5, 0x1c3b, 0x43bd,
+0x5abf, 0x1c4b, 0x43d1, 0x1c59, 0x1c64, 0x5b17, 0x43dc, 0x5b39,
+0x5b49, 0x1c74, 0x5b67, 0x43f5, 0x5b87, 0x4403, 0x1c80, 0x4410,
+0x0000, 0x1c90, 0x0000, 0x1c9d, 0x1ca8, 0x0000, 0x0000, 0x5583,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1cb8, 0x1cc6, 0x0000,
+0x0000, 0x55c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1cd6, 0x0000, 0x441d,
+0x1ce4, 0x0000, 0x0000, 0x0000, 0x0000, 0x1cf4, 0x1cff, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1d0f, 0x1d1d, 0x5693,
+0x0000, 0x0000, 0x0000, 0x0000, 0x56a4, 0x0000, 0x0000, 0x0000,
+0x0000, 0x56b5, 0x0000, 0x0000, 0x0000, 0x1d2d, 0x0000, 0x0000,
+0x1d3b, 0x0000, 0x0000, 0x3dd7, 0x0000, 0x1d4b, 0x1d56, 0x3df0,
+0x0000, 0x0000, 0x0000, 0x3e0c, 0x0000, 0x5ad0, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x5548, 0x0000, 0x0000, 0x3e4d,
+0x0000, 0x0000, 0x0000, 0x3e5d, 0x0000, 0x65b8, 0x0000, 0x3e7e,
+0x0000, 0x573d, 0x0000, 0x3e99, 0x0000, 0x0000, 0x0000, 0x3eb4,
+0x0000, 0x0000, 0x0000, 0x3ed3, 0x0000, 0x0000, 0x0000, 0x3eef,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x577b, 0x0000, 0x3f06,
+0x657c, 0x5fae, 0x5fbc, 0x3f2c, 0x5fd4, 0x5fde, 0x5ff3, 0x579b,
+0x601d, 0x6032, 0x6046, 0x605a, 0x606f, 0x6084, 0x609c, 0x3f5b,
+0x60c4, 0x60d4, 0x60e4, 0x3f7c, 0x6103, 0x6112, 0x6122, 0x6132,
+0x6145, 0x6158, 0x6166, 0x3f9b, 0x617e, 0x3fad, 0x6193, 0x3fc3,
+0x61b3, 0x61c8, 0x61dd, 0x3fee, 0x6206, 0x3fff, 0x622f, 0x4013,
+0x625c, 0x402b, 0x627e, 0x6288, 0x6296, 0x405c, 0x62b2, 0x4075,
+0x62ca, 0x62d4, 0x62e9, 0x4086, 0x6313, 0x4092, 0x633c, 0x6350,
+0x6365, 0x637a, 0x6392, 0x40ad, 0x63b9, 0x40ba, 0x5856, 0x40cf,
+0x63f4, 0x6402, 0x6411, 0x4100, 0x6432, 0x4113, 0x6452, 0x4124,
+0x646a, 0x4139, 0x6483, 0x4150, 0x64a1, 0x4163, 0x64be, 0x4177,
+0x64db, 0x418d, 0x64fc, 0x6590, 0x65a4, 0x650e, 0x5bb9, 0x41c6,
+0x5bda, 0x5beb, 0x5bfc, 0x41f4, 0x5c1d, 0x4204, 0x5c3f, 0x5c4f,
+0x5c60, 0x421e, 0x5c82, 0x5c93, 0x5ca3, 0x5cb4, 0x5cc6, 0x5cd7,
+0x5ce8, 0x4245, 0x5d09, 0x5d1b, 0x5d2d, 0x5d3f, 0x5d50, 0x426f,
+0x5d74, 0x427f, 0x1d66, 0x1d78, 0x5db9, 0x1d85, 0x1d90, 0x5ded,
+0x5dfd, 0x5e0e, 0x1d9d, 0x1da9, 0x1db6, 0x0000, 0x0000, 0x0000,
+0x0000, 0x4306, 0x0000, 0x1dc1, 0x0000, 0x1dce, 0x1dd9, 0x0000,
+0x0000, 0x0000, 0x1de6, 0x1df2, 0x1dff, 0x1e0a, 0x4497, 0x1e12,
+0x1e1a, 0x44d7, 0x44f8, 0x4517, 0x4536, 0x4545, 0x455a, 0x1e26,
+0x457b, 0x458f, 0x459e, 0x45b2, 0x1e32, 0x45e5, 0x45f5, 0x1e40,
+0x4616, 0x1e4c, 0x1e59, 0x1e65, 0x468f, 0x469f, 0x0000, 0x0000,
+0x0000, 0x1e72, 0x0000, 0x0000, 0x0000, 0x1e7e, 0x1e89, 0x0000,
+0x1e95, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ea1,
+0x0000, 0x0000, 0x60f4, 0x0000, 0x1ead, 0x0000, 0x0000, 0x1ebb,
+0x0000, 0x1ec7, 0x1ed4, 0x1ee0, 0x0000, 0x0000, 0x0000, 0x0000,
+0x666d, 0x1eed, 0x0000, 0x0000, 0x0000, 0x1ef9, 0x1f04, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x6174, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x57dd, 0x0000, 0x0000, 0x4fd1, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x61f2, 0x0000, 0x57ff, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x621a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x6244, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x6274, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x5f40, 0x62a4, 0x0000, 0x5b58, 0x0000, 0x0000, 0x46ef,
+0x5e50, 0x5e65, 0x62c0, 0x5e73, 0x5e81, 0x5e8c, 0x5e93, 0x5e9a,
+0x5ea6, 0x0000, 0x0000, 0x0000, 0x0000, 0x5eb1, 0x0000, 0x0000,
+0x5ebd, 0x5ed2, 0x5ee0, 0x5eeb, 0x5ef9, 0x5f04, 0x5f0b, 0x5f12,
+0x5f1e, 0x0000, 0x0000, 0x5f29, 0x0000, 0x5f34, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x46cf, 0x46de, 0x2091, 0x4701,
+0x4713, 0x4724, 0x4738, 0x4748, 0x4759, 0x476b, 0x477d, 0x478b,
+0x479c, 0x47ac, 0x47bd, 0x47ce, 0x47df, 0x47f6, 0x480a, 0x4819,
+0x4828, 0x4837, 0x4849, 0x485c, 0x486e, 0x487c, 0x488e, 0x489d,
+0x48af, 0x48bd, 0x48ce, 0x48dd, 0x48f1, 0x48ff, 0x490e, 0x491d,
+0x4929, 0x209e, 0x20b0, 0x20c8, 0x20e0, 0x20ef, 0x2117, 0x2123,
+0x212e, 0x2139, 0x2144, 0x214f, 0x215a, 0x2166, 0x2172, 0x217e,
+0x2197, 0x21aa, 0x21b5, 0x21c0, 0x21cb, 0x21d6, 0x21e1, 0x21ed,
+0x21f9, 0x2205, 0x2211, 0x221d, 0x2229, 0x2236, 0x2242, 0x224e,
+0x225a, 0x2266, 0x227f, 0x2298, 0x22a4, 0x22b0, 0x22bc, 0x22c8,
+0x22d4, 0x22e0, 0x22ec, 0x22f8, 0x2304, 0x231c, 0x2328, 0x2334,
+0x2340, 0x234c, 0x2358, 0x2364, 0x2370, 0x237c, 0x2388, 0x2394,
+0x23a0, 0x23ac, 0x23b8, 0x23c4, 0x23d0, 0x23dc, 0x23e7, 0x23f7,
+0x0000, 0x49e6, 0x0000, 0x0000, 0x4945, 0x5368, 0x0000, 0x4a0a,
+0x0000, 0x4955, 0x4a1a, 0x576c, 0x0000, 0x4a29, 0x4965, 0x0000,
+0x4a39, 0x53b5, 0x0000, 0x4975, 0x0000, 0x57bb, 0x4a5a, 0x0000,
+0x4984, 0x4a69, 0x652a, 0x0000, 0x4a79, 0x4993, 0x0000, 0x0000,
+0x0000, 0x5823, 0x49a4, 0x5834, 0x0000, 0x5845, 0x0000, 0x49b2,
+0x4a8a, 0x5867, 0x6554, 0x4aa5, 0x49c4, 0x5889, 0x4ab3, 0x0000,
+0x0000, 0x49d7, 0x5c2e, 0x0000, 0x4ad2, 0x0000, 0x5f4a, 0x4ae1,
+0x0000, 0x0000, 0x4af8, 0x49fa, 0x0000, 0x4b10, 0x65cb, 0x0000,
+0x4b25, 0x5935, 0x5c71, 0x4b37, 0x0000, 0x0000, 0x4b4a, 0x0000,
+0x0000, 0x4b59, 0x0000, 0x0000, 0x4b69, 0x0000, 0x0000, 0x4b79,
+0x0000, 0x65e2, 0x4b8e, 0x65fc, 0x660d, 0x4ba3, 0x6629, 0x59e9,
+0x6644, 0x6653, 0x6661, 0x5a09, 0x667f, 0x5a19, 0x4bb5, 0x5a29,
+0x0000, 0x4bc5, 0x0000, 0x43a8, 0x4bd6, 0x0000, 0x0000, 0x4be7,
+0x0000, 0x0000, 0x4bf7, 0x5a8d, 0x0000, 0x4c06, 0x0000, 0x5aaf,
+0x4c15, 0x0000, 0x0000, 0x43c6, 0x0000, 0x5ae1, 0x0000, 0x5af3,
+0x0000, 0x5b05, 0x5d62, 0x0000, 0x0000, 0x5b29, 0x0000, 0x0000,
+0x0000, 0x0000, 0x5d85, 0x43e8, 0x0000, 0x0000, 0x4ac2, 0x5b77,
+0x0000, 0x0000, 0x5da7, 0x5b9f, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x5dca, 0x3804, 0x0000, 0x4290, 0x3813, 0x0000,
+0x42a0, 0x3823, 0x0000, 0x0000, 0x4d90, 0x4da2, 0x4db9, 0x3851,
+0x4de0, 0x42ce, 0x385e, 0x4e1e, 0x4e35, 0x4e46, 0x4e5d, 0x4e73,
+0x4e89, 0x4e9e, 0x4eb4, 0x4ecb, 0x4ee1, 0x431d, 0x4f03, 0x4f19,
+0x241b, 0x2427, 0x2433, 0x243f, 0x244b, 0x2457, 0x2463, 0x246f,
+0x247b, 0x2487, 0x4fe2, 0x4fef, 0x4ffd, 0x500b, 0x501a, 0x5028,
+0x5035, 0x5044, 0x5052, 0x390c, 0x506d, 0x2493, 0x24a6, 0x24c2,
+0x24d2, 0x24e1, 0x24f2, 0x2502, 0x2512, 0x50ec, 0x2523, 0x5107,
+0x2537, 0x2544, 0x2551, 0x255e, 0x256b, 0x2578, 0x2585, 0x2592,
+0x259f, 0x25ac, 0x51ff, 0x25b9, 0x4c57, 0x5247, 0x525f, 0x25ce,
+0x5285, 0x25e7, 0x25f8, 0x260f, 0x2626, 0x263c, 0x2656, 0x266c,
+0x267c, 0x268b, 0x26a1, 0x26b0, 0x26c0, 0x26d0, 0x26df, 0x26ef,
+0x26fe, 0x270e, 0x271c, 0x272c, 0x273c, 0x274d, 0x275c, 0x276b,
+0x277a, 0x2789, 0x2798, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x27a9, 0x27bc, 0x27cb, 0x27da, 0x27e9, 0x27f8, 0x2808, 0x2818,
+0x2835, 0x2844, 0x285b, 0x286a, 0x287e, 0x2892, 0x28a6, 0x28b7,
+0x28c8, 0x28d9, 0x28eb, 0x28fc, 0x2913, 0x292a, 0x2941, 0x2950,
+0x295f, 0x2970, 0x297f, 0x2996, 0x29b1, 0x29bf, 0x29d4, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0f8c, 0x0f9f, 0x0fb2, 0x0fc2, 0x0fd1, 0x0fe2,
+0x0ff4, 0x1008, 0x1017, 0x1025, 0x1032, 0x103f, 0x104c, 0x105a,
+0x1068, 0x107d, 0x1090, 0x10a2, 0x10b0, 0x10bf, 0x10cd, 0x10db,
+0x10e9, 0x10f8, 0x1108, 0x111e, 0x1132, 0x1144, 0x115a, 0x116f,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5fca,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6008,
+0x0000, 0x0000, 0x0000, 0x65ee, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x60b4,
+0x29fa, 0x2a24, 0x2a5a, 0x2a8e, 0x2ac4, 0x2af8, 0x2b28, 0x2b60,
+0x2b94, 0x2bca, 0x2c02, 0x0000, 0x2c26, 0x2c4c, 0x2c78, 0x2c9e,
+0x2a0f, 0x2a3f, 0x2a74, 0x2aa9, 0x2ade, 0x2b10, 0x2b44, 0x2b7a,
+0x2baf, 0x2be6, 0x2c14, 0x6188, 0x2c39, 0x2c62, 0x2c8b, 0x2cb4,
+0x3b87, 0x2cca, 0x2cda, 0x2cec, 0x2cfc, 0x2d1d, 0x2d2f, 0x2d4e,
+0x2d6f, 0x2d8e, 0x2daf, 0x2dd0, 0x2de1, 0x2df3, 0x2e11, 0x2e29,
+0x2e4b, 0x2e5a, 0x2e6a, 0x2e7c, 0x2e8c, 0x2ead, 0x2ebf, 0x2ede,
+0x2eff, 0x2f1e, 0x2f3f, 0x2f60, 0x2f71, 0x2f83, 0x2fa1, 0x2fb9,
+0x2fdb, 0x2feb, 0x2ffa, 0x300a, 0x301b, 0x302b, 0x303b, 0x304b,
+0x305c, 0x306c, 0x307b, 0x308f, 0x309f, 0x30af, 0x30bf, 0x30cf,
+0x30de, 0x30ee, 0x30fe, 0x310e, 0x311e, 0x312e, 0x313d, 0x314e,
+0x315e, 0x3174, 0x3186, 0x3196, 0x31a7, 0x31b6, 0x31c9, 0x31da,
+0x31f0, 0x3200, 0x320f, 0x321f, 0x3230, 0x3240, 0x3250, 0x3260,
+0x3271, 0x3281, 0x3290, 0x32a4, 0x32b4, 0x32c4, 0x32d4, 0x32e4,
+0x32f3, 0x3303, 0x3313, 0x3323, 0x3333, 0x3343, 0x3352, 0x3363,
+0x3373, 0x3389, 0x339b, 0x33ab, 0x33bc, 0x33cb, 0x33de, 0x33ef,
+0x0000, 0x0000, 0x0000, 0x64ea, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x651c, 0x0000, 0x5bc9,
+0x54e2, 0x6534, 0x0000, 0x653e, 0x0000, 0x6549, 0x0000, 0x5c0c,
+0x0000, 0x655e, 0x0726, 0x0733, 0x0748, 0x075d, 0x0772, 0x079a,
+0x07ae, 0x07c1, 0x07d4, 0x07ec, 0x07ff, 0x0817, 0x082b, 0x0844,
+0x0857, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5603, 0x0000,
+0x0000, 0x0000, 0x0000, 0x5cf9, 0x5641, 0x0000, 0x0000, 0x0000,
+0x0000, 0x086f, 0x0880, 0x0895, 0x08ac, 0x08c4, 0x08de, 0x08f9,
+0x0915, 0x092d, 0x0946, 0x0962, 0x097f, 0x099c, 0x09b5, 0x09cf,
+0x09e6, 0x09ff, 0x0a1c, 0x0a3c, 0x0a4e, 0x0a64, 0x0000, 0x0000,
+0x3a35, 0x0000, 0x5719, 0x0000, 0x3a4e, 0x5e1e, 0x0000, 0x5e2f,
+0x3a68, 0x5e40, 0x4dcf, 0x0000, 0x3a7d, 0x3b97, 0x575d, 0x0000,
+0x3a92, 0x0000, 0x0000, 0x4e0c, 0x3ab0, 0x0000, 0x0000, 0x0000,
+0x3ace, 0x0a72, 0x0a81, 0x0a90, 0x0aa4, 0x0ab3, 0x0ac3, 0x0ad2,
+0x0ae4, 0x0af7, 0x0b0a, 0x0b1f, 0x0b2e, 0x0b3f, 0x0b4f, 0x0b5d,
+0x0b73, 0x0b8d, 0x0b9f, 0x0bad, 0x5407, 0x0000, 0x0000, 0x44ba,
+0x4cdc, 0x44c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c45, 0x0000,
+0x0000, 0x0c31, 0x0c44, 0x0c60, 0x0c76, 0x0c8a, 0x0ca0, 0x0cb6,
+0x0ccb, 0x0ce6, 0x0cfa, 0x0d0e, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x45c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4608,
+0x0000, 0x3405, 0x341b, 0x3433, 0x3447, 0x345c, 0x0000, 0x3473,
+0x348b, 0x34a3, 0x0000, 0x34bd, 0x0000, 0x0000, 0x34d3, 0x34ec,
+0x0000, 0x34ff, 0x3515, 0x352d, 0x3541, 0x3556, 0x356d, 0x358a,
+0x35a2, 0x35ba, 0x35d4, 0x35f4, 0x39fd, 0x0000, 0x0000, 0x0000,
+0x0000, 0x360a, 0x361a, 0x3629, 0x3639, 0x3649, 0x365b, 0x366a,
+0x3678, 0x3688, 0x3697, 0x36a7, 0x36c8, 0x36d5, 0x36e2, 0x36ef,
+0x3701, 0x370e, 0x371c, 0x0000, 0x372c, 0x373a, 0x374c, 0x375a,
+0x3768, 0x3776, 0x3ae4, 0x0000, 0x3c52, 0x0000, 0x50d0, 0x0000,
+0x0000, 0x3786, 0x3796, 0x37a5, 0x37b5, 0x37c5, 0x37d7, 0x37e6,
+0x37f4, 0x0bbb, 0x0bd4, 0x0bec, 0x3844, 0x0c04, 0x0c1c, 0x386b,
+0x387d, 0x388a, 0x3898, 0x38a8, 0x38c2, 0x38d0, 0x38e2, 0x38f0,
+0x38fe, 0x0d25, 0x0d36, 0x0d48, 0x0d57, 0x0d68, 0x0d7b, 0x0d8f,
+0x0da4, 0x0dba, 0x0dd2, 0x0de6, 0x0dfa, 0x0e0e, 0x0e22, 0x0e36,
+0x0e50, 0x0e66, 0x0e7c, 0x0e92, 0x0ea8, 0x0ebe, 0x0ed4, 0x0ee6,
+0x0ef8, 0x0f0a, 0x0f2e, 0x0f45, 0x0f5c, 0x0f74, 0x0f1c, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x393d, 0x0012, 0x0020, 0x0028, 0x0035, 0x3bc1, 0x003f, 0x0000,
+0x3983, 0x0000, 0x0000, 0x0000, 0x004a, 0x0054, 0x0064, 0x0000,
+0x39d5, 0x0000, 0x39eb, 0x0000, 0x0070, 0x619e, 0x3a0f, 0x0000,
+0x3a22, 0x0086, 0x00e2, 0x00ec, 0x00f9, 0x0114, 0x011f, 0x012c,
+0x0139, 0x014f, 0x015b, 0x0167, 0x017b, 0x0187, 0x0192, 0x01a0,
+0x01af, 0x01be, 0x3afa, 0x4c62, 0x4c73, 0x4c82, 0x4c93, 0x4ca3,
+0x0094, 0x4cca, 0x3c12, 0x4ced, 0x4d01, 0x00a2, 0x00b6, 0x00cc,
+0x4d6b, 0x543f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x3c6c, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b7d, 0x0000,
+0x0000, 0x01f9, 0x0202, 0x020b, 0x0212, 0x021c, 0x0225, 0x023b,
+0x0252, 0x025a, 0x0000, 0x0000, 0x0000, 0x0000, 0x3ba8, 0x0000,
+0x3bb5, 0x0264, 0x026f, 0x0279, 0x0285, 0x0000, 0x0290, 0x0299,
+0x02a2, 0x02ab, 0x02b4, 0x02bf, 0x02c8, 0x0000, 0x0000, 0x0000,
+0x3bcf, 0x0000, 0x0000, 0x0000, 0x3c7b, 0x0000, 0x0000, 0x0000,
+0x3bdb, 0x0000, 0x3bea, 0x0000, 0x3bf7, 0x0000, 0x3c08, 0x02d2,
+0x02f4, 0x0301, 0x3c21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x6568, 0x392d, 0x030e, 0x3950, 0x3963, 0x3973, 0x0319, 0x3995,
+0x39aa, 0x39bf, 0x0326, 0x0330, 0x033a, 0x0344, 0x034e, 0x035a,
+0x0366, 0x0370, 0x037d, 0x0389, 0x03a5, 0x03c2, 0x03cd, 0x03da,
+0x03e8, 0x0000, 0x3c2f, 0x0000, 0x3b13, 0x3b25, 0x3b32, 0x3b47,
+0x3b54, 0x3b62, 0x3b70, 0x0403, 0x0413, 0x041e, 0x042f, 0x043f,
+0x044e, 0x045c, 0x0465, 0x046e, 0x0477, 0x0480, 0x0489, 0x0492,
+0x049b, 0x04a4, 0x04ad, 0x0000, 0x3c60, 0x0000, 0x03f6, 0x04b6,
+0x04bd, 0x04c4, 0x04cb, 0x04d2, 0x04d9, 0x04e0, 0x04e7, 0x04ee,
+0x04f5, 0x04fd, 0x050c, 0x051b, 0x052a, 0x0539, 0x0548, 0x0557,
+0x0566, 0x0575, 0x0584, 0x0594, 0x05a3, 0x05b2, 0x05c1, 0x05d0,
+0x05df, 0x05ee, 0x05fd, 0x060c, 0x061b, 0x062b, 0x063b, 0x064b,
+0x065b, 0x066b, 0x067b, 0x0687, 0x0693, 0x06a1, 0x06af, 0x06bd,
+0x06cc, 0x06d7, 0x06e2, 0x06ec, 0x06f6, 0x0702, 0x070e, 0x071a,
+0x0000, 0x5d96, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f54,
+0x0000, 0x5f62, 0x0000, 0x5f98, 0x0000, 0x0000, 0x0000, 0x0000,
+0x007b, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ddc, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+#endif /* NEEDVTABLE */
diff --git a/console-client/xkb/kstoucs.c b/console-client/xkb/kstoucs.c
new file mode 100644
index 00000000..03a3ce81
--- /dev/null
+++ b/console-client/xkb/kstoucs.c
@@ -0,0 +1,317 @@
+/* $XFree86: xc/lib/X11/imKStoUCS.c,v 1.2 2001/07/25 15:04:45 dawes Exp $ */
+
+static unsigned short const keysym_to_unicode_1a1_1ff[] = {
+ 0x0104, 0x02d8, 0x0141, 0x0000, 0x013d, 0x015a, 0x0000, /* 0x01a0-0x01a7 */
+ 0x0000, 0x0160, 0x015e, 0x0164, 0x0179, 0x0000, 0x017d, 0x017b, /* 0x01a8-0x01af */
+ 0x0000, 0x0105, 0x02db, 0x0142, 0x0000, 0x013e, 0x015b, 0x02c7, /* 0x01b0-0x01b7 */
+ 0x0000, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, /* 0x01b8-0x01bf */
+ 0x0154, 0x0000, 0x0000, 0x0102, 0x0000, 0x0139, 0x0106, 0x0000, /* 0x01c0-0x01c7 */
+ 0x010c, 0x0000, 0x0118, 0x0000, 0x011a, 0x0000, 0x0000, 0x010e, /* 0x01c8-0x01cf */
+ 0x0110, 0x0143, 0x0147, 0x0000, 0x0000, 0x0150, 0x0000, 0x0000, /* 0x01d0-0x01d7 */
+ 0x0158, 0x016e, 0x0000, 0x0170, 0x0000, 0x0000, 0x0162, 0x0000, /* 0x01d8-0x01df */
+ 0x0155, 0x0000, 0x0000, 0x0103, 0x0000, 0x013a, 0x0107, 0x0000, /* 0x01e0-0x01e7 */
+ 0x010d, 0x0000, 0x0119, 0x0000, 0x011b, 0x0000, 0x0000, 0x010f, /* 0x01e8-0x01ef */
+ 0x0111, 0x0144, 0x0148, 0x0000, 0x0000, 0x0151, 0x0000, 0x0000, /* 0x01f0-0x01f7 */
+ 0x0159, 0x016f, 0x0000, 0x0171, 0x0000, 0x0000, 0x0163, 0x02d9 /* 0x01f8-0x01ff */
+};
+
+static unsigned short const keysym_to_unicode_2a1_2fe[] = {
+ 0x0126, 0x0000, 0x0000, 0x0000, 0x0000, 0x0124, 0x0000, /* 0x02a0-0x02a7 */
+ 0x0000, 0x0130, 0x0000, 0x011e, 0x0134, 0x0000, 0x0000, 0x0000, /* 0x02a8-0x02af */
+ 0x0000, 0x0127, 0x0000, 0x0000, 0x0000, 0x0000, 0x0125, 0x0000, /* 0x02b0-0x02b7 */
+ 0x0000, 0x0131, 0x0000, 0x011f, 0x0135, 0x0000, 0x0000, 0x0000, /* 0x02b8-0x02bf */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x010a, 0x0108, 0x0000, /* 0x02c0-0x02c7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x02c8-0x02cf */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0120, 0x0000, 0x0000, /* 0x02d0-0x02d7 */
+ 0x011c, 0x0000, 0x0000, 0x0000, 0x0000, 0x016c, 0x015c, 0x0000, /* 0x02d8-0x02df */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x010b, 0x0109, 0x0000, /* 0x02e0-0x02e7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x02e8-0x02ef */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0121, 0x0000, 0x0000, /* 0x02f0-0x02f7 */
+ 0x011d, 0x0000, 0x0000, 0x0000, 0x0000, 0x016d, 0x015d /* 0x02f8-0x02ff */
+};
+
+static unsigned short const keysym_to_unicode_3a2_3fe[] = {
+ 0x0138, 0x0156, 0x0000, 0x0128, 0x013b, 0x0000, /* 0x03a0-0x03a7 */
+ 0x0000, 0x0000, 0x0112, 0x0122, 0x0166, 0x0000, 0x0000, 0x0000, /* 0x03a8-0x03af */
+ 0x0000, 0x0000, 0x0000, 0x0157, 0x0000, 0x0129, 0x013c, 0x0000, /* 0x03b0-0x03b7 */
+ 0x0000, 0x0000, 0x0113, 0x0123, 0x0167, 0x014a, 0x0000, 0x014b, /* 0x03b8-0x03bf */
+ 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x012e, /* 0x03c0-0x03c7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0116, 0x0000, 0x0000, 0x012a, /* 0x03c8-0x03cf */
+ 0x0000, 0x0145, 0x014c, 0x0136, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x03d0-0x03d7 */
+ 0x0000, 0x0172, 0x0000, 0x0000, 0x0000, 0x0168, 0x016a, 0x0000, /* 0x03d8-0x03df */
+ 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x012f, /* 0x03e0-0x03e7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0117, 0x0000, 0x0000, 0x012b, /* 0x03e8-0x03ef */
+ 0x0000, 0x0146, 0x014d, 0x0137, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x03f0-0x03f7 */
+ 0x0000, 0x0173, 0x0000, 0x0000, 0x0000, 0x0169, 0x016b /* 0x03f8-0x03ff */
+};
+
+static unsigned short const keysym_to_unicode_4a1_4df[] = {
+ 0x3002, 0x3008, 0x3009, 0x3001, 0x30fb, 0x30f2, 0x30a1, /* 0x04a0-0x04a7 */
+ 0x30a3, 0x30a5, 0x30a7, 0x30a9, 0x30e3, 0x30e5, 0x30e7, 0x30c3, /* 0x04a8-0x04af */
+ 0x30fc, 0x30a2, 0x30a4, 0x30a6, 0x30a8, 0x30aa, 0x30ab, 0x30ad, /* 0x04b0-0x04b7 */
+ 0x30af, 0x30b1, 0x30b3, 0x30b5, 0x30b7, 0x30b9, 0x30bb, 0x30bd, /* 0x04b8-0x04bf */
+ 0x30bf, 0x30c1, 0x30c4, 0x30c6, 0x30c8, 0x30ca, 0x30cb, 0x30cc, /* 0x04c0-0x04c7 */
+ 0x30cd, 0x30ce, 0x30cf, 0x30d2, 0x30d5, 0x30d8, 0x30db, 0x30de, /* 0x04c8-0x04cf */
+ 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e4, 0x30e6, 0x30e8, 0x30e9, /* 0x04d0-0x04d7 */
+ 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ef, 0x30f3, 0x309b, 0x309c /* 0x04d8-0x04df */
+};
+
+static unsigned short const keysym_to_unicode_590_5fe[] = {
+ 0x06f0, 0x06f1, 0x06f2, 0x06f3, 0x06f4, 0x06f5, 0x06f6, 0x06f7, /* 0x0590-0x0597 */
+ 0x06f8, 0x06f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0598-0x059f */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x066a, 0x0670, 0x0679, /* 0x05a0-0x05a7 */
+
+ 0x067e, 0x0686, 0x0688, 0x0691, 0x060c, 0x0000, 0x06d4, 0x0000, /* 0x05ac-0x05af */
+ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, /* 0x05b0-0x05b7 */
+ 0x0668, 0x0669, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f, /* 0x05b8-0x05bf */
+ 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, /* 0x05c0-0x05c7 */
+ 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0x05c8-0x05cf */
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, /* 0x05d0-0x05d7 */
+ 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x05d8-0x05df */
+ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, /* 0x05e0-0x05e7 */
+ 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, /* 0x05e8-0x05ef */
+ 0x0650, 0x0651, 0x0652, 0x0653, 0x0654, 0x0655, 0x0698, 0x06a4, /* 0x05f0-0x05f7 */
+ 0x06a9, 0x06af, 0x06ba, 0x06be, 0x06cc, 0x06d2, 0x06c1 /* 0x05f8-0x05fe */
+};
+
+static unsigned short keysym_to_unicode_680_6ff[] = {
+ 0x0492, 0x0496, 0x049a, 0x049c, 0x04a2, 0x04ae, 0x04b0, 0x04b2, /* 0x0680-0x0687 */
+ 0x04b6, 0x04b8, 0x04ba, 0x0000, 0x04d8, 0x04e2, 0x04e8, 0x04ee, /* 0x0688-0x068f */
+ 0x0493, 0x0497, 0x049b, 0x049d, 0x04a3, 0x04af, 0x04b1, 0x04b3, /* 0x0690-0x0697 */
+ 0x04b7, 0x04b9, 0x04bb, 0x0000, 0x04d9, 0x04e3, 0x04e9, 0x04ef, /* 0x0698-0x069f */
+ 0x0000, 0x0452, 0x0453, 0x0451, 0x0454, 0x0455, 0x0456, 0x0457, /* 0x06a0-0x06a7 */
+ 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x0491, 0x045e, 0x045f, /* 0x06a8-0x06af */
+ 0x2116, 0x0402, 0x0403, 0x0401, 0x0404, 0x0405, 0x0406, 0x0407, /* 0x06b0-0x06b7 */
+ 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x0490, 0x040e, 0x040f, /* 0x06b8-0x06bf */
+ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, /* 0x06c0-0x06c7 */
+ 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0x06c8-0x06cf */
+ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, /* 0x06d0-0x06d7 */
+ 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0x06d8-0x06df */
+ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, /* 0x06e0-0x06e7 */
+ 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0x06e8-0x06ef */
+ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, /* 0x06f0-0x06f7 */
+ 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a /* 0x06f8-0x06ff */
+};
+
+static unsigned short const keysym_to_unicode_7a1_7f9[] = {
+ 0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0x0000, 0x038c, /* 0x07a0-0x07a7 */
+ 0x038e, 0x03ab, 0x0000, 0x038f, 0x0000, 0x0000, 0x0385, 0x2015, /* 0x07a8-0x07af */
+ 0x0000, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc, /* 0x07b0-0x07b7 */
+ 0x03cd, 0x03cb, 0x03b0, 0x03ce, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x07b8-0x07bf */
+ 0x0000, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, /* 0x07c0-0x07c7 */
+ 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, /* 0x07c8-0x07cf */
+ 0x03a0, 0x03a1, 0x03a3, 0x0000, 0x03a4, 0x03a5, 0x03a6, 0x03a7, /* 0x07d0-0x07d7 */
+ 0x03a8, 0x03a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x07d8-0x07df */
+ 0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, /* 0x07e0-0x07e7 */
+ 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, /* 0x07e8-0x07ef */
+ 0x03c0, 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7, /* 0x07f0-0x07f7 */
+ 0x03c8, 0x03c9 /* 0x07f8-0x07ff */
+};
+
+static unsigned short const keysym_to_unicode_8a4_8fe[] = {
+ 0x2320, 0x2321, 0x0000, 0x231c, /* 0x08a0-0x08a7 */
+ 0x231d, 0x231e, 0x231f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08a8-0x08af */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08b0-0x08b7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2264, 0x2260, 0x2265, 0x222b, /* 0x08b8-0x08bf */
+ 0x2234, 0x0000, 0x221e, 0x0000, 0x0000, 0x2207, 0x0000, 0x0000, /* 0x08c0-0x08c7 */
+ 0x2245, 0x2246, 0x0000, 0x0000, 0x0000, 0x0000, 0x22a2, 0x0000, /* 0x08c8-0x08cf */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221a, 0x0000, /* 0x08d0-0x08d7 */
+ 0x0000, 0x0000, 0x2282, 0x2283, 0x2229, 0x222a, 0x2227, 0x2228, /* 0x08d8-0x08df */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08e0-0x08e7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08e8-0x08ef */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0192, 0x0000, /* 0x08f0-0x08f7 */
+ 0x0000, 0x0000, 0x0000, 0x2190, 0x2191, 0x2192, 0x2193 /* 0x08f8-0x08ff */
+};
+
+static unsigned short const keysym_to_unicode_9df_9f8[] = {
+ 0x2422, /* 0x09d8-0x09df */
+ 0x2666, 0x25a6, 0x2409, 0x240c, 0x240d, 0x240a, 0x0000, 0x0000, /* 0x09e0-0x09e7 */
+ 0x240a, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0x2500, /* 0x09e8-0x09ef */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x251c, 0x2524, 0x2534, 0x252c, /* 0x09f0-0x09f7 */
+ 0x2502 /* 0x09f8-0x09ff */
+};
+
+static unsigned short const keysym_to_unicode_aa1_afe[] = {
+ 0x2003, 0x2002, 0x2004, 0x2005, 0x2007, 0x2008, 0x2009, /* 0x0aa0-0x0aa7 */
+ 0x200a, 0x2014, 0x2013, 0x0000, 0x0000, 0x0000, 0x2026, 0x2025, /* 0x0aa8-0x0aaf */
+ 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, /* 0x0ab0-0x0ab7 */
+ 0x2105, 0x0000, 0x0000, 0x2012, 0x2039, 0x2024, 0x203a, 0x0000, /* 0x0ab8-0x0abf */
+ 0x0000, 0x0000, 0x0000, 0x215b, 0x215c, 0x215d, 0x215e, 0x0000, /* 0x0ac0-0x0ac7 */
+ 0x0000, 0x2122, 0x2120, 0x0000, 0x25c1, 0x25b7, 0x25cb, 0x25ad, /* 0x0ac8-0x0acf */
+ 0x2018, 0x2019, 0x201c, 0x201d, 0x211e, 0x0000, 0x2032, 0x2033, /* 0x0ad0-0x0ad7 */
+ 0x0000, 0x271d, 0x0000, 0x220e, 0x25c2, 0x2023, 0x25cf, 0x25ac, /* 0x0ad8-0x0adf */
+ 0x25e6, 0x25ab, 0x25ae, 0x25b5, 0x25bf, 0x2606, 0x2022, 0x25aa, /* 0x0ae0-0x0ae7 */
+ 0x25b4, 0x25be, 0x261a, 0x261b, 0x2663, 0x2666, 0x2665, 0x0000, /* 0x0ae8-0x0aef */
+ 0x2720, 0x2020, 0x2021, 0x2713, 0x2612, 0x266f, 0x266d, 0x2642, /* 0x0af0-0x0af7 */
+ 0x2640, 0x2121, 0x2315, 0x2117, 0x2038, 0x201a, 0x201e /* 0x0af8-0x0aff */
+};
+
+/* none of the APL keysyms match the Unicode characters */
+
+static unsigned short const keysym_to_unicode_cdf_cfa[] = {
+ 0x2017, /* 0x0cd8-0x0cdf */
+ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, /* 0x0ce0-0x0ce7 */
+ 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0x0ce8-0x0cef */
+ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, /* 0x0cf0-0x0cf7 */
+ 0x05e8, 0x05e9, 0x05ea /* 0x0cf8-0x0cff */
+};
+
+static unsigned short const keysym_to_unicode_da1_df9[] = {
+ 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, /* 0x0da0-0x0da7 */
+ 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, /* 0x0da8-0x0daf */
+ 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, /* 0x0db0-0x0db7 */
+ 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, /* 0x0db8-0x0dbf */
+ 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, /* 0x0dc0-0x0dc7 */
+ 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, /* 0x0dc8-0x0dcf */
+ 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, /* 0x0dd0-0x0dd7 */
+ 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0e3e, 0x0e3f, /* 0x0dd8-0x0ddf */
+ 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, /* 0x0de0-0x0de7 */
+ 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0000, 0x0000, /* 0x0de8-0x0def */
+ 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, /* 0x0df0-0x0df7 */
+ 0x0e58, 0x0e59 /* 0x0df8-0x0dff */
+};
+
+static unsigned short const keysym_to_unicode_ea0_eff[] = {
+ 0x0000, 0x1101, 0x1101, 0x11aa, 0x1102, 0x11ac, 0x11ad, 0x1103, /* 0x0ea0-0x0ea7 */
+ 0x1104, 0x1105, 0x11b0, 0x11b1, 0x11b2, 0x11b3, 0x11b4, 0x11b5, /* 0x0ea8-0x0eaf */
+ 0x11b6, 0x1106, 0x1107, 0x1108, 0x11b9, 0x1109, 0x110a, 0x110b, /* 0x0eb0-0x0eb7 */
+ 0x110c, 0x110d, 0x110e, 0x110f, 0x1110, 0x1111, 0x1112, 0x1161, /* 0x0eb8-0x0ebf */
+ 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, 0x1168, 0x1169, /* 0x0ec0-0x0ec7 */
+ 0x116a, 0x116b, 0x116c, 0x116d, 0x116e, 0x116f, 0x1170, 0x1171, /* 0x0ec8-0x0ecf */
+ 0x1172, 0x1173, 0x1174, 0x1175, 0x11a8, 0x11a9, 0x11aa, 0x11ab, /* 0x0ed0-0x0ed7 */
+ 0x11ac, 0x11ad, 0x11ae, 0x11af, 0x11b0, 0x11b1, 0x11b2, 0x11b3, /* 0x0ed8-0x0edf */
+ 0x11b4, 0x11b5, 0x11b6, 0x11b7, 0x11b8, 0x11b9, 0x11ba, 0x11bb, /* 0x0ee0-0x0ee7 */
+ 0x11bc, 0x11bd, 0x11be, 0x11bf, 0x11c0, 0x11c1, 0x11c2, 0x0000, /* 0x0ee8-0x0eef */
+ 0x0000, 0x0000, 0x1140, 0x0000, 0x0000, 0x1159, 0x119e, 0x0000, /* 0x0ef0-0x0ef7 */
+ 0x11eb, 0x0000, 0x11f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x20a9, /* 0x0ef8-0x0eff */
+};
+
+static unsigned short keysym_to_unicode_12a1_12fe[] = {
+ 0x1e02, 0x1e03, 0x0000, 0x0000, 0x0000, 0x1e0a, 0x0000, /* 0x12a0-0x12a7 */
+ 0x1e80, 0x0000, 0x1e82, 0x1e0b, 0x1ef2, 0x0000, 0x0000, 0x0000, /* 0x12a8-0x12af */
+ 0x1e1e, 0x1e1f, 0x0000, 0x0000, 0x1e40, 0x1e41, 0x0000, 0x1e56, /* 0x12b0-0x12b7 */
+ 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, /* 0x12b8-0x12bf */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12c0-0x12c7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12c8-0x12cf */
+ 0x0174, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e6a, /* 0x12d0-0x12d7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0176, 0x0000, /* 0x12d8-0x12df */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12e0-0x12e7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12e8-0x12ef */
+ 0x0175, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e6b, /* 0x12f0-0x12f7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0177 /* 0x12f0-0x12ff */
+};
+
+static unsigned short const keysym_to_unicode_13bc_13be[] = {
+ 0x0152, 0x0153, 0x0178 /* 0x13b8-0x13bf */
+};
+
+static unsigned short keysym_to_unicode_14a1_14ff[] = {
+ 0x2741, 0x00a7, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab, /* 0x14a0-0x14a7 */
+ 0x2014, 0x002e, 0x055d, 0x002c, 0x2013, 0x058a, 0x2026, 0x055c, /* 0x14a8-0x14af */
+ 0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563, /* 0x14b0-0x14b7 */
+ 0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567, /* 0x14b8-0x14bf */
+ 0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b, /* 0x14c0-0x14c7 */
+ 0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f, /* 0x14c8-0x14cf */
+ 0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573, /* 0x14d0-0x14d7 */
+ 0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577, /* 0x14d8-0x14df */
+ 0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b, /* 0x14e0-0x14e7 */
+ 0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f, /* 0x14e8-0x14ef */
+ 0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583, /* 0x14f0-0x14f7 */
+ 0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x2019, 0x0027, /* 0x14f8-0x14ff */
+};
+
+static unsigned short keysym_to_unicode_15d0_15f6[] = {
+ 0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10d7, /* 0x15d0-0x15d7 */
+ 0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10dd, 0x10de, 0x10df, /* 0x15d8-0x15df */
+ 0x10e0, 0x10e1, 0x10e2, 0x10e3, 0x10e4, 0x10e5, 0x10e6, 0x10e7, /* 0x15e0-0x15e7 */
+ 0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec, 0x10ed, 0x10ee, 0x10ef, /* 0x15e8-0x15ef */
+ 0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6 /* 0x15f0-0x15f7 */
+};
+
+static unsigned short keysym_to_unicode_16a0_16f6[] = {
+ 0x0000, 0x0000, 0xf0a2, 0x1e8a, 0x0000, 0xf0a5, 0x012c, 0xf0a7, /* 0x16a0-0x16a7 */
+ 0xf0a8, 0x01b5, 0x01e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x019f, /* 0x16a8-0x16af */
+ 0x0000, 0x017e, 0xf0b2, 0x1e8b, 0x01d1, 0xf0b5, 0x012d, 0xf0b7, /* 0x16b0-0x16b7 */
+ 0xf0b8, 0x01b6, 0x01e7, 0x01d2, 0x0000, 0x0000, 0x0000, 0x0275, /* 0x16b8-0x16bf */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x018f, 0x0000, /* 0x16c0-0x16c7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16c8-0x16cf */
+ 0x0000, 0x1e36, 0xf0d2, 0xf0d3, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16d0-0x16d7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16d8-0x16df */
+ 0x0000, 0x1e37, 0xf0e2, 0xf0e3, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16e0-0x16e7 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16e8-0x16ef */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0259 /* 0x16f0-0x16f6 */
+};
+
+static unsigned short const keysym_to_unicode_1e9f_1eff[] = {
+ 0x0303,
+ 0x1ea0, 0x1ea1, 0x1ea2, 0x1ea3, 0x1ea4, 0x1ea5, 0x1ea6, 0x1ea7, /* 0x1ea0-0x1ea7 */
+ 0x1ea8, 0x1ea9, 0x1eaa, 0x1eab, 0x1eac, 0x1ead, 0x1eae, 0x1eaf, /* 0x1ea8-0x1eaf */
+ 0x1eb0, 0x1eb1, 0x1eb2, 0x1eb3, 0x1eb4, 0x1eb5, 0x1eb6, 0x1eb7, /* 0x1eb0-0x1eb7 */
+ 0x1eb8, 0x1eb9, 0x1eba, 0x1ebb, 0x1ebc, 0x1ebd, 0x1ebe, 0x1ebf, /* 0x1eb8-0x1ebf */
+ 0x1ec0, 0x1ec1, 0x1ec2, 0x1ec3, 0x1ec4, 0x1ec5, 0x1ec6, 0x1ec7, /* 0x1ec0-0x1ec7 */
+ 0x1ec8, 0x1ec9, 0x1eca, 0x1ecb, 0x1ecc, 0x1ecd, 0x1ece, 0x1ecf, /* 0x1ec8-0x1ecf */
+ 0x1ed0, 0x1ed1, 0x1ed2, 0x1ed3, 0x1ed4, 0x1ed5, 0x1ed6, 0x1ed7, /* 0x1ed0-0x1ed7 */
+ 0x1ed8, 0x1ed9, 0x1eda, 0x1edb, 0x1edc, 0x1edd, 0x1ede, 0x1edf, /* 0x1ed8-0x1edf */
+ 0x1ee0, 0x1ee1, 0x1ee2, 0x1ee3, 0x1ee4, 0x1ee5, 0x1ee6, 0x1ee7, /* 0x1ee0-0x1ee7 */
+ 0x1ee8, 0x1ee9, 0x1eea, 0x1eeb, 0x1eec, 0x1eed, 0x1eee, 0x1eef, /* 0x1ee8-0x1eef */
+ 0x1ef0, 0x1ef1, 0x0300, 0x0301, 0x1ef4, 0x1ef5, 0x1ef6, 0x1ef7, /* 0x1ef0-0x1ef7 */
+ 0x1ef8, 0x1ef9, 0x01a0, 0x01a1, 0x01af, 0x01b0, 0x0309, 0x0323 /* 0x1ef8-0x1eff */
+};
+
+static unsigned short const keysym_to_unicode_20a0_20ac[] = {
+ 0x20a0, 0x20a1, 0x20a2, 0x20a3, 0x20a4, 0x20a5, 0x20a6, 0x20a7, /* 0x20a0-0x20a7 */
+ 0x20a8, 0x20a9, 0x20aa, 0x20ab, 0x20ac /* 0x20a8-0x20af */
+};
+
+unsigned int
+KeySymToUcs4(int keysym)
+{
+ /* 'Unicode keysym' */
+ if ((keysym & 0xff000000) == 0x01000000)
+ return (keysym & 0x00ffffff);
+
+ if (keysym > 0 && keysym < 0x100)
+ return keysym;
+ else if (keysym > 0x1a0 && keysym < 0x200)
+ return keysym_to_unicode_1a1_1ff[keysym - 0x1a1];
+ else if (keysym > 0x2a0 && keysym < 0x2ff)
+ return keysym_to_unicode_2a1_2fe[keysym - 0x2a1];
+ else if (keysym > 0x3a1 && keysym < 0x3ff)
+ return keysym_to_unicode_3a2_3fe[keysym - 0x3a2];
+ else if (keysym > 0x4a0 && keysym < 0x4e0)
+ return keysym_to_unicode_4a1_4df[keysym - 0x4a1];
+ else if (keysym > 0x589 && keysym < 0x5ff)
+ return keysym_to_unicode_590_5fe[keysym - 0x590];
+ else if (keysym > 0x67f && keysym < 0x700)
+ return keysym_to_unicode_680_6ff[keysym - 0x680];
+ else if (keysym > 0x7a0 && keysym < 0x7fa)
+ return keysym_to_unicode_7a1_7f9[keysym - 0x7a1];
+ else if (keysym > 0x8a3 && keysym < 0x8ff)
+ return keysym_to_unicode_8a4_8fe[keysym - 0x8a4];
+ else if (keysym > 0x9de && keysym < 0x9f9)
+ return keysym_to_unicode_9df_9f8[keysym - 0x9df];
+ else if (keysym > 0xaa0 && keysym < 0xaff)
+ return keysym_to_unicode_aa1_afe[keysym - 0xaa1];
+ else if (keysym > 0xcde && keysym < 0xcfb)
+ return keysym_to_unicode_cdf_cfa[keysym - 0xcdf];
+ else if (keysym > 0xda0 && keysym < 0xdfa)
+ return keysym_to_unicode_da1_df9[keysym - 0xda1];
+ else if (keysym > 0xe9f && keysym < 0xf00)
+ return keysym_to_unicode_ea0_eff[keysym - 0xea0];
+ else if (keysym > 0x12a0 && keysym < 0x12ff)
+ return keysym_to_unicode_12a1_12fe[keysym - 0x12a1];
+ else if (keysym > 0x13bb && keysym < 0x13bf)
+ return keysym_to_unicode_13bc_13be[keysym - 0x13bc];
+ else if (keysym > 0x14a0 && keysym < 0x1500)
+ return keysym_to_unicode_14a1_14ff[keysym - 0x14a1];
+ else if (keysym > 0x15cf && keysym < 0x15f7)
+ return keysym_to_unicode_15d0_15f6[keysym - 0x15d0];
+ else if (keysym > 0x169f && keysym < 0x16f7)
+ return keysym_to_unicode_16a0_16f6[keysym - 0x16a0];
+ else if (keysym > 0x1e9e && keysym < 0x1f00)
+ return keysym_to_unicode_1e9f_1eff[keysym - 0x1ea0];
+ else if (keysym > 0x209f && keysym < 0x20ad)
+ return keysym_to_unicode_20a0_20ac[keysym - 0x20a0];
+ else
+ return 0;
+}
diff --git a/console-client/xkb/lex.l b/console-client/xkb/lex.l
new file mode 100644
index 00000000..37b88c3f
--- /dev/null
+++ b/console-client/xkb/lex.l
@@ -0,0 +1,367 @@
+/* XKB scanner.
+
+ Copyright (C) 2002, 03 Marco Gerards
+
+ Written by Marco Gerards <marco@student.han.nl>
+
+ 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. */
+
+
+ #include "xkb.h"
+ #include "parser.tab.h"
+ #include <string.h>
+ #include <unistd.h>
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <error.h>
+
+ void close_include (void);
+ int lineno = 1;
+ char *filename = "foo";
+
+%option nodebug
+
+%option UNPUT
+KEYCODE "<"[A-Z][A-Z0-9]*">"
+DIGIT [0-9]
+NUM {DIGIT}{DIGIT}*
+FLOAT {DIGIT}{DIGIT}*\.{DIGIT}{DIGIT}*
+HEX 0x[A-Za-z0-9]*
+IDENTIFIER [a-zA-Z][a-zA-Z0-9_]*
+CPPCOMMENT "//".*"\n"
+%%
+ /* When the end of a file is reached, close the
+ current one and pop the next file to process
+ of the stack. */
+
+ /* Filter out comment. */
+{CPPCOMMENT} { lineno++; }
+ "/*" {
+ int c;
+
+ while((c = input()) != 0)
+ {
+ if(c == '\n')
+ lineno++;
+
+ else if(c == '*')
+ {
+ if((c = input()) == '/')
+ break;
+ else
+ unput(c);
+ }
+ }
+ }
+
+\n { lineno++; }
+
+ /* Beginning of sections. */
+xkb_keymap { return XKBKEYMAP; }
+xkb_symbols { return XKBSYMBOLS; }
+xkb_keycodes { return XKBKEYCODES; }
+xkb_types { return XKBTYPES; }
+xkb_compatibility { return XKBCOMPAT; }
+xkb_geometry { return XKBGEOMETRY; }
+
+
+ /* Real modifiers. */
+shift { return SHIFT; }
+lock { return LOCK; }
+control { return CONTROL; }
+ctrl { return CONTROL; }
+mod1 { return MOD1; }
+mod2 { return MOD2; }
+mod3 { return MOD3; }
+mod4 { return MOD4; }
+mod5 { return MOD5; }
+
+ /* Levels. */
+anylevel { yylval.val = 0; return LEVEL; }
+levelone { yylval.val = 1; return LEVEL; }
+level1 { yylval.val = 1; return LEVEL; }
+level2 { yylval.val = 2; return LEVEL; }
+level3 { yylval.val = 3; return LEVEL; }
+level4 { yylval.val = 4; return LEVEL; }
+
+ /* Groups. */
+group1 { yylval.val = 1; return GROUPNUM; }
+group2 { yylval.val = 2; return GROUPNUM; }
+group3 { yylval.val = 3; return GROUPNUM; }
+group4 { yylval.val = 4; return GROUPNUM; }
+
+ /* Booleans */
+true { yylval.val = 1; return BOOLEAN; }
+false { yylval.val = 0; return BOOLEAN; }
+
+ /* Interpretation */
+interpret { return INTERPRET; }
+usemodmap { return USEMODMAP; }
+usemodmapmods { return USEMODMAP; }
+modmapmods { return USEMODMAP; }
+repeat { return REPEAT; }
+locking { return LOCKING; }
+locks { return LOCKING; }
+virtualmodifier { return VIRTUALMODIFIER; }
+virtualmod { return VIRTUALMODIFIER; }
+
+ /* Interpretation match. */
+noneof { yylval.val = 0; return INTERPMATCH ;}
+anyofornone { yylval.val = 1; return INTERPMATCH ;}
+anyof { yylval.val = 2; return INTERPMATCH ;}
+allof { yylval.val = 3; return INTERPMATCH ;}
+exactly { yylval.val = 4; return INTERPMATCH ;}
+
+ /* SetMods action. */
+clearlocks { return CLEARLOCKS; }
+mods { return MODS; }
+
+unlock { return UNLOCK; }
+both { return BOTH; }
+neither { return NEITHER; }
+
+ /* Actions. */
+setmods { return SETMODS; }
+latchmods { return LATCHMODS; }
+lockmods { return LOCKMODS; }
+setgroup { return SETGROUP; }
+latchgroup { return LATCHGROUP; }
+lockgroup { return LOCKGROUP; }
+setptrdflt { return PTRDFLT; }
+setpointerdefault { return PTRDFLT; }
+lockptrbtn { return LOCKPTRBTN; }
+lockpointerbutton { return LOCKPTRBTN; }
+lockptrbutton { return LOCKPTRBTN; }
+lockpointerbtn { return LOCKPTRBTN; }
+setcontrols { return SETCONTROLS; }
+lockcontrols { return LOCKCONTROLS; }
+terminateserver { return TERMINATE; }
+terminate { return TERMINATE; }
+switchscreen { return SWITCHSCREEN; }
+consscroll { return CONSSCROLL; }
+consolescroll { return CONSSCROLL; }
+moveptr { return MOVEPTR; }
+private { return PRIVATE; }
+ /* Action parameters. */
+latchtolock { return LATCHTOLOCK; }
+group { return GROUP; }
+groups { return GROUPS; }
+accel { return ACCEL; }
+accelerate { return ACCEL; }
+default { return DEFAULT; }
+count { return COUNT; }
+controls { return CONTROLS; }
+same { return SAMESERVER; }
+sameserver { return SAMESERVER; }
+screen { return SCREEN; }
+line { return LINE; }
+percentage { return PERCENT; }
+ptrbtn { return PTRBTN ; }
+pointerbutton { return PTRBTN ; }
+
+action { return ACTION; }
+actions { return ACTIONS; }
+
+whichmodstate { return WHICHMODSTATE; }
+whichmodifierstate { return WHICHMODSTATE; }
+whichgroupstate { return WHICHGROUPSTATE; }
+
+ /* Match state for indicator. */
+base { yylval.val = 0; return WHICHSTATE; }
+latched { yylval.val = 1; return WHICHSTATE; }
+locked { yylval.val = 4; return WHICHSTATE; }
+effective { yylval.val = 8; return WHICHSTATE; }
+
+ /* Bits for binary controls. */
+repeatkeys { yylval.val = 0; return CONTROLFLAG; }
+autorepeat { yylval.val = 0; return CONTROLFLAG; }
+accessxkeys { yylval.val = 0; return CONTROLFLAG; }
+slowkeys { yylval.val = 0; return CONTROLFLAG; }
+bouncekeys { yylval.val = 0; return CONTROLFLAG; }
+stickykeys { yylval.val = 0; return CONTROLFLAG; }
+accessxtimeout { yylval.val = 0; return CONTROLFLAG; }
+accessxfeedback { yylval.val = 0; return CONTROLFLAG; }
+mousekeys { yylval.val = 0; return CONTROLFLAG; }
+mousekeysaccel { yylval.val = 0; return CONTROLFLAG; }
+audiblebell { yylval.val = 0; return CONTROLFLAG; }
+ignoregrouplock { yylval.val = 0; return CONTROLFLAG; }
+
+index { return INDEX; }
+name { return NAME; }
+symbols { return SYMBOLS; }
+key { return KEY; }
+
+ /* Mouse buttons. */
+button1 { yylval.val = 1; return BUTTONNUM; }
+button2 { yylval.val = 2; return BUTTONNUM; }
+button3 { yylval.val = 3; return BUTTONNUM; }
+button4 { yylval.val = 4; return BUTTONNUM; }
+button5 { yylval.val = 5; return BUTTONNUM; }
+button { return BUTTON; }
+
+ /* Fuzzyness. */
+any { return ANY; }
+all { return ALL; }
+none { return NONE; }
+
+defaultbutton { return DEFAULTBTN; }
+affect { return AFFECT; }
+
+allowexplicit { return ALLOWEXPLICIT; }
+
+ /* Feedback to the keyboard. */
+driveskeyboard { return DRIVESKBD; }
+driveskbd { return DRIVESKBD; }
+ledsdrivekbd { return DRIVESKBD; }
+ledsdrivekeyboard { return DRIVESKBD; }
+indicatordriveskbd { return DRIVESKBD; }
+indicatordriveskeyboard { return DRIVESKBD; }
+
+
+modifier_map { return MODMAP; }
+minimum { return MINIMUM; }
+maximum { return MAXIMUM; }
+virtual { return VIRTUAL; }
+alias { return ALIAS; }
+indicator { return INDICATOR; }
+virtual_modifiers { return VMODS; }
+virtualmods { return VMODS; }
+type { return TYPE; }
+data { return DATA; }
+modifiers { return MODS; }
+map { return MAP; }
+level_name { return LEVEL_NAME; }
+preserve { return PRESERVE; }
+
+ /* Section flags. */
+partial { yylval.val = 1; return FLAGS; }
+complete { yylval.val = 2; return FLAGS; }
+fc { yylval.val = 4; return FLAGS; }
+fd { yylval.val = 8; return FLAGS; }
+cp { return XKBCOMPAT; }
+
+ /* Section merge modes. */
+include { yylval.mergemode = defaultmm; return INCLUDE; }
+augment { yylval.mergemode = augment; return AUGMENT; }
+replace { yylval.mergemode = replace; return REPLACE; }
+override { yylval.mergemode = override; return OVERRIDE; }
+
+isolock { return ISOLOCK; }
+pointers { return POINTERS;}
+ptr { return POINTERS;}
+noaction { return NOACTION;}
+groupswrap { return GROUPSWRAP; }
+wrapgroups { return GROUPSWRAP; }
+clampgroups { return GROUPSCLAMP; }
+groupsredirect { return GROUPSREDIRECT; }
+overlay1 { yylval.val = 1; return OVERLAY; }
+overlay2 { yylval.val = 2; return OVERLAY; }
+
+ /* String. */
+\"([^"]|\\\")*\" {
+ yytext[strlen (yytext) - 1] = '\0';
+ yylval.str = strdup (yytext + 1);
+ return STR;
+ }
+ /* Ignore whitespace. */
+[ \t]*
+ /* A keycode. */
+{KEYCODE} { yylval.str = strdup (yytext) + 1; yylval.str[strlen (yylval.str) - 1] = 0; return KEYCODE; }
+ /* A float vlaue. */
+{FLOAT} { yylval.dbl = atof (yytext); return FLOAT; }
+ /* An integer. */
+{NUM} { yylval.val = atoi (yytext); return NUM; }
+ /* A hexadecimal value. */
+{HEX} { sscanf (yytext, "0x%X", &yylval.val); return HEX; }
+ /* An identifier. */
+{IDENTIFIER} { yylval.str = strdup (yytext); return IDENTIFIER; }
+ /* All unrecognized characters. */
+. { return yytext[0]; }
+%%
+ /* Stupid hack, the current version of flex is fucked. */
+ #define yytext_ptr yytext
+
+ void
+ scanner_unput (int c)
+ {
+ unput (c);
+ }
+
+ int
+ yywrap (void)
+ {
+ close_include ();
+ return 0;
+ }
+
+ #define MAX_INCLUDE_DEPTH 50
+
+ /* An include file on the stack. */
+ struct include_stack
+ {
+ YY_BUFFER_STATE buffer;
+ mergemode merge_mode;
+ int currline;
+ char *filename;
+ } include_stack[MAX_INCLUDE_DEPTH];
+ int include_stack_ptr = 0;
+
+ /* Add an file to the stack. */
+ void
+ include_file (FILE *file, mergemode new_mm, char *fname)
+ {
+ YY_BUFFER_STATE buffer;
+
+ if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
+ {
+ fprintf (stderr, "Includes nested too deeply\n");
+ exit (EXIT_FAILURE);
+ }
+
+ include_stack[include_stack_ptr].filename = filename;
+ include_stack[include_stack_ptr].currline = lineno;
+ include_stack[include_stack_ptr].merge_mode = merge_mode;
+ include_stack[include_stack_ptr++].buffer = YY_CURRENT_BUFFER;
+ filename = fname;
+ lineno = 1;
+ merge_mode = new_mm;
+
+ buffer = yy_create_buffer (file, YY_BUF_SIZE);
+ yy_switch_to_buffer (buffer);
+ }
+
+ /* Close an includefile. */
+ void
+ close_include (void)
+ {
+ if ( --include_stack_ptr < 0 )
+ {
+ // yyterminate ();
+ fprintf (stderr, "Unexpected end of file.\n");
+ exit (1);
+ }
+ else
+ {
+ fclose (yyin);
+ yy_delete_buffer (YY_CURRENT_BUFFER);
+ merge_mode = include_stack[include_stack_ptr].merge_mode;
+ lineno = include_stack[include_stack_ptr].currline;
+ filename = include_stack[include_stack_ptr].filename;
+ yy_switch_to_buffer (include_stack[include_stack_ptr].buffer);
+ }
+ }
+
+ void
+ yyerror (char *s)
+ {
+ fprintf (stderr, "%s:%d: %s\n", filename, lineno, s);
+ // error_at_line (0, 1, filename, lineno, "foo %d\n", 2);
+ }
diff --git a/console-client/xkb/makeconf.sh b/console-client/xkb/makeconf.sh
new file mode 100644
index 00000000..15ce9bf1
--- /dev/null
+++ b/console-client/xkb/makeconf.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+# Update the default configuration with default.xkb
+
+# As input the file "default.xkb" is used.
+# You can generate this file with "xkbcomp":
+# "xkbcomp :0 -o default.xkb"
+# This extract the configuration out of the ":0" X server.
+# After that add the Hurd features to switch VCs, scroll, etc!!!!
+#
+# Hurd feature checklist:
+# Alt + F1...F12: Switch VC.
+# Alt + Left, Right: Switch to the console left or right of the current
+# console.
+# Alt + Up, Down: Scroll the console by one line up or down.
+# Ctrl + PgUp, PgDown: Scroll the console up or down with 1/2 screen.
+# Alt + Home: Scroll the console to the 0% of the scrollback buffer.
+# Ctrl + Home: Scroll the console to the 25% of the scrollback buffer.
+# Alt + End: Scroll the console to the 100% of the scrollback buffer.
+# Alt + End: Scroll the console to the 75% of the scrollback buffer.
+
+
+# Really ugly code, but it works :)
+echo "char *default_xkb_keymap = \"\\" > xkbdefaults.c
+# Escape " and \
+sed "s/\([\\\"]\)/\\\\\1/g" < default.xkb|awk ' { print $0 "\\n\\" } ' >> xkbdefaults.c
+echo "\\0\";" >> xkbdefaults.c
diff --git a/console-client/xkb/parser.y b/console-client/xkb/parser.y
new file mode 100644
index 00000000..9fe2a394
--- /dev/null
+++ b/console-client/xkb/parser.y
@@ -0,0 +1,1529 @@
+/* parser.y -- XKB parser.
+
+ Copyright (C) 2003, 2004 Marco Gerards
+
+ Written by Marco Gerards <marco@student.han.nl>
+
+ 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. */
+
+%{
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include "xkb.h"
+
+void yyerror(char *);
+int yylex (void);
+static error_t include_section (char *incl, int sectionsymbol, char *dirname,
+ mergemode);
+static error_t include_sections (char *incl, int sectionsymbol, char *dirname,
+ mergemode);
+void close_include ();
+static void skipsection (void);
+static error_t set_default_action (struct xkb_action *, struct xkb_action **);
+static void key_set_keysym (struct key *key, group_t group, int level,
+ symbol ks);
+static void key_new (char *keyname);
+static void key_delete (char *keyname);
+void scanner_unput (int c);
+static void remove_symbols (struct key *key, group_t group);
+
+struct xkb_interpret *current_interpretation;
+struct xkb_action *current_action;
+struct xkb_indicator indi;
+struct xkb_indicator *current_indicator = &indi;
+struct key defkey;
+struct key *default_key = &defkey;
+
+/* The default settings for actions. */
+struct xkb_action default_setmods = { SA_SetMods };
+struct xkb_action default_lockmods = { SA_LockMods };
+struct xkb_action default_latchmods = { SA_LatchMods };
+struct xkb_action default_setgroup = { SA_SetGroup };
+struct xkb_action default_latchgroup = { SA_LatchGroup };
+struct xkb_action default_lockgroup = { SA_LockGroup };
+struct xkb_action default_moveptr = { SA_MovePtr };
+struct xkb_action default_ptrbtn = { SA_PtrBtn };
+struct xkb_action default_lockptrbtn = { SA_LockPtrBtn };
+struct xkb_action default_ptrdflt = { SA_SetPtrDflt };
+struct xkb_action default_setcontrols = { SA_SetControls };
+struct xkb_action default_lockcontrols = { SA_LockControls };
+struct xkb_action default_isolock = { SA_ISOLock };
+struct xkb_action default_switchscrn = { SA_SwitchScreen };
+struct xkb_action default_consscroll = { SA_ConsScroll };
+
+static struct key *current_key;
+
+/* The dummy gets used when the original may not be overwritten. */
+static struct key dummy_key;
+
+/* The current parsed group. */
+static int current_group;
+static int current_rmod = 0;
+
+/* The current symbol in the currently parsed key. */
+static int symbolcnt;
+static int actioncnt;
+
+mergemode merge_mode = override;
+
+//#define YYDEBUG 1
+
+static struct keytype *current_keytype;
+%}
+
+%union {
+ int val;
+ char *str;
+ modmap_t modmap;
+ struct xkb_action *action;
+ double dbl;
+ mergemode mergemode;
+}
+
+%token XKBKEYMAP "xkb_keymap"
+%token XKBKEYCODES "xkb_keycodes"
+%token XKBCOMPAT "xkb_compatibility"
+%token XKBGEOMETRY "xkb_geometry"
+%token XKBTYPES "xkb_types"
+%token XKBSYMBOLS "xkb_symbols"
+%token STR
+%token HEX
+%token FLAGS
+%token KEYCODE
+%token NUM
+%token MINIMUM "minimum"
+%token MAXIMUM "maximum"
+%token VIRTUAL "virtual"
+%token INDICATOR "indicator"
+%token ALIAS "alias"
+%token IDENTIFIER
+%token VMODS "virtualmods"
+%token TYPE "type"
+%token DATA "data"
+%token MAP "map"
+%token LEVEL_NAME "level_name"
+%token PRESERVE "preserve"
+%token LEVEL
+%token USEMODMAP "usemodmap"
+%token REPEAT "repeat"
+%token LOCKING "locking"
+%token VIRTUALMODIFIER "virtualmod"
+%token BOOLEAN
+%token INTERPRET "interpret"
+%token INTERPMATCH
+%token CLEARLOCKS "clearlocks"
+%token MODS "mods"
+%token SETMODS "setmods"
+%token LATCHMODS "latchmods"
+%token LOCKMODS "lockmods"
+%token ACTION "action"
+%token LATCHTOLOCK "latchtolock"
+%token GROUP "group"
+%token GROUPS "groups"
+%token SETGROUP "setgroup"
+%token LATCHGROUP "latchgroup"
+%token LOCKGROUP "lockgroup"
+%token ACCEL "accel"
+%token MOVEPTR "moveptr"
+%token PRIVATE "private"
+%token BUTTON "button"
+%token BUTTONNUM
+%token DEFAULT "default"
+%token COUNT "count"
+%token PTRBTN "ptrbtn"
+%token DEFAULTBTN "defaultbutton"
+%token ALL "all"
+%token NONE "none"
+%token ANY "any"
+%token CONTROLFLAG
+%token AFFECT "affect"
+%token PTRDFLT "setptrdflt"
+%token LOCKPTRBTN "lockptrbtn"
+%token SETCONTROLS "setcontrols"
+%token LOCKCONTROLS "lockcontrols"
+%token CONTROLS "controls"
+%token TERMINATE "terminate"
+%token WHICHMODSTATE "whichmodstate"
+%token WHICHGROUPSTATE "whichgroupstate"
+%token WHICHSTATE "whichstate"
+%token INDEX "index"
+%token ALLOWEXPLICIT "allowexplicit"
+%token DRIVESKBD "driveskbd"
+//%token AFFECTBTNLOCK
+%token SYMBOLS "symbols"
+%token NAME "name"
+%token GROUPNUM
+%token ACTIONS "actions"
+%token KEY "key"
+%token MODMAP "modifier_map"
+%token SHIFT "shift"
+%token LOCK "lock"
+%token CONTROL "control"
+%token MOD1 "mod1"
+%token MOD2 "mod2"
+%token MOD3 "mod3"
+%token MOD4 "mod4"
+%token MOD5 "mod5"
+%token UNLOCK "unlock"
+%token BOTH "both"
+%token NEITHER "neither"
+
+%token INCLUDE "include"
+%token AUGMENT "augment"
+%token OVERRIDE "override"
+%token REPLACE "replace"
+
+
+%token ISOLOCK "isolock"
+%token POINTERS "pointers"
+%token NOACTION "noaction"
+%token GROUPSWRAP "groupswrap"
+%token GROUPSCLAMP "groupsclamp"
+%token GROUPSREDIRECT "groupsredirect"
+%token OVERLAY "overlay"
+%token SWITCHSCREEN "switchscreen"
+%token SAMESERVER "sameserver"
+%token SCREEN "screen"
+%token LINE "line"
+%token PERCENT "percent"
+%token CONSSCROLL "consscroll"
+%token FLOAT "float"
+%type <str> STR KEYCODE IDENTIFIER
+%type <val> FLAGS NUM HEX vmod level LEVEL rmod BOOLEAN symbol INTERPMATCH
+%type <val> clearlocks usemodmap latchtolock noaccel button BUTTONNUM
+%type <val> ctrlflags allowexplicit driveskbd
+%type <val> DRIVESKBD GROUPNUM group symbolname groups whichstate WHICHSTATE
+/* Booleans */
+%type <val> locking repeat groupswrap groupsclamp sameserver
+%type <modmap> mods
+%type <action> action
+%type <action> ctrlparams
+%type <mergemode> include
+%type <dbl> FLOAT
+//%debug
+
+%%
+/* A XKB keymap. */
+xkbkeymap:
+ "xkb_keymap" '{' keymap '}' ';' { YYACCEPT }
+| "xkb_keymap" STR '{' keymap '}' ';' { YYACCEPT }
+| '{' keymap '}' { YYACCEPT } ';'
+;
+
+/* A XKB configuration has many sections. */
+keymap:
+ /* empty */
+| keymap types
+| keymap keycodes
+| keymap compat
+| keymap symbols
+| keymap geometry
+;
+
+include:
+ "include" { $$ = defaultmm }
+| "augment" { $$ = augment }
+| "replace" { $$ = replace }
+| "override" { $$= override }
+;
+
+/* All flags assigned to a section. */
+flags:
+ /* empty */
+| flags FLAGS
+;
+
+/* The header of a keycode section. */
+keycodes:
+ flags "xkb_keycodes" '{' keycodesect '}' ';'
+| flags "xkb_keycodes" STR '{' keycodesect '}' ';'
+;
+
+/* Process the includes on the stack. */
+keycodesinclude:
+ '{' keycodesect '}' { close_include () }
+| keycodesinclude '{' keycodesect '}' { close_include () }
+;
+
+/* The first lines of a keycode section. The amount of keycodes are
+ declared here. */
+keycodesect:
+/* empty */
+| "minimum" '=' NUM ';' keycodesect
+ {
+ min_keys = $3;
+ current_key = &keys[$3];
+ }
+| MAXIMUM '=' NUM ';' keycodesect
+ {
+ max_keys = $3;
+ keys = calloc ($3, sizeof (struct key));
+ }
+| KEYCODE '=' NUM ';'
+ { keyname_add ($1, $3); }
+ keycodesect
+| "replace" KEYCODE '=' NUM ';'
+ { keyname_add ($2, $4); }
+ keycodesect
+| "indicator" NUM '=' STR ';' keycodesect { }
+| "virtual" INDICATOR NUM '=' STR ';' keycodesect
+| "alias" KEYCODE '=' KEYCODE ';'
+ {
+ keycode_t key = keyname_find ($4);
+ if (key)
+ keyname_add ($2, key);
+ else
+ {
+ key = keyname_find ($2);
+ if (key)
+ keyname_add ($4, key);
+ }
+ }
+ keycodesect
+| include STR
+ { include_sections ($2, XKBKEYCODES, "keycodes", $1); }
+ keycodesinclude keycodesect
+;
+
+/* The header of a keytypes section. */
+types:
+ flags "xkb_types" '{' typessect '}' ';'
+| flags "xkb_types" STR '{' typessect '}' ';'
+;
+
+/* A list of virtual modifier declarations (see vmods_def), seperated
+ by commas. */
+vmodslist:
+ IDENTIFIER { vmod_add ($1); }
+| vmodslist ',' IDENTIFIER { vmod_add ($3) }
+;
+
+/* Virtual modifiers must be declared before they can be used. */
+vmods_def:
+ "virtualmods" vmodslist ';'
+;
+
+/* Return the number of the virtual modifier. */
+vmod:
+ IDENTIFIER { $$ = vmod_find ($1); }
+;
+
+/* A single realmodifier. */
+rmod:
+ "shift" { $$ = RMOD_SHIFT }
+| "lock" { $$ = RMOD_LOCK }
+| "control" { $$ = RMOD_CTRL }
+| "mod1" { $$ = RMOD_MOD1 }
+| "mod2" { $$ = RMOD_MOD2 }
+| "mod3" { $$ = RMOD_MOD3 }
+| "mod4" { $$ = RMOD_MOD4 }
+| "mod5" { $$ = RMOD_MOD5 }
+;
+
+/* One of more modifiers, seperated by '+'. A modmap_t will return all real
+ and virtual modifiers specified. */
+mods:
+ mods '+' rmod { $$.rmods = $1.rmods | $3; }
+| mods '+' vmod { $$.vmods = $1.vmods | $3; }
+ /* Use a mid-rule action to start with no modifiers. */
+| { $$.rmods = 0; $$.vmods = 0 } rmod { $$.rmods = $2; }
+| { $$.rmods = 0; $$.vmods = 0 } vmod { $$.vmods = $2; }
+| "all" { $$.rmods = 0xFF; $$.vmods = 0xFFFF}
+| "none" { $$.rmods = 0; $$.vmods = 0 }
+;
+
+/* The numeric level starts with 0. Level1-Level4 returns 0-3, also
+ numeric values can be used to describe a level. */
+level:
+ LEVEL { $$ = $1 - 1 }
+| "any" { $$ = 0 }
+| NUM { $$ = $1 - 1 }
+;
+
+/* A single keytype. */
+type:
+ /* Empty */
+| type MODS '=' mods ';'
+ { current_keytype->modmask = $4 }
+| type MAP '[' mods ']' '=' level ';'
+ { keytype_mapadd (current_keytype, $4, $7) }
+| type "level_name" '[' level ']' '=' STR ';'
+| type "preserve" '[' mods ']' '=' mods ';'
+ { keytype_preserve_add (current_keytype, $4, $7) }
+;
+
+/* Process the includes on the stack. */
+typesinclude:
+ '{' typessect '}' { close_include () }
+| typesinclude '{' typessect '}' { close_include () }
+;
+
+/* A keytype section contains keytypes and virtual modifier declarations. */
+typessect:
+ /* Empty */
+| typessect vmods_def
+| typessect TYPE STR { keytype_new ($3, &current_keytype) }'{' type '}' ';' { }
+| typessect include STR
+ { include_sections ($3, XKBTYPES, "types", $2) }
+ typesinclude
+;
+
+/* The header of a compatibility section. */
+compat:
+ flags "xkb_compatibility" '{' compatsect '}' ';'
+| flags "xkb_compatibility" STR '{' compatsect '}' ';'
+;
+
+/* XXX: A symbol can be more than just an identifier (hex). */
+symbol:
+ IDENTIFIER { $$ = (int) XStringToKeysym ( $1) ? : -1; }
+| ANY { $$ = 0 }
+| error { yyerror ("Invalid symbol.") }
+;
+
+/* Which kinds of modifiers (like base, locked, etc.) can affect the
+ indicator. */
+whichstate:
+ WHICHSTATE { $$ = $1 }
+| "none" { $$ = 0 }
+| "any" { $$ = 0xff } /* XXX */
+;
+
+/* The groups that can affect a indicator. */
+groups:
+ groups '+' group
+| groups '-' group
+| group {}
+| "all" { $$ = 0xff } /* XXX */
+;
+
+indicators:
+/* empty */
+| indicators indicator
+;
+
+/* An indicator desciption. */
+indicator:
+ "mods" '=' mods ';' { current_indicator->modmap = $3 }
+| "groups" '=' groups ';' { current_indicator->groups = $3 }
+| "controls" '=' ctrls ';'
+| "whichmodstate" '=' whichstate ';' { current_indicator->which_mods = $3 }
+| "whichgroupstate" '=' whichstate ';' { current_indicator->which_mods = $3 }
+| allowexplicit ';' {} /* Ignored for now. */
+| driveskbd ';' {}
+| "index" '=' NUM ';' {}
+;
+
+/* Boolean for allowexplicit. */
+allowexplicit:
+ '~' "allowexplicit" { $$ = 0 }
+| '!' "allowexplicit" { $$ = 0 }
+| "allowexplicit" { $$ = 1 }
+| "allowexplicit" '=' BOOLEAN { $$ = $3 }
+;
+
+/* Boolean for driveskbd. */
+driveskbd:
+ '~' "driveskbd" { $$ = 0 }
+| '!' "driveskbd" { $$ = 0 }
+| "driveskbd" { $$ = 1 }
+| "driveskbd" '=' BOOLEAN { $$ = $3 }
+;
+
+interprets:
+ /* Empty */
+| interprets interpret
+;
+
+/* A single interpretation. */
+interpret:
+ "usemodmap" '=' level ';'
+ { current_interpretation->match &= 0x7F | ($3 << 7) } /* XXX */
+| repeat ';'
+ {
+ current_interpretation->flags &= ~(KEYREPEAT | KEYNOREPEAT);
+ current_interpretation->flags |= $1;
+ }
+| locking ';' {}
+| "virtualmod" '=' vmod ';' { current_interpretation->vmod = $3 }
+| "action" '=' action ';'
+ {
+ memcpy (&current_interpretation->action, $3, sizeof (xkb_action_t));
+ free ($3);
+ }
+;
+
+/* Process the includes on the stack. */
+compatinclude:
+ '{' compatsect '}' { close_include () }
+| compatinclude '{' compatsect '}' { close_include () }
+;
+
+/* The body of a compatibility section. */
+compatsect:
+ /* Empty */
+| compatsect vmods_def
+| compatsect "interpret" '.'
+ { current_interpretation = &default_interpretation }
+ interpret
+| compatsect "interpret" symbol
+ {
+ if ($3 != -1)
+ {
+ interpret_new (&current_interpretation, $3);
+ current_interpretation->match |= 1;
+ }
+ }
+ '{' interprets '}' ';'
+| compatsect "interpret" symbol '+' rmod
+ {
+ if ($3 != -1)
+ {
+ interpret_new (&current_interpretation, $3);
+ current_interpretation->rmods = $5;
+ current_interpretation->match |= 4;
+ }
+ }
+ '{' interprets '}' ';'
+| compatsect "interpret" symbol '+' "any"
+ {
+ if ($3 != -1)
+ {
+ interpret_new (&current_interpretation, $3);
+ current_interpretation->rmods = 255;
+ current_interpretation->match |= 2;
+ }
+ }
+ '{' interprets '}' ';'
+| compatsect "interpret" symbol '+' INTERPMATCH '(' mods ')'
+ {
+ if ($3 != -1)
+ {
+ interpret_new (&current_interpretation, $3);
+ current_interpretation->rmods = $7.rmods;
+ current_interpretation->match |= $5;
+ }
+ }
+ '{' interprets '}' ';'
+| compatsect GROUP NUM '=' mods ';'
+| compatsect "indicator" STR '{' indicators '}' ';'
+| compatsect include STR
+ { include_sections ($3, XKBCOMPAT, "compat", $2) }
+ compatinclude
+| compatsect actiondef
+| compatsect "indicator" '.' indicator
+;
+
+
+ /* Booleans */
+/* Boolean for clearlocks. */
+clearlocks:
+ '~' "clearlocks" { $$ = 0 }
+| '!' "clearlocks" { $$ = 0 }
+| "clearlocks" { $$ = 1 }
+| "clearlocks" '=' BOOLEAN { $$ = $3 }
+;
+
+/* Boolean for latchtolock. */
+latchtolock:
+ '~' "latchtolock" { $$ = 0 }
+| '!' "latchtolock" { $$ = 0 }
+| "latchtolock" { $$ = 1 }
+| "latchtolock" '=' BOOLEAN { $$ = $3 }
+;
+
+/* Boolean for useModMap. */
+usemodmap:
+ '~' "usemodmap" { $$ = 0 }
+| '!' "usemodmap" { $$ = 0 }
+| "usemodmap" { $$ = 1 }
+| "usemodmap" '=' BOOLEAN { $$ = $3 }
+;
+
+/* Boolean for locking. */
+locking:
+ '~' "locking" { $$ = 0 }
+| '!' "locking" { $$ = 0 }
+| "locking" { $$ = 1 }
+| "locking" '=' BOOLEAN { $$ = $3 }
+;
+
+/* Boolean for repeat. */
+repeat:
+ '~' "repeat" { $$ = KEYNOREPEAT }
+| '!' "repeat" { $$ = KEYNOREPEAT }
+| "repeat" { $$ = KEYREPEAT }
+| "repeat" '=' BOOLEAN
+ {
+ if ($3)
+ $$ = KEYREPEAT;
+ else
+ $$ = KEYNOREPEAT;
+ }
+;
+
+/* Boolean for groupswrap. */
+groupswrap:
+ '~' "groupswrap" { $$ = 0 }
+| '!' "groupswrap" { $$ = 0 }
+| "groupswrap" { $$ = 1 }
+| "groupswrap" '=' BOOLEAN { $$ = $3 }
+;
+
+/* Boolean for groupsclamp. */
+groupsclamp:
+ '~' "groupsclamp" { $$ = 0 }
+| '!' "groupsclamp" { $$ = 0 }
+| "groupsclamp" { $$ = 1 }
+| "groupsclamp" '=' BOOLEAN { $$ = $3 }
+;
+
+/* Boolean for noaccel. */
+noaccel:
+ '~' "accel" { $$ = 0 }
+| '!' "accel" { $$ = 0 }
+| "accel" { $$ = 1 }
+| "accel" '=' BOOLEAN { $$ = $3 }
+;
+
+
+sameserver:
+ '~' "sameserver" { $$ = 0 }
+| '!' "sameserver" { $$ = 0 }
+| "sameserver" { $$ = 1 }
+| "sameserver" '=' BOOLEAN { $$ = $3 }
+;
+
+setmodsparams:
+ /* empty */
+| setmodsparam
+| setmodsparams ',' setmodsparam
+;
+
+
+/* Parameter for the (Set|Lock|Latch)Mods action. */
+setmodsparam:
+ "mods" '=' mods
+ {
+ ((action_setmods_t *) current_action)->modmap = $3;
+ }
+| "mods" '=' "usemodmap"
+ { ((action_setmods_t *) current_action)->flags |= useModMap;
+ }
+| clearlocks
+ {
+ ((action_setmods_t *) current_action)->flags &= ~clearLocks;
+ ((action_setmods_t *) current_action)->flags |= $1;
+ }
+| usemodmap
+ {
+ ((action_setmods_t *) current_action)->flags &= ~useModMap;
+ ((action_setmods_t *) current_action)->flags |= $1;
+ }
+| latchtolock
+ {
+ ((action_setmods_t *) current_action)->flags &= ~latchToLock;
+ ((action_setmods_t *) current_action)->flags |= $1;
+ }
+;
+
+setgroupparams:
+/* empty */
+| setgroupparam
+| setgroupparams ',' setgroupparam
+;
+
+/* Parameter for the (Set|Lock|Latch)Group action. */
+setgroupparam:
+ "group" '=' NUM
+ {
+ ((action_setgroup_t *) current_action)->group = $3;
+ ((action_setgroup_t *) current_action)->flags |= groupAbsolute;
+ }
+| "group" '=' '+' NUM
+ {
+ ((action_setgroup_t *) current_action)->group = $4;
+ }
+| "group" '=' '-' NUM
+ {
+ ((action_setgroup_t *) current_action)->group = -$4;
+ }
+| clearlocks
+ {
+ ((action_setgroup_t *) current_action)->flags |= $1;
+ }
+| latchtolock
+ {
+ ((action_setgroup_t *) current_action)->flags |= $1;
+ }
+;
+
+moveptrparams:
+/* empty */
+| moveptrparam
+| moveptrparams ',' moveptrparam
+;
+
+/* Parameters for the MovePtr action. */
+moveptrparam:
+ IDENTIFIER '=' NUM
+ {
+ ((action_moveptr_t *) current_action)->x = $3;
+ ((action_setgroup_t *) current_action)->flags |= MoveAbsoluteX;
+ }
+| IDENTIFIER '=' '+' NUM
+ {
+ ((action_moveptr_t *) current_action)->x = $4;
+ }
+| IDENTIFIER '=' '-' NUM
+ {
+ ((action_moveptr_t *) current_action)->x = -$4;
+ }
+| noaccel
+ {
+ ((action_moveptr_t *) current_action)->flags |= NoAcceleration;
+ }
+;
+
+/* A mouse button. */
+button:
+ NUM { $$ = $1 }
+| BUTTONNUM { $$ = $1 }
+| "default" { $$ = 0 }
+;
+
+affectbtnlock:
+ "lock"
+| "unlock"
+| "both"
+| "neither"
+;
+
+ptrbtnparams:
+ /* empty */
+| ptrbtnparam
+| ptrbtnparams ',' ptrbtnparam
+;
+
+/* Parameters for the (Set|Lock|Latch)PtrBtn action. */
+ptrbtnparam:
+ "button" '=' button
+ { ((action_ptrbtn_t *) current_action)->button = $3; }
+| "count" '=' NUM
+ { ((action_ptrbtn_t *) current_action)->count = $3; }
+| "affect" '=' affectbtnlock
+ {
+ // ((action_ptrbtn_t *) $$)->a = $3;
+ }
+;
+
+/* XXX: This should be extended. */
+affectbtns:
+ "defaultbutton"
+| "button"
+| "all"
+;
+
+ptrdfltparams:
+/* empty */
+| ptrdfltparam
+| ptrdfltparams ',' ptrdfltparam
+;
+
+/* Parameters for the SetPtrDflt action. */
+ptrdfltparam:
+ "button" '=' button { }
+| "button" '=' '+' button { }
+| "button" '=' '-' button { }
+| "affect" '=' affectbtns { }
+;
+
+/* A list of controlflags. */
+ctrls:
+ ctrls '+' CONTROLFLAG// { $$ |= $3 }
+| CONTROLFLAG// { $$ = $1 }
+| OVERLAY
+;
+
+/* Modified controlflags. */
+ctrlflags:
+ ctrls { /*$$ = $1*/ }
+| "all" { $$ = 0xFFFF }
+| "none" { $$ = 0 }
+;
+
+/* The parameters of a (Set|Lock|Latch)Ctrls Action. */
+ctrlparams:
+ "controls" '=' ctrlflags
+ { /* ((action_setcontrols_t *) $$)->controls = $3; */ }
+;
+
+isoaffect:
+ "mods"
+| "groups"
+| "controls"
+| "pointers"
+| "all"
+| "none"
+;
+
+isolockparams:
+/* empty */
+| isolockparam
+| isolockparams ',' isolockparam
+;
+
+/* Parameters for the ISOLock action. */
+isolockparam:
+ "mods" '=' mods
+| "mods" '=' USEMODMAP
+| "group" '=' group
+| "controls" '=' ctrlflags
+| "affect" '=' isoaffect
+;
+
+switchscrnparams:
+ switchscrnparam
+ | switchscrnparams ',' switchscrnparam
+;
+
+/* Parameters for the SwitchScreen action. */
+switchscrnparam:
+ "screen" '=' NUM
+ {
+ ((action_switchscrn_t *) current_action)->screen = $3;
+ ((action_switchscrn_t *) current_action)->flags |= screenAbs;
+ }
+| "screen" '+' '=' NUM
+ {
+ ((action_switchscrn_t *) current_action)->screen = $4;
+ }
+| "screen" '-' '=' NUM
+ {
+ ((action_switchscrn_t *) current_action)->screen = -$4;
+ }
+| sameserver
+ {
+ /* XXX: Implement this. */
+/* ((action_switchscrn_t *) current_action)->flags &= ~0; */
+/* ((action_switchscrn_t *) current_action)->flags |= $1; */
+ }
+;
+
+consscrollparams:
+ consscrollparam
+ | consscrollparams ',' consscrollparam
+;
+
+/* Parameters for the ConsScroll action. */
+consscrollparam:
+ "screen" '+' '=' FLOAT
+ {
+ ((action_consscroll_t *) current_action)->screen = $4;
+ }
+| "screen" '-' '=' FLOAT
+ {
+ ((action_consscroll_t *) current_action)->screen = -$4;
+ }
+| "line" '=' NUM
+ {
+ ((action_consscroll_t *) current_action)->line = $3;
+ ((action_consscroll_t *) current_action)->flags |= lineAbs;
+ }
+| "line" '+' '=' NUM
+ {
+ ((action_consscroll_t *) current_action)->line = $4;
+ }
+| "line" '-' '=' NUM
+ {
+ ((action_consscroll_t *) current_action)->line = -$4;
+ }
+| "percent" '=' NUM
+ {
+ ((action_consscroll_t *) current_action)->percent = $3;
+ ((action_consscroll_t *) current_action)->flags |= usePercentage;
+ }
+;
+
+privateparams:
+ /* empty */
+ | privateparam
+ | privateparams ',' privateparam
+;
+
+privateparam:
+ "type" '=' HEX
+ {
+ }
+| "data" '=' STR
+ {
+ }
+;
+
+/* An action definition. */
+action:
+ "setmods"
+ {
+ if (set_default_action (&default_setmods, &current_action))
+ YYABORT;
+ }
+ '(' setmodsparams ')' { $$ = current_action }
+| "latchmods"
+ {
+ if (set_default_action (&default_latchmods, &current_action))
+ YYABORT;
+ }
+ '(' setmodsparams ')' { $$ = current_action }
+| "lockmods"
+ {
+ if (set_default_action (&default_lockmods, &current_action))
+ YYABORT;
+ }
+ '(' setmodsparams ')' { $$ = current_action }
+| "setgroup"
+ {
+ if (set_default_action (&default_setgroup, &current_action))
+ YYABORT;
+ }
+ '(' setgroupparams ')' { $$ = current_action }
+| "latchgroup"
+ {
+ if (set_default_action (&default_latchgroup, &current_action))
+ YYABORT;
+ }
+ '(' setgroupparams ')' { $$ = current_action }
+| "lockgroup"
+ {
+ if (set_default_action (&default_lockgroup, &current_action))
+ YYABORT;
+ }
+ '(' setgroupparams ')' { $$ = current_action }
+| "moveptr"
+ {
+ if (set_default_action (&default_moveptr, &current_action))
+ YYABORT;
+ }
+ '(' moveptrparams ')' { $$ = current_action }
+| "ptrbtn"
+ {
+ if (set_default_action (&default_ptrbtn, &current_action))
+ YYABORT;
+ }
+ '(' ptrbtnparams ')' { $$ = current_action }
+| "lockptrbtn"
+ {
+ if (set_default_action (&default_lockptrbtn, &current_action))
+ YYABORT;
+ }
+ '(' ptrbtnparams ')' { $$ = current_action }
+| "setptrdflt"
+ {
+ if (set_default_action (&default_ptrdflt, &current_action))
+ YYABORT;
+ }
+ '(' ptrdfltparams ')' { $$ = current_action }
+| "setcontrols"
+ {
+ if (set_default_action (&default_setcontrols, &current_action))
+ YYABORT;
+ }
+ '(' ctrlparams ')' { $$ = current_action }
+| "lockcontrols"
+ {
+ if (set_default_action (&default_lockcontrols, &current_action))
+ YYABORT;
+ }
+ '(' ctrlparams ')' { $$ = current_action }
+| "terminate" '(' ')'
+ { $$ = calloc (1, sizeof (xkb_action_t)); $$->type = SA_TerminateServer }
+| "switchscreen"
+ {
+ if (set_default_action (&default_switchscrn, &current_action))
+ YYABORT;
+ }
+'(' switchscrnparams ')' { $$ = current_action }
+| "consscroll"
+ {
+ if (set_default_action (&default_consscroll, &current_action))
+ YYABORT;
+ }
+ '(' consscrollparams ')' { $$ = current_action }
+| "isolock"
+ {
+ if (set_default_action (&default_isolock, &current_action))
+ YYABORT;
+ }
+ '(' isolockparams ')' { $$ = current_action }
+| "private" '(' privateparams ')'
+ { $$ = calloc (1, sizeof (xkb_action_t)); $$->type = SA_NoAction }
+| "noaction" '(' ')'
+ { $$ = calloc (1, sizeof (xkb_action_t)); $$->type = SA_NoAction }
+| error ')' { yyerror ("Invalid action\n") }
+;
+
+/* Define values for default actions. */
+actiondef:
+ "setmods" '.' { current_action = &default_setmods } setmodsparam ';'
+| "latchmods" '.' { current_action = &default_latchmods } setmodsparam ';'
+| "lockmods" '.' { current_action = &default_lockmods } setmodsparam ';'
+| "setgroup" '.' { current_action = &default_setgroup } setgroupparam ';'
+| "latchgroup" '.' { current_action = &default_latchgroup } setgroupparam ';'
+| "lockgroup" '.' { current_action = &default_lockgroup } setgroupparam ';'
+| "moveptr" '.' { current_action = &default_moveptr } moveptrparam ';'
+| "ptrbtn" '.' { current_action = &default_ptrbtn } ptrbtnparam ';'
+| "lockptrbtn" '.' { current_action = &default_lockptrbtn } ptrbtnparam ';'
+| "setptrdflt" '.' { current_action = &default_ptrdflt } ptrdfltparam ';'
+| "setcontrols" '.' { current_action = &default_setcontrols } ctrlparams ';'
+| "lockcontrols" '.' { current_action = &default_lockcontrols } ctrlparams ';'
+| "isolock" '.' { current_action = &default_isolock } isolockparam ';'
+| "switchscreen" '.' { current_action = &default_switchscrn } switchscrnparam ';'
+;
+
+/* The header of a symbols section. */
+symbols:
+ flags "xkb_symbols" '{' symbolssect '}' ';'
+| flags "xkb_symbols" STR '{' symbolssect '}' ';'
+;
+
+/* A group. */
+group:
+ GROUPNUM { $$ = $1 - 1 }
+| NUM { $$ = $1 - 1}
+| HEX { $$ = $1 - 1}
+;
+
+/* A list of keysyms and keycodes bound to a realmodifier. */
+key_list:
+ key_list ',' KEYCODE { set_rmod_keycode ($3, current_rmod) }
+| key_list ',' symbolname { ksrm_add ($3, current_rmod) }
+| KEYCODE { set_rmod_keycode ($1, current_rmod) }
+| symbolname { ksrm_add ($1, current_rmod) }
+;
+
+/* Process the includes on the stack. */
+symbolinclude:
+ '{' symbolssect '}' { close_include () }
+| symbolinclude '{' symbolssect '}' { close_include () }
+;
+
+/* A XKB symbol section. It is used to bind keysymbols, actions and
+ realmodifiers to keycodes. */
+symbolssect:
+ /* Empty */
+| symbolssect vmods_def
+| symbolssect NAME '[' group ']' '=' STR ';'
+| symbolssect "key" KEYCODE
+ {
+ key_new ($3);
+ current_group = 0;
+ } '{' keydescs '}' ';'
+| symbolssect "replace" "key" KEYCODE
+ {
+ key_delete ($4);
+ key_new ($4);
+ current_group = 0;
+ } '{' keydescs '}' ';'
+| symbolssect "override" "key" KEYCODE
+ {
+ key_delete ($4);
+ key_new ($4);
+ current_group = 0;
+ } '{' keydescs '}' ';'
+| symbolssect "modifier_map" rmod { current_rmod = $3 } '{' key_list '}' ';'
+| symbolssect include STR
+ { include_sections ($3, XKBSYMBOLS, "symbols", $2) }
+ symbolinclude
+| symbolssect actiondef
+| symbolssect "key" '.' {current_key = default_key } keydesc ';'
+| symbolssect error ';' { yyerror ("Error in symbol section\n") }
+;
+
+/* Returns a keysymbols, the numberic representation. */
+symbolname:
+ IDENTIFIER { $$ = XStringToKeysym ($1); }
+| NUM { $$ = $1 + '0' }
+;
+
+/* None or more keysyms, assigned to a single group of the current
+ key. */
+groupsyms:
+ /* empty */
+| groupsyms ',' symbolname
+ { key_set_keysym (current_key, current_group, symbolcnt++, $3) }
+| { symbolcnt = 0 } symbolname
+ {
+ symbolcnt = 0;
+ key_set_keysym (current_key, current_group, symbolcnt++, $2);
+ }
+;
+
+/* A list of actions. */
+actions:
+ actions ',' action
+ { key_set_action (current_key, current_group, actioncnt++, $3) }
+| { actioncnt = 0 } action
+ { key_set_action ( current_key, current_group, actioncnt++, $2) }
+;
+
+keydescs:
+ keydesc
+| keydescs ',' keydesc
+;
+
+/* A single key and everything assigned to it. */
+keydesc:
+ "type" '[' group ']' '=' STR
+ {
+ current_key->groups[$3].keytype = keytype_find ($6);
+ }
+| "type" '[' error ']' { yyerror ("Invalid group.\n") }
+| "type" '=' STR
+ { current_key->groups[current_group].keytype = keytype_find ($3) }
+| { symbolcnt = 0 } "symbols" '[' group ']' { current_group = $4 } '=' '[' groupsyms ']'
+ {
+ current_key->numgroups = ($4 + 1) > current_key->numgroups ?
+ ($4 + 1) : current_key->numgroups;
+ }
+| {actioncnt = 0 } "actions" '[' group ']' { current_group = $4 } '=' '[' actions ']'
+ {
+ current_key->numgroups = ($4 + 1) > current_key->numgroups ?
+ ($4 + 1) : current_key->numgroups;
+ }
+| "virtualmods" '=' mods
+ { current_key->mods.vmods = $3.vmods }
+| '[' groupsyms ']'
+ {
+ current_group++;
+ current_key->numgroups = current_group > current_key->numgroups ?
+ current_group : current_key->numgroups;
+ }
+| '[' actions ']'
+ {
+ current_group++;
+ current_key->numgroups = current_group > current_key->numgroups ?
+ current_group : current_key->numgroups;
+ }
+| locking {}/* This is not implemented - YET. */
+/* XXX: There 3 features are described in Ivan Pascals docs about XKB,
+ but aren't used in the standard keymaps and cannot be used because it
+ cannot be stored in the XKM dataformat. */
+| groupswrap {}
+| groupsclamp {}
+| "groupsredirect" '=' NUM
+| "overlay" '=' KEYCODE /* If you _REALLY_ need overlays, mail me!!!! */
+| repeat
+ {
+ current_key->flags &= ~(KEYREPEAT | KEYNOREPEAT);
+ current_key->flags |= $1;
+ }
+;
+
+/* The geometry map is ignored. */
+
+/* The header of a geometry section. */
+geometry:
+ flags "xkb_geometry" '{' { skipsection () } '}' ';'
+| flags "xkb_geometry" STR '{' { skipsection () } '}' ';'
+;
+
+%%
+/* Skip all tokens until a section of the type SECTIONSYMBOL with the
+ name SECTIONNAME is found. */
+static void
+skip_to_sectionname (char *sectionname, int sectionsymbol)
+{
+ int symbol;
+
+ do
+ {
+ do
+ {
+ symbol = yylex ();
+ } while (symbol != sectionsymbol);
+ symbol = yylex ();
+
+ if (symbol != STR)
+ continue;
+
+ } while (strcmp (yylval.str, sectionname));
+}
+
+/* Skip all tokens until the default section is found. */
+static void
+skip_to_defaultsection (void)
+{
+ int symbol;
+
+ /* Search the default section. */
+ do
+ {
+ symbol = yylex ();
+ } while (symbol != DEFAULT);
+
+ do
+ {
+ symbol = yylex ();
+ } while (symbol != '{');
+ scanner_unput ('{');
+}
+
+/* Include a single file. INCL is the filename. SECTIONSYMBOL is the
+ token that marks the beginning of the section. DIRNAME is the name
+ of the directory from where the includefiles must be loaded. NEW_MM
+ is the mergemode that should be used. */
+static error_t
+include_section (char *incl, int sectionsymbol, char *dirname,
+ mergemode new_mm)
+{
+ void include_file (FILE *, mergemode, char *);
+ char *filename;
+ char *sectionname = NULL;
+ FILE *includefile;
+
+ sectionname = strchr (incl, '(');
+ if (sectionname)
+ {
+ int snlen;
+
+ snlen = strlen (sectionname);
+ if (sectionname[snlen-1] != ')')
+ return 0;
+ sectionname[snlen-1] = '\0';
+ sectionname[0] = '\0';
+ sectionname++;
+
+ if (asprintf (&filename, "%s/%s", dirname, incl) < 0)
+ return ENOMEM;
+ }
+ else
+ {
+ if (asprintf (&filename, "%s/%s", dirname, incl) < 0)
+ return ENOMEM;
+ }
+
+ includefile = fopen (strdup (filename), "r");
+
+ if (includefile == NULL)
+ {
+ fprintf (stderr, "Couldn't open include file \"%s\"\n", filename);
+ exit (EXIT_FAILURE);
+ }
+
+ include_file (includefile, new_mm, strdup (filename));
+
+ /* If there is a sectionname not the entire file should be included,
+ the scanner should be positioned at the required section. */
+ if (sectionname)
+ skip_to_sectionname (sectionname, sectionsymbol);
+ else
+ skip_to_defaultsection ();
+
+ return 0;
+}
+
+/* Include multiple file sections, seperated by '+'. INCL is the
+ include string. SECTIONSYMBOL is the token that marks the beginning
+ of the section. DIRNAME is the name of the directory from where the
+ includefiles must be loaded. NEW_MM is the mergemode that should be
+ used. */
+static error_t
+include_sections (char *incl, int sectionsymbol, char *dirname,
+ mergemode new_mm)
+{
+ char *curstr;
+ char *s;
+
+ if (new_mm == defaultmm)
+ new_mm = merge_mode;
+
+/* printf ("dir: %s - include: %s: %d\n", dirname, incl, new_mm); */
+ /* Cut of all includes, starting with the first. The includes are
+ pushed on the stack in reversed order. */
+ do {
+ curstr = strrchr (incl, '+');
+ if (curstr)
+ {
+ curstr[0] = '\0';
+ curstr++;
+
+ s = strdup (curstr);
+ if (s == NULL)
+ return ENOMEM;
+
+ include_section (s, sectionsymbol, dirname, new_mm);
+ free (s);
+ }
+ } while (curstr);
+
+ s = strdup (incl);
+ if (s == NULL)
+ return ENOMEM;
+
+ include_section (s, sectionsymbol, dirname, new_mm);
+ free (s);
+
+ return 0;
+}
+
+/* Skip all tokens until the end of the section is reached. */
+static void
+skipsection (void)
+{
+ /* Pathesensis counter. */
+ int p = 0;
+ while (p >= 0)
+ {
+ int symbol = yylex ();
+ if (symbol == '{')
+ p++;
+ if (symbol == '}')
+ p--;
+ }
+ scanner_unput ('}');
+}
+
+/* Initialize the default action with the default DEF. */
+static error_t
+set_default_action (struct xkb_action *def,
+ struct xkb_action **newact)
+{
+ struct xkb_action *newaction;
+ newaction = malloc (sizeof (struct xkb_action));
+ if (newaction == NULL)
+ return ENOMEM;
+ memcpy (newaction, def, sizeof (struct xkb_action));
+
+ *newact = newaction;
+
+ return 0;
+}
+
+/* Remove all keysyms bound to the group GROUP or the key KEY. */
+static void
+remove_symbols (struct key *key, group_t group)
+{
+ // printf ("rem: group: %d\n", group);
+ if (key->groups[group].symbols)
+ {
+ free (key->groups[group].symbols);
+ key->groups[group].symbols = NULL;
+ key->groups[group].width = 0;
+ }
+}
+
+/* Set the keysym KS for key KEY on group GROUP and level LEVEL. */
+static void
+key_set_keysym (struct key *key, group_t group, int level, symbol ks)
+{
+ symbol *keysyms = key->groups[group].symbols;
+
+ if ((level + 1) > key->groups[group].width)
+ {
+ keysyms = realloc (keysyms, level + 1);
+
+ if (!keys)
+ {
+ fprintf (stderr, "No mem\n");
+ exit (EXIT_FAILURE);
+ }
+
+ key->groups[group].symbols = keysyms;
+ key->groups[group].width++;
+ }
+ else
+ /* For NoSymbol leave the old symbol intact. */
+ if (!ks)
+ return;
+
+
+ keysyms[level++] = ks;
+}
+
+/* Set the action ACTION for key KEY on group GROUP and level LEVEL. */
+void
+key_set_action (struct key *key, group_t group, int level, xkb_action_t *action)
+{
+ xkb_action_t **actions = key->groups[group].actions;
+ size_t width = key->groups[group].actionwidth;
+
+ if ((size_t) (level + 1) > width)
+ {
+ actions = realloc (actions, level + 1);
+ /* Previous levels have no actions defined. */
+ memset (&actions[level - 1], 0, level - width);
+
+ if (!keys)
+ {
+ fprintf (stderr, "No mem\n");
+ exit (EXIT_FAILURE);
+ }
+
+ key->groups[group].actions = actions;
+ key->groups[group].actionwidth += level - width + 1;
+ }
+
+ actions[level++] = action;
+}
+
+/* Delete keycode to keysym mapping. */
+void
+key_delete (char *keyname)
+{
+ group_t group;
+ keycode_t kc = keyname_find (keyname);
+
+ current_key = &keys[kc];
+ for (group = 0; group < current_key->numgroups; group++)
+ remove_symbols (current_key, group);
+ memset (current_key, 0, sizeof (struct key));
+
+}
+
+/* Create a new keycode to keysym mapping, check if the old one should
+ be removed or preserved. */
+static void
+key_new (char *keyname)
+{
+ group_t group;
+
+ int isempty (char *mem, int size)
+ {
+ int i;
+ for (i = 0; i < size; i++)
+ if (mem[i])
+ return 0;
+ return 1;
+ }
+
+ keycode_t kc = keyname_find (keyname);
+
+ if (merge_mode == augment)
+ {
+ if (!isempty ((char *) &keys[kc], sizeof (struct key)))
+ {
+ current_key = &dummy_key;
+ return;
+ }
+ else
+ current_key = &keys[kc];
+ }
+
+ if (merge_mode == override)
+ current_key = &keys[kc];
+
+ if (merge_mode == replace)
+ {
+ key_delete (keyname);
+ current_key = &keys[kc];
+ }
+
+ if (current_key->numgroups == 0 || merge_mode == replace)
+ {
+ /* Clone the default key. */
+ memcpy (current_key, default_key, sizeof (struct key));
+ for (group = 0; group < 3; group++)
+ {
+ current_key->groups[group].symbols = NULL;
+ current_key->groups[group].actions = NULL;
+ current_key->groups[group].actionwidth = 0;
+ current_key->groups[group].width = 0;
+ }
+ }
+}
+
+/* Load the XKB configuration from the section XKBKEYMAP in the
+ keymapfile XKBKEYMAPFILE. Use XKBDIR as root directory for relative
+ pathnames. */
+error_t
+parse_xkbconfig (char *xkbdir, char *xkbkeymapfile, char *xkbkeymap)
+{
+ error_t err;
+ char *cwd = getcwd (NULL, 0);
+ extern FILE *yyin;
+ extern char *filename;
+
+ // xkbkeymap = 0;
+
+ // xkbkeymapfile = 0;
+
+ // xkbdir = "/etc/X11/xkb";
+ // xkbdir ="/home/marco/xkb";
+ // xkbkeymapfile = "keymap/hurd";
+ // xkbkeymap = "hack";
+
+ debug_printf ("Dir: %s, file: %s sect: %s\n", xkbdir, xkbkeymapfile, xkbkeymap);
+
+ // xkbkeymapfile = "default.xkb";
+ //xkbkeymap = "us";
+ // yydebug = 1;
+ if (xkbkeymapfile)
+ {
+ filename = xkbkeymapfile;
+
+ if (chdir (xkbdir) == -1)
+ {
+ fprintf (stderr, "Could not set \"%s\" as the active directory\n",
+ xkbdir);
+ return errno;
+ }
+
+ yyin = fopen (xkbkeymapfile, "r");
+ if (yyin == NULL)
+ {
+ fprintf (stderr, "Couldn't open keymap file\n");
+ return errno;
+ }
+
+ if (xkbkeymap)
+ skip_to_sectionname (xkbkeymap, XKBKEYMAP);
+ }
+ else /* Use defaults. */
+ {
+ extern char *default_xkb_keymap;
+ filename = "<<INTERNAL>>";
+
+ yyin = tmpfile ();
+ //yyin = fopen ("TEST", "w+");
+
+ if (yyin == NULL)
+ {
+ fprintf (stderr, "Couldn't create tmp file.\n");
+ return errno;
+ }
+ /* XXX: error handling. */
+ fprintf (yyin, "%s\n", default_xkb_keymap);
+
+ rewind (yyin);
+ }
+ err = yyparse ();
+ fclose (yyin);
+
+ if (err || yynerrs > 0)
+ return EINVAL;
+
+ if (xkbkeymapfile)
+ {
+ if (chdir (cwd) == -1)
+ {
+ fprintf (stderr,
+ "Could not set \"%s\" as the active directory\n", cwd);
+ return errno;
+ }
+ }
+
+ /* Apply keysym to realmodifier mappings. */
+ ksrm_apply ();
+
+ free (cwd);
+ return 0;
+}
diff --git a/console-client/xkb/symname.c b/console-client/xkb/symname.c
new file mode 100644
index 00000000..9f219513
--- /dev/null
+++ b/console-client/xkb/symname.c
@@ -0,0 +1,96 @@
+#include <string.h>
+#define NEEDKTABLE
+#include "ks_tables.h"
+#include "keysymdef.h"
+
+#define NoSymbol 0
+
+typedef unsigned long Signature;
+typedef unsigned long KeySym;
+
+KeySym XStringToKeysym(char *s)
+{
+ register int i, n;
+ int h;
+ register Signature sig = 0;
+ register const char *p = s;
+ register int c;
+ register int idx;
+ const unsigned char *entry;
+ unsigned char sig1, sig2;
+ KeySym val;
+
+ while ((c = *p++))
+ sig = (sig << 1) + c;
+ i = sig % KTABLESIZE;
+ h = i + 1;
+ sig1 = (sig >> 8) & 0xff;
+ sig2 = sig & 0xff;
+ n = KMAXHASH;
+ while ((idx = hashString[i]))
+ {
+ entry = &_XkeyTable[idx];
+ if ((entry[0] == sig1) && (entry[1] == sig2) &&
+ !strcmp(s, (char *)entry + 4))
+ {
+ val = (entry[2] << 8) | entry[3];
+ if (!val)
+ val = XK_VoidSymbol;
+ return val;
+ }
+ if (!--n)
+ break;
+ i += h;
+ if (i >= KTABLESIZE)
+
+ i -= KTABLESIZE;
+ }
+
+ /*
+
+ The KeysymDB is not yet supported.
+
+ if (!initialized)
+ (void)_XInitKeysymDB();
+ if (keysymdb)
+ {
+ XrmValue result;
+ XrmRepresentation from_type;
+ char c;
+ XrmQuark names[2];
+
+ names[0] = _XrmInternalStringToQuark(s, p - s - 1, sig, False);
+ names[1] = NULLQUARK;
+ (void)XrmQGetResource(keysymdb, names, Qkeysym, &from_type, &result);
+ if (result.addr && (result.size > 1))
+ {
+ val = 0;
+ for (i = 0; i < result.size - 1; i++)
+ {
+ c = ((char *)result.addr)[i];
+ if ('0' <= c && c <= '9') val = (val<<4)+c-'0';
+ else if ('a' <= c && c <= 'f') val = (val<<4)+c-'a'+10;
+ else if ('A' <= c && c <= 'F') val = (val<<4)+c-'A'+10;
+ else return NoSymbol;
+ }
+ return val;
+ }
+ }
+ */
+
+ if (*s == 'U') {
+ val = 0;
+ for (p = &s[1]; *p; p++) {
+ c = *p;
+ if ('0' <= c && c <= '9') val = (val<<4)+c-'0';
+ else if ('a' <= c && c <= 'f') val = (val<<4)+c-'a'+10;
+ else if ('A' <= c && c <= 'F') val = (val<<4)+c-'A'+10;
+ else return NoSymbol;
+
+ }
+ if (val >= 0x01000000)
+ return NoSymbol;
+ return val | 0x01000000;
+ }
+ return (NoSymbol);
+}
diff --git a/console-client/xkb/xkb-data/keymap/hurd b/console-client/xkb/xkb-data/keymap/hurd
new file mode 100644
index 00000000..c49bb382
--- /dev/null
+++ b/console-client/xkb/xkb-data/keymap/hurd
@@ -0,0 +1,347 @@
+// $Xorg: xfree86,v 1.3 2000/08/17 19:54:40 cpqbld Exp $
+
+
+
+
+// $XFree86: xc/programs/xkbcomp/keymap/xfree86,v 3.26 2002/01/16 18:20:11 dawes Exp $
+
+xkb_keymap "Hurd" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default+hurd" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+hurd+pc104+group(win_switch)+compose(menu)" };
+ xkb_geometry { include "pc" };
+};
+xkb_keymap "us" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default+hurd" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "us(pc105)+hurd" };
+ xkb_geometry { include "pc" };
+};
+xkb_keymap "us_microsoft" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "us(pc105)" };
+ xkb_geometry { include "microsoft" };
+};
+xkb_keymap "us_flexpro" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "us(pc105)" };
+ xkb_geometry { include "keytronic(FlexPro)" };
+};
+xkb_keymap "en_US" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default+hurd" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+hurd" };
+ xkb_geometry { include "pc" };
+};
+xkb_keymap "be" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+be" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "bg" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+bg" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "de" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+de" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "dk" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+dk" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "dvorak" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+dvorak" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "es" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+es" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "fr" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+fr" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "fr_CA" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+ca" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "gb" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+gb" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "hr" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+hr" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "it" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+it" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "lt" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+lt" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "lt_std" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+lt_std" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "lv" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+lv" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "mk" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+mk" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "mt" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+mt" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "mt_us" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+mt_us" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "no" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+no" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "pl" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+pl" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "pt" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+pt" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "ru" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+ru" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "se_FI" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+fi" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "se_SE" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+se" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "th" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+th" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "de_CH" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+de_CH" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "fr_CH" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+fr_CH" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "jp106" {
+ xkb_keycodes { include "xfree86(jp106)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "jp(jp106)" };
+ xkb_geometry { include "pc(jp106)" };
+};
+
+// Additions by Eric Moreau, 1998-09-27
+// I am reachable at eric_moreau@compuserve.com
+
+xkb_keymap "fr_CA_sundeadkeys" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc102)+ca_enhanced(sundeadkeys)+us_group3(basic)+group(ctrl_shift_toggle)+ralt(mode_switch)" };
+ xkb_geometry { include "pc(pc102)" };
+};
+
+xkb_keymap "fr_CA" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc102)+ca_enhanced(basic)+us_group3(basic)+group(ctrl_shift_toggle)+ralt(mode_switch)" };
+ xkb_geometry { include "pc(pc102)" };
+};
+
+// us_intl and br by Ricardo Y. Igarashi (iga@that.com.br)
+// us_intl means standard us keyboard plus dead_keys symbols
+// these keyboards are very popular in Brazil
+
+xkb_keymap "us_intl" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "us(pc101)+us_intl" };
+ xkb_geometry { include "pc" };
+};
+xkb_keymap "br" {
+ xkb_keycodes { include "xfree86(abnt2)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "us(pc101)+br" };
+ xkb_geometry { include "pc(abnt2)" };
+};
+
+// cz and sk keymaps by Kamil Toman (ktoman@email.cz)
+// are designed to replace old czechoslovakian and czsk keyboards
+// and their prog variants. Those are now obsolete and should not be used anymore.
+xkb_keymap "cz" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+cz" };
+ xkb_geometry { include "pc" };
+};
+xkb_keymap "cz_qwerty" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+cz_qwerty" };
+ xkb_geometry { include "pc" };
+};
+xkb_keymap "sk" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+sk" };
+ xkb_geometry { include "pc" };
+};
+xkb_keymap "sk_qwerty" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+sk_qwerty" };
+ xkb_geometry { include "pc" };
+};
+
+xkb_keymap "sl" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+si" };
+ xkb_geometry { include "pc(pc102)" };
+};
+xkb_keymap "sl_SI" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+si" };
+ xkb_geometry { include "pc(pc102)" };
+};
+
+// Additions by Cristian Gafton, <gafton@redhat.com>
+xkb_keymap "ro" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc101)+ro(pc101)" };
+ xkb_geometry { include "pc(pc101)" };
+};
+xkb_keymap "ro_microsoft" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+ro(pc105)" };
+ xkb_geometry { include "pc(pc105)" };
+};
+xkb_keymap "tr" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+tr" };
+ xkb_geometry { include "pc(pc102)" };
+};
+// Additions by Arabeyes Team, <support@arabeyes.org>
+xkb_keymap "ar" {
+ xkb_keycodes { include "xfree86" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "en_US(pc105)+ar" };
+ xkb_geometry { include "pc(pc102)" };
+};
diff --git a/console-client/xkb/xkb-data/symbols/hurd b/console-client/xkb/xkb-data/symbols/hurd
new file mode 100644
index 00000000..39edf2ae
--- /dev/null
+++ b/console-client/xkb/xkb-data/symbols/hurd
@@ -0,0 +1,125 @@
+// -*- Mode: C -*-
+default
+xkb_symbols "hurd" {
+ /* Switch to local consoles by default. */
+ // SwitchScreen.SameServer;
+
+ /* Make F1 - F10 switch virtual consoles when Alt is held down. */
+ key <FK01>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction () , SwitchScreen (screen = 1),
+ NoAction () ]
+ };
+ key <FK02>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction () , SwitchScreen (screen = 2),
+ NoAction () ]
+ };
+ key <FK03>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction () , SwitchScreen (screen = 3),
+ NoAction () ]
+ };
+ key <FK04>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction () , SwitchScreen (screen = 4),
+ NoAction () ]
+ };
+ key <FK05>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction () , SwitchScreen (screen = 5),
+ NoAction () ]
+ };
+ key <FK06>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction () , SwitchScreen (screen = 6),
+ NoAction () ]
+ };
+ key <FK07>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction () , SwitchScreen (screen = 7),
+ NoAction () ]
+ };
+ key <FK08>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction () , SwitchScreen (screen = 8),
+ NoAction () ]
+ };
+ key <FK09>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction () , SwitchScreen (screen = 9),
+ NoAction () ]
+ };
+ key <FK10>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction () , SwitchScreen (screen = 10),
+ NoAction () ]
+ };
+
+ // Make the left and right cursor keys switch virtual consoles when
+ // Alt is held down.
+ key <LEFT>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction (), SwitchScreen (screen -= 1),
+ NoAction () ]
+ };
+ key <RGHT>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction (), SwitchScreen (screen += 1),
+ NoAction () ]
+ };
+
+ // Scroll the console up or down (one line).
+ key <UP>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction (), ConsScroll (line -= 1) ]
+ };
+ key <DOWN>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction (), ConsScroll (line += 1) ]
+ };
+
+ // Scroll the console up or down (1/2 screen).
+ key <PGUP>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction (), NoAction (),
+ ConsScroll (screen -= 0.5) ]
+ };
+ key <PGDN>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction (), NoAction (),
+ ConsScroll (screen += 0.5) ]
+ };
+
+ // Scroll the console to 0%, 25%, 75% or 100%.
+ key <HOME>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction (),
+ ConsScroll (percentage = 0),
+ ConsScroll (percentage = 25) ]
+ };
+ key <END>
+ {
+ type[Group1] = "HURD",
+ actions[Group1] = [ NoAction (),
+ ConsScroll (percentage = 100),
+ ConsScroll (percentage = 75) ]
+ };
+};
diff --git a/console-client/xkb/xkb-data/types/hurd b/console-client/xkb/xkb-data/types/hurd
new file mode 100644
index 00000000..e6c7aa0c
--- /dev/null
+++ b/console-client/xkb/xkb-data/types/hurd
@@ -0,0 +1,18 @@
+// -*- Mode: C -*-
+
+default xkb_types "hurd" {
+ virtual_modifiers Alt;
+
+ type "HURD"
+ {
+ modifiers = Shift + Alt + Control;
+ map[Alt] = Level2;
+ map[Shift] = Level3;
+ map[Control] = Level4;
+ level_name[Level1] = "Base";
+ level_name[Level2] = "Hurd console";
+ level_name[Level3] = "Hurd console2";
+ level_name[Level4] = "Hurd console3";
+ };
+};
+
diff --git a/console-client/xkb/xkb.c b/console-client/xkb/xkb.c
new file mode 100644
index 00000000..5844ac60
--- /dev/null
+++ b/console-client/xkb/xkb.c
@@ -0,0 +1,1859 @@
+/* xkb.c -- Main XKB routines.
+
+ Copyright (C) 2002, 2003, 2004 Marco Gerards
+
+ Written by Marco Gerards <metgerards@student.han.nl>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <fcntl.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <iconv.h>
+#include <locale.h>
+#include <error.h>
+#include <device/device.h>
+#include <mach/mach_port.h>
+
+#include "xkb.h"
+#include <hurd/console.h>
+#define XK_XKB_KEYS
+#define XK_MISCELLANY
+#include "keysymdef.h"
+#include "driver.h"
+#include "inputdev.h"
+
+
+/* The keyboard device in the kernel. */
+static device_t kbd_dev;
+
+/* True if we are in the GNU Mach v1 compatibility mode. */
+int gnumach_v1_compat;
+
+
+#define NoSymbol 0
+
+ /* The converter. */
+ static iconv_t cd;
+
+/* All interpretations for compatibility. (Translation from keysymbol
+ to actions). */
+xkb_interpret_t *interpretations;
+
+/* All keysymbols and how they are handled by XKB. */
+struct key *keys = NULL;
+int min_keys;
+int max_keys;
+
+/* The current set of modifiers. */
+static modmap_t bmods;
+/* Temporary set of modifiers. This is a copy of mods, so mods won't
+ be consumed (Effective modifiers). */
+static modmap_t emods;
+
+/* Effective group. */
+static group_t egroup;
+/* Base group. */
+static group_t bgroup;
+/* Locked group. */
+static group_t lgroup;
+/* Latched group. */
+static group_t latchedgroup;
+
+static boolctrls bboolctrls;
+
+/* A counter to count how often the modifier was set. This is used
+ when two seperate actions set the same modifier. (example: Left
+ Shift and Right Shift.). */
+modcount_t modsc;
+
+keystate_t keystate[255];
+
+/* The locked modifiers. Lock simply works an an invertion. */
+static modmap_t lmods = {0, 0};
+
+/* When the modifier is used the modifier will be consumed. */
+static modmap_t latchedmods = {0, 0};
+
+/* Not setting GroupsWrap uses modulus to keep the value into the
+ range. */
+static int GroupsWrap = 0;
+
+/* MouseKeys, default: off. */
+static int MouseKeys = 0;
+/* Default mousebutton. */
+static int default_button = 0;
+
+static xkb_indicator_t *indicators;
+static int indicator_count;
+static int indicator_map = 0;
+
+static int stickykeys_active = 1;
+
+/* The name of the repeater node. */
+static char *repeater_node;
+
+/* The repeater node. */
+static consnode_t cnode;
+
+int
+debug_printf (const char *f, ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start (ap, f);
+#ifdef XKB_DEBUG
+ ret = printf (f, ap);
+#endif
+ va_end (ap);
+
+ return ret;
+}
+
+static scancode_t
+gnumach_v1_input_next ()
+{
+ kd_event data_buf;
+ scancode_t sc;
+
+ do
+ {
+ /* io_buf_ptr_t is (char *), not (void *). So I have a few
+ casts to quiet warnings. */
+ mach_msg_type_number_t data_cnt = sizeof (data_buf);
+ error_t err = device_read_inband (kbd_dev, 0, -1, sizeof (kd_event),
+ (void *) &data_buf, &data_cnt);
+
+ if (kbd_repeater_opened && data_buf.type == KEYBD_EVENT)
+ {
+ kbd_repeat_key (&data_buf);
+ data_buf.type = 0;
+ continue;
+ }
+
+ /* XXX The error occured likely because KBD_DEV was closed, so
+ terminate. */
+ if (err)
+ return 0;
+ }
+ while (data_buf.type != KEYBD_EVENT);
+
+ sc = data_buf.value.sc;
+ return sc;
+}
+
+
+scancode_t
+read_scancode (void)
+{
+ scancode_t sc = 0;
+ unsigned char next;
+ kd_event data_buf;
+
+ /* GNU Mach v1 does provide keyboard input in a different format. */
+ if (gnumach_v1_compat)
+ {
+ int scan = gnumach_v1_input_next ();
+ return scan;
+ }
+
+ /* XXX This should read several characters at once. */
+ do
+ {
+ /* io_buf_ptr_t is (char *), not (void *). So I have a few
+ casts to quiet warnings. */
+ mach_msg_type_number_t data_cnt = sizeof (data_buf);
+
+ error_t err = device_read_inband (kbd_dev, 0, -1, sizeof (kd_event),
+ (void *) &data_buf, &data_cnt);
+
+ if (kbd_repeater_opened && data_buf.type == KEYBD_EVENT)
+ {
+ kbd_repeat_key (&data_buf);
+ data_buf.type = 0;
+ continue;
+ }
+
+ next = data_buf.value.sc;
+ /* XXX The error occured likely because KBD_DEV was closed, so
+ terminate. */
+ if (err)
+ return 0;
+
+ }
+ while (next == 0xF0); /* XXX Magic constant. */
+
+ sc |= next;
+ return sc;
+}
+
+/* Read a keycode using the read_scancode routine. The translation from
+ scancodes is hardcoded. A configuration file should be used in the
+ near future because this is an UGLY HACK. */
+keycode_t
+read_keycode (void)
+{
+ scancode_t sc = read_scancode ();
+ int release = 0;
+
+
+ /* The keypress generated two keycodes. */
+ if (sc == 0xE0)
+ {
+ sc = read_scancode ();
+
+ release = sc & 0x80;
+ sc &= ~0x80;
+
+ switch (sc)
+ {
+ case 0x1D: /* RCTRL. */
+ sc = 101;
+ break;
+ case 0x38: /* RALT. */
+ sc = 105;
+ break;
+ /* LRGUI MENU. */
+ case 0x5B: /* LGUI. */
+ sc = 107;
+ break;
+ case 0x5C: /* RGUI. */
+ sc = 108;
+ break;
+ case 0x5D: /* MENU. */
+ sc = 109;
+ break;
+ case 0x52: /* Insert. */
+ sc = 98;
+ break;
+ case 0x47: /* Home. */
+ sc = 89;
+ break;
+ case 0x49: /* Pg Up. */
+ sc = 91;
+ break;
+ case 0x53: /* Delete. */
+ sc = 99;
+ break;
+ case 0x4F: /* End. */
+ sc = 95;
+ break;
+ case 0x51: /* Pg Down. */
+ sc = 97;
+ break;
+ case 0x48: /* Arrow up. */
+ sc = 90;
+ break;
+ case 0x50: /* Arrow down. */
+ sc = 96;
+ break;
+ case 0x4b: /* Arrow left. */
+ sc = 92;
+ break;
+ case 0x4d: /* Arrow right. */
+ sc = 94;
+ break;
+ case 0x35: /* '/' */
+ sc = 104;
+ break;
+ case 0x1C: /* KP_Enter. */
+ sc = 100;
+ break;
+ default:
+ sc += 0x78;
+ }
+
+ sc |= release;
+ }
+ else
+ release = sc & 0x80;
+
+ return sc;
+}
+
+
+static void
+interpret_kc (keycode_t kc)
+{
+ int cursym;
+ int rmods = keys[kc].mods.rmods;
+ struct xkb_interpret *interp;
+
+ for (interp = interpretations; interp; interp = interp->next)
+ {
+ group_t group;
+
+ for (group = 0; group < keys[kc].numgroups; group++)
+ {
+ int width = keys[kc].groups[group].width;
+
+ for (cursym = 0; cursym < width; cursym++)
+ {
+ int symbol = keys[kc].groups[group].symbols[cursym];
+
+ /* Check if a keysymbol requirement exists or if it
+ matches. */
+ if (interp->symbol == 0 ||
+ (symbol && (interp->symbol == symbol)))
+ {
+ int flags = interp->match & 0x7f;
+
+ /* XXX: use enum. */
+ if ((flags == 0 && (!(interp->rmods & rmods))) ||
+ (flags == 1) ||
+ (flags == 2 && (interp->rmods & rmods)) ||
+ (flags == 3 && ((interp->rmods & rmods) ==
+ interp->rmods)) ||
+ (flags == 4 && interp->rmods == rmods))
+ {
+ xkb_action_t *action;
+
+ if (keys[kc].groups[group].actionwidth > cursym &&
+ keys[kc].groups[group].actions[cursym] &&
+ keys[kc].groups[group].actions[cursym]->type !=
+ SA_NoAction)
+ continue;
+
+/* if (action->type == 13) */
+/* printf ("AA %d AAAAAAAAAAAAAAA %d: %d - %d\n", kc, flags, symbol, interp->symbol); */
+
+ action = malloc (sizeof (xkb_action_t));
+ memcpy (action, &interp->action, sizeof (xkb_action_t));
+
+ key_set_action (&keys[kc], group, cursym, action);
+
+ keys[kc].flags = interp->flags | KEYHASACTION;
+ if (!keys[kc].mods.vmods)
+ keys[kc].mods.vmods = interp->vmod;
+ }
+ }
+ }
+ }
+ }
+
+}
+
+
+/* Test if c is an uppercase letter. */
+static int islatin_upper (int c)
+{
+ return (c >= 'A' && c <= 'Z');
+}
+
+/* Test if c is an lowercase letter. */
+static int islatin_lower (int c)
+{
+ return (c >= 'a' && c <= 'z');
+}
+
+/* A key is of the keytype KEYPAD when one of the symbols that can be produced
+ by this key is in the KEYPAD symbol range. */
+static int
+iskeypad (int width, int *sym)
+{
+ int i;
+
+ for (i = 0; i <= width; i++, sym++)
+ {
+ /* Numlock is in the keypad range but shouldn't be of the type
+ keypad because it will depend on itself in that case. */
+ if (*sym == XK_Num_Lock)
+ return 0;
+ if (*sym >= KEYPAD_FIRST_KEY && *sym <= KEYPAD_LAST_KEY)
+ return 1;
+ }
+ return 0;
+}
+
+/* Get the keytype (the keytype determines which modifiers are used
+ for shifting.
+
+ These rules are used:
+
+ * If the width is 1 the keytype is ONE_LEVEL.
+ * If the first symbol is lowercase and the second is uppercase
+ (latin alphabeth) the keytype is ALPHABETHIC.
+ * If one of the symbols is in the keypad range the keytype is KEYPAD.
+ * Else the keytype is TWO_LEVEL. */
+static struct keytype *
+get_keytype (int width, symbol *sym)
+{
+ struct keytype *ktfound;
+
+ if (!width || !sym)
+ ktfound = keytype_find ("TWO_LEVEL");
+ else if (iskeypad (width, sym))
+ ktfound = keytype_find ("KEYPAD");
+ else if (width == 1)
+ ktfound = keytype_find ("ONE_LEVEL");
+ else if (width >= 2 && islatin_lower (sym[0]) && islatin_upper (sym[1]))
+ ktfound = keytype_find ("ALPHABETIC");
+ else
+ ktfound = keytype_find ("TWO_LEVEL");
+
+ if (!ktfound)
+ ktfound = keytype_find ("TWO_LEVEL");
+ if (!ktfound)
+ {
+ console_error (L"Default keytypes have not been defined!\n");
+ exit (1);
+ }
+
+ return ktfound;
+}
+
+/* Create XKB style actions for every action described by keysymbols. */
+static void
+interpret_all (void)
+{
+ keycode_t curkc;
+
+ /* Check every key. */
+ for (curkc = 0; curkc < max_keys; curkc++)
+ interpret_kc (curkc);
+}
+
+static void
+determine_keytypes (void)
+{
+ keycode_t curkc;
+
+ /* Check every key. */
+ for (curkc = 0; curkc < max_keys; curkc++)
+ {
+ group_t group;
+ for (group = 0; group < 4; group++)
+ {
+ struct keygroup *kg = &keys[curkc].groups[group];
+
+ if (!kg->keytype)
+ kg->keytype = get_keytype (kg->width, kg->symbols);
+ }
+ }
+}
+
+/* Wrap the group GROUP into a valid group range. The method to use is
+ defined by the GroupsWrap control. */
+static int
+wrapgroup (group_t group, int maxgroup)
+{
+ /* If the group is in an invalid range, fix it. */
+ if (group < 0 || group >= maxgroup)
+ {
+ /* If RedirectIntoRange should be used use the 4 LSbs of
+ the GroupsWrap control instead of the current group. */
+ if (GroupsWrap & RedirectIntoRange)
+ group = GroupsWrap & 0x0F;
+ /* Select the closest valid group. */
+ else if (GroupsWrap & ClampIntoRange)
+ {
+ if (group < 0)
+ group = 0;
+ else
+ group = maxgroup - 1;
+ }
+ else /* Default: use modulus to wrap the group. */
+ group %= maxgroup;
+ }
+
+ return group;
+}
+
+
+
+/* This function must be called after a modifier, group or control has
+ been changed. The indicator map will be regenerated and the hardwre
+ representation of this map will be updated. */
+static void
+set_indicator_mods (void)
+{
+ int i;
+
+ /* Calculate the effective modmap. */
+ emods = bmods;
+ emods.rmods |= lmods.rmods;
+ emods.vmods |= lmods.vmods;
+ emods.rmods |= latchedmods.rmods;
+ emods.vmods |= latchedmods.vmods;
+
+ for (i = 0; i < indicator_count; i++)
+ {
+ if (!(indicators[i].flags & IM_NoAutomatic))
+ {
+ if (indicators[i].which_mods & IM_UseBase)
+ {
+ if (((indicators[i].modmap.rmods & bmods.rmods) ==
+ indicators[i].modmap.rmods) &&
+ ((indicators[i].modmap.vmods & bmods.vmods) ==
+ indicators[i].modmap.vmods))
+ {
+ indicator_map |= (1 << i);
+ continue;
+ }
+ }
+ if (indicators[i].which_mods & IM_UseLatched)
+ {
+ if (((indicators[i].modmap.rmods & latchedmods.rmods) ==
+ indicators[i].modmap.rmods) &&
+ ((indicators[i].modmap.vmods & latchedmods.vmods) ==
+ indicators[i].modmap.vmods))
+ {
+ indicator_map |= (1 << i);
+ continue;
+ }
+ }
+ if (indicators[i].which_mods & IM_UseLocked)
+ {
+ if (((indicators[i].modmap.rmods & lmods.rmods) ==
+ indicators[i].modmap.rmods) &&
+ ((indicators[i].modmap.vmods & lmods.vmods) ==
+ indicators[i].modmap.vmods))
+ {
+ indicator_map |= (1 << i);
+ continue;
+ }
+ }
+ if (indicators[i].which_mods & IM_UseEffective)
+ {
+ if (((indicators[i].modmap.rmods & emods.rmods) ==
+ indicators[i].modmap.rmods) &&
+ ((indicators[i].modmap.vmods & emods.vmods) ==
+ indicators[i].modmap.vmods))
+ {
+ indicator_map |= (1 << i);
+ continue;
+ }
+ }
+ /* The indicator shouldn't be on anymore so turn it off. */
+ indicator_map &= ~(1 << i);
+ }
+ }
+ debug_printf ("INDICATOR: %d\n", indicator_map);
+}
+
+/* Set base modifiers. A counter exists for every modifier. When a
+ modifier is set this counter will be incremented with one. */
+static void
+setmods (modmap_t smods, keypress_t key)
+{
+ /* Higher the modcount for every set modifier. */
+ void set_xmods (int xmods, int modsc[])
+ {
+ int i = 0;
+
+ while (xmods)
+ {
+ if (xmods & 1)
+ modsc[i]++;
+
+ xmods >>= 1;
+ i++;
+ }
+ }
+
+ bmods.rmods |= smods.rmods;
+ bmods.vmods |= smods.vmods;
+
+ set_xmods (smods.rmods, modsc.rmods);
+ set_xmods (smods.vmods, modsc.vmods);
+
+ set_indicator_mods ();
+}
+
+/* Clear base modifiers. A counter exists for every modifier. When a
+ key release wants to clear a modifier this counter will be
+ decreased with one. When the counter becomes 0 the modifier will be
+ cleared and unlocked if the clearLocks flag is set. */
+static void
+clearmods (modmap_t cmods, keypress_t key, int flags)
+{
+#define CLEAR_XMOD(MODTYPE) \
+ { \
+ int i = 0; \
+ int mmods = cmods.MODTYPE; \
+ \
+ while (mmods) \
+ { \
+ if (mmods & 1) \
+ if (!(--modsc.MODTYPE[i])) \
+ { \
+ bmods.MODTYPE &= ~(1 << i); \
+ if (flags & clearLocks) \
+ lmods.MODTYPE &= ~(1 << i); \
+ } \
+ mmods >>= 1; \
+ i++; \
+ } \
+ }
+
+ CLEAR_XMOD(rmods);
+ CLEAR_XMOD(vmods);
+
+ set_indicator_mods ();
+}
+
+/* Set modifiers in smods and also lock them if the flag noLock is
+ not set. */
+static void
+setlocks (modmap_t smods, keypress_t key, int flags)
+{
+ if (!key.rel)
+ {
+ modmap_t cmods;
+ cmods.rmods = lmods.rmods & smods.rmods;
+ cmods.vmods = lmods.vmods & smods.vmods;
+
+ /* Locking also sets the base modifiers. */
+ setmods (smods, key);
+
+ if (!(flags & noUnlock))
+ {
+ lmods.rmods &= ~cmods.rmods;
+ lmods.vmods &= ~cmods.vmods;
+ }
+
+ if (!(flags & noLock))
+ {
+ lmods.rmods |= (~cmods.rmods & smods.rmods);
+ lmods.vmods |= (~cmods.vmods & smods.vmods);
+ }
+ }
+ else
+ clearmods (smods, key, flags);
+}
+
+/* Latch the modifiers smods for key KEY. When another key is operated while
+ KEY is pressed the release of KEY will just clear the base
+ modifiers, otherwise latch the modifiers like is described in the
+ protocol specification. */
+static void
+latchmods (modmap_t smods, keypress_t key, int flags)
+{
+ if (!key.rel)
+ setmods (smods, key);
+ else
+ {
+ modmap_t oldlmods;
+ oldlmods = lmods;
+ clearmods (smods, key, flags);
+ /* Modifier that have been unlocked don't have effect anymore. */
+ smods.rmods &= ~(lmods.rmods & oldlmods.rmods);
+ smods.vmods &= ~(lmods.vmods & oldlmods.vmods);
+
+
+ /* If another key has been pressed while this modifier key was
+ pressed don't latch, just behave as SetMods. */
+ if (key.keycode == key.prevkc)
+ {
+ if (flags & latchToLock)
+ {
+ /* When a modifier exists as a locked modifier, consume
+ and unlock. */
+ lmods.rmods |= latchedmods.rmods & smods.rmods;
+ lmods.vmods |= latchedmods.vmods & smods.vmods;
+
+ smods.rmods &= ~(latchedmods.rmods & smods.rmods);
+ smods.vmods &= ~(latchedmods.vmods & smods.vmods);
+ }
+
+ /* Use the remaining modifiers for latching. */
+ latchedmods.rmods |= smods.rmods;
+ latchedmods.vmods |= smods.vmods;
+ }
+ }
+}
+
+static void
+setgroup (keypress_t key, group_t group, int flags)
+{
+ debug_printf ("Setgroup ()\n");
+ if (!key.rel)
+ {
+ if (flags & groupAbsolute)
+ {
+ bgroup = group;
+ keystate[key.keycode].oldgroup = bgroup;
+ }
+ else
+ bgroup += group;
+ }
+ else
+ {
+ if ((key.keycode == key.prevkc) && (flags & clearLocks))
+ lgroup = 0;
+ if (flags & groupAbsolute)
+ bgroup = keystate[key.keycode].oldgroup;
+ else
+ /* XXX: Maybe oldgroup should be restored for !groupAbsolute
+ too, because wrapgroup might have affected the calculation
+ and substracting will not undo the set operation. However
+ this way of handeling relative groups is better because the
+ order of releasing keys when multiple relative setgroup keys
+ are pressed doesn't matter. */
+ bgroup -= group;
+ }
+}
+
+static void
+latchgroup (keypress_t key, group_t sgroup, int flags)
+{
+ group_t oldlgroup = sgroup;
+ setgroup (key, sgroup, flags);
+ debug_printf ("Latchgroup ()\n");
+
+ if (key.keycode == key.prevkc && oldlgroup == lgroup)
+ {
+ if ((flags & latchToLock) && latchedgroup)
+ {
+ lgroup += sgroup;
+ latchedgroup -= sgroup;
+ }
+ else
+ latchedgroup += sgroup;
+ }
+}
+
+static void
+lockgroup (keypress_t key, group_t group, int flags)
+{
+ debug_printf (">L: %d, g: %d\n", lgroup, group);
+
+ keystate[key.keycode].oldgroup = lgroup;
+ if (flags & groupAbsolute)
+ lgroup = group;
+ else
+ lgroup += group;
+
+ lgroup = wrapgroup (lgroup, 4);
+
+ debug_printf ("<L: %d, g: %d\n", lgroup, group);
+
+}
+
+static void
+setcontrols (keypress_t key, boolctrls ctrls, int flags)
+{
+ keystate[key.keycode].bool = ctrls & ~bboolctrls;
+ bboolctrls |= ctrls;
+}
+
+static void
+clearcontrols (keypress_t key, boolctrls ctrls, int flags)
+{
+ bboolctrls &= ~keystate[key.keycode].bool;
+}
+
+static void
+lockcontrols (keypress_t key, boolctrls ctrls, int flags)
+{
+ if (!key.rel)
+ {
+ //setcontrols (key, boolctrls, flags);
+ if (!(flags & noLock));
+ // lboolctrls |= boolctrls;
+ }
+ else
+ {
+ // clearcontrols (key, boolctrls, flags);
+ /* This unlock behaviour doesnt work and sucks, just like the protocol
+ specification where it was documented. */
+ // if (!(flags & noUnlock))
+ // lboolctrls &= ~keystate[key.keycode].bool;
+ }
+
+}
+
+/* Not properly implemented, not very high priority for me. */
+/* static void */
+/* isolock (keypress_t key, group group, modmap_t mods, int flags) */
+/* { */
+/* if (!key.rel) */
+/* { */
+/* struct isolock *newiso; */
+
+/* if (flags & dfltIsGroup) */
+/* setgroup (key, group, flags & groupAbsolute); */
+/* else */
+/* setmods (key, mods, 0); */
+
+/* newiso = malloc (sizeof struct isolock); */
+/* if (!newiso) */
+/* ;// return error */
+/* active_isolocks.anchor */
+/* } */
+/* else */
+/* { */
+/* if (flags & dfltIsGroup) */
+/* { */
+/* cleargroup (key, group, flags & groupAbsolute); */
+/* if (bla) */
+/* lockgroup (key, group, flags & groupAbsolute); */
+/* } */
+/* else */
+/* { */
+/* clearmods (key, mods, 0); */
+/* if (bla) */
+/* { */
+/* lmods.rmods |= mods.rmods; */
+/* lmods.vmods |= mods.vmods; */
+/* } */
+/* } */
+/* } */
+/* } */
+
+/* Move the mousepointer relational to its current position. */
+static void
+mouse_x_move (int xdelta)
+{
+ /* XXX: Ofcouse this function has to do *something* :). */
+}
+
+/* Change the horizontal position of the mousepointer. */
+static void
+mouse_x_move_to (int x)
+{
+ /* XXX: Ofcouse this function has to do *something* :). */
+}
+
+/* Move the mousepointer relational to its current position. */
+static void
+mouse_y_move (int ydelta)
+{
+ /* XXX: Ofcouse this function has to do *something* :). */
+}
+
+/* Change the vertical position of the mousepointer. */
+static void
+mouse_y_move_to (int y)
+{
+ /* XXX: Ofcouse this function has to do *something* :). */
+}
+
+/* Simulate a mouse button press for button BUTTON. */
+static void
+mouse_button_press (int button)
+{
+ /* XXX: Ofcouse this function has to do *something* :). */
+}
+
+/* Simulate a mouse button press for button BUTTON. */
+static void
+mouse_button_release (int button)
+{
+ /* XXX: Ofcouse this function has to do *something* :). */
+}
+
+
+
+/* Forward declaration for redirected keys. */
+static symbol handle_key (keypress_t);
+
+
+/* Execute an action bound to a key. When the action isn't supported
+ or when the action doesn't consume the key return true, otherwise
+ return false. */
+static int
+action_exec (xkb_action_t *action, keypress_t key)
+{
+ if (!action)
+ return KEYNOTCONSUMED;
+
+ debug_printf ("EXEC: %d\n", action->type);
+
+ switch (action->type)
+ {
+ /* LockMods: Lock/Unlock modifiers when the key is pressed. */
+ case SA_LockMods:
+ {
+ action_setmods_t *setmodmap = (action_setmods_t *) action;
+ modmap_t modm = setmodmap->modmap;
+
+ /* UseModMap */
+ if (setmodmap->flags & useModMap)
+ {
+ modm.rmods |= keys[key.keycode].mods.rmods;
+ modm.vmods |= keys[key.keycode].mods.vmods;
+ }
+
+ setlocks (modm, key, setmodmap->flags);
+ }
+ break;
+ /* SetMods: Set/Unset modifiers. Those modifier will be set as
+ long the key is pressed. Keys like shift, alt and control are
+ used here often. */
+ case SA_SetMods:
+ {
+ action_setmods_t *setmodmap = (action_setmods_t *) action;
+ modmap_t modm = setmodmap->modmap;
+
+ /* UseModMapMods means: also use the real modifiers specified
+ in the key's modmap. */
+ if (setmodmap->flags & useModMap)
+ {
+ debug_printf ("Apply modmaps\n");
+ modm.rmods |= keys[key.keycode].mods.rmods;
+ modm.vmods |= keys[key.keycode].mods.vmods;
+ }
+
+ /* When the key is pressed set the modifiers. */
+ if (!key.rel)
+ setmods (modm, key);
+ else /* When the key is released clear the modifiers. */
+ clearmods (modm, key, setmodmap->flags);
+
+ break;
+ }
+ /* Set the basegroup. When groupAbsolute isn't used add it
+ to the basegroup. */
+ case SA_LatchMods:
+ {
+ action_setmods_t *setmodmap = (action_setmods_t *) action;
+
+ modmap_t modm = setmodmap->modmap;
+
+ /* UseModMapMods means: also use the real modifiers specified
+ in the key's modmap. */
+ if (setmodmap->flags & useModMap)
+ {
+ modm.rmods |= keys[key.keycode].mods.rmods;
+ modm.vmods |= keys[key.keycode].mods.vmods;
+ }
+
+ latchmods (modm, key, setmodmap->flags);
+
+ break;
+ }
+ case SA_SetGroup:
+ {
+ action_setgroup_t *setgroupac = (action_setgroup_t *) action;
+
+ setgroup (key, setgroupac->group, setgroupac->flags);
+ break;
+ }
+ case SA_LockGroup:
+ {
+ action_setgroup_t *setgroupac = (action_setgroup_t *) action;
+
+ if (!key.rel)
+ lockgroup (key, setgroupac->group, setgroupac->flags);
+ break;
+ }
+ case SA_LatchGroup:
+ {
+ action_setgroup_t *setgroupac = (action_setgroup_t *) action;
+
+ latchgroup (key, setgroupac->group, setgroupac->flags);
+ break;
+ }
+
+ case SA_PtrBtn:
+ {
+ action_ptrbtn_t *ptrbtnac = (action_ptrbtn_t *) action;
+ int i;
+ int button;
+
+ if (!MouseKeys)
+ return KEYNOTCONSUMED;
+
+ if (ptrbtnac->flags & useDfltBtn)
+ button = default_button;
+ else
+ button = ptrbtnac->button;
+
+ if (ptrbtnac->count)
+ for (i = 0; i < ptrbtnac->count; i++)
+ {
+ /* XXX: Should there be a delay? */
+ mouse_button_press (button);
+ mouse_button_release (button);
+ }
+ else if (!key.rel)
+ mouse_button_press (button);
+ else
+ mouse_button_release (button);
+ break;
+ }
+ case SA_LockPtrBtn:
+ {
+ action_ptrbtn_t *ptrbtnac = (action_ptrbtn_t *) action;
+
+ int button;
+
+ if (!MouseKeys)
+ return KEYNOTCONSUMED;
+
+ if (ptrbtnac->flags & useDfltBtn)
+ button = default_button;
+ else
+ button = ptrbtnac->button;
+
+ /* XXX: Do stuff. */
+
+ break;
+ }
+ case SA_SetPtrDflt:
+ {
+ action_ptr_dflt_t *ptrdfltac = (action_ptr_dflt_t *) action;
+
+ if (!MouseKeys)
+ return KEYNOTCONSUMED;
+
+ if (!key.rel)
+ {
+ if (ptrdfltac->flags & DfltBtnAbsolute)
+ default_button = ptrdfltac->value;
+ else
+ default_button += ptrdfltac->value;
+ }
+
+ if (default_button < 0)
+ default_button = 0;
+
+ if (default_button > 5)
+ default_button = 5;
+
+ break;
+ }
+ case SA_TerminateServer:
+ /* Zap! */
+ console_exit ();
+ break;
+ case SA_SwitchScreen:
+ {
+ action_switchscrn_t *switchscrnac = (action_switchscrn_t *) action;
+
+ if (key.rel)
+ break;
+
+ if (switchscrnac->flags & screenAbs)
+ /* Switch to screen. */
+ console_switch ((char) switchscrnac->screen, 0);
+ else
+ /* Move to next/prev. screen. */
+ console_switch (0, (char) switchscrnac->screen);
+ break;
+ }
+ case SA_RedirectKey:
+ {
+ action_redirkey_t *redirkeyac = (action_redirkey_t *) action;
+ keypress_t key;
+
+ key.keycode = redirkeyac->newkey & (key.rel ? 0x80:0);
+
+ /* For the redirected key other modifiers should be used. */
+ emods.rmods = bmods.rmods | lmods.rmods | latchedmods.rmods;
+ emods.vmods = bmods.vmods | lmods.vmods | latchedmods.vmods;
+
+ emods.rmods &= ~redirkeyac->rmodsmask;
+ emods.rmods |= redirkeyac->rmods;
+ emods.vmods &= ~redirkeyac->vmods;
+ emods.vmods |= redirkeyac->vmodsmask;
+
+ /* XXX: calc group etc. */
+
+ handle_key (key);
+ break;
+ }
+ case SA_ConsScroll:
+ {
+ action_consscroll_t *scrollac = (action_consscroll_t *) action;
+
+ if (key.rel)
+ break;
+
+ if (scrollac->flags & usePercentage)
+ console_scrollback (CONS_SCROLL_ABSOLUTE_PERCENTAGE,
+ 100 - scrollac->percent);
+
+ if (scrollac->screen)
+ console_scrollback (CONS_SCROLL_DELTA_SCREENS, -scrollac->screen);
+
+ if (scrollac->line)
+ {
+ int type = (scrollac->flags & lineAbs) ?
+ CONS_SCROLL_ABSOLUTE_LINE : CONS_SCROLL_DELTA_LINES;
+ console_scrollback (type, -scrollac->line);
+ }
+ break;
+ }
+ case SA_ActionMessage:
+ case SA_DeviceBtn:
+ case SA_LockDeviceBtn:
+ case SA_DeviceValuator:
+ return KEYNOTCONSUMED;
+ case SA_MovePtr:
+ {
+ action_moveptr_t *moveptrac = (action_moveptr_t *) action;
+
+ if (!MouseKeys)
+ return KEYNOTCONSUMED;
+
+ if (moveptrac->flags & MoveAbsoluteX)
+ mouse_x_move_to (moveptrac->x);
+ else
+ mouse_x_move (moveptrac->x);
+
+ if (moveptrac->flags & MoveAbsoluteY)
+ mouse_y_move_to (moveptrac->y);
+ else
+ mouse_y_move (moveptrac->y);
+ break;
+ }
+ case SA_SetControls:
+ {
+ action_setcontrols_t *controlsac = (action_setcontrols_t *) action;
+ if (key.rel)
+ clearcontrols (key, controlsac->controls, 0);
+ else
+ setcontrols (key, controlsac->controls, 0);
+ break;
+ }
+ case SA_LockControls:
+ {
+ action_setcontrols_t *controlsac = (action_setcontrols_t *) action;
+ lockcontrols (key, controlsac->controls, 0);
+ break;
+ }
+ default:
+ /* Preserve the keycode. */
+ return KEYNOTCONSUMED;
+ break;
+ }
+
+ /* Don't preserve the keycode because it was consumed. */
+ return KEYCONSUMED;
+}
+
+
+
+/* Calculate the shift level for a specific key. */
+static int
+calc_shift (keycode_t key)
+{
+ /* The keytype for this key. */
+ struct keytype *keytype = keys[key].groups[egroup].keytype;
+ struct typemap *map;
+
+ /* XXX: Shouldn't happen, another way to fix this? */
+ if (!keytype)
+ return 0;
+
+ /* Scan though all modifier to level maps of this keytype to search
+ the level. */
+ for (map = keytype->maps; map; map = map->next)
+ /* Does this map meet our requirements? */
+ if (map->mods.rmods == (emods.rmods & keytype->modmask.rmods) &&
+ map->mods.vmods == (emods.vmods & keytype->modmask.vmods))
+ {
+ /* Preserve all modifiers specified in preserve for this map. */
+ emods.rmods &= ~(map->mods.rmods & (~map->preserve.rmods));
+ emods.vmods &= ~(map->mods.vmods & (~map->preserve.vmods));
+ return map->level;
+ }
+
+ /* When no map is found use the default shift level and consume all
+ modifiers. */
+ emods.vmods &= ~keytype->modmask.vmods;
+ emods.rmods &= ~keytype->modmask.rmods;
+
+ return 0;
+}
+
+static symbol
+symtoctrlsym (symbol c)
+{
+ c = toupper (c);
+
+ switch (c)
+ {
+ case 'A' ... 'Z':
+ c = c - 'A' + 1;
+ break;
+ case '[': case '3':
+ c = '\e';
+ break;
+ case '\\': case '4':
+ c = '';
+ break;
+ case ']': case '5':
+ c = '';
+ break;
+ case '^': case '6':
+ c = '';
+ break;
+ case '/':
+ c = '/';
+ break;
+ case ' ':
+ c = '\0';
+ break;
+ case '_': case '7':
+ c= '';
+ break;
+ case '8':
+ c = '\x7f';
+ break;
+ }
+
+ return c;
+}
+
+
+/* Handle all actions, etc. bound to the key KEYCODE and return a XKB
+ symbol if one is generated by this key. If redirected_key contains
+ 1 this is keypress generated by the action SA_RedirectKey, don't
+ change the effective modifiers because they exist and have been
+ changed by SA_RedirectKey. */
+static symbol
+handle_key (keypress_t key)
+{
+ int actioncompl = 0;
+
+ modmap_t oldmods;
+ group_t oldgroup = 0;
+
+ /* The level for this key. */
+ int level;
+
+ /* The symbol this keypress generated. */
+ symbol sym = 0;
+
+ debug_printf ("groups\n");
+ /* If the key does not have a group there is nothing to do. */
+ if (keys[key.keycode].numgroups == 0)
+ return -1;
+
+ /* The effective group is the current group, but it can't be
+ out of range. */
+ egroup = wrapgroup (bgroup + lgroup,
+ keys[key.keycode].numgroups);
+
+ if (keys[key.keycode].groups[egroup].actions)
+ {
+ if (key.rel)
+ {
+ debug_printf ("action\n");
+ if (!keystate[key.keycode].prevstate)
+ /* Executing the inverse action of a never executed
+ action... Stop! */
+ return -1;
+
+ keystate[key.keycode].prevstate = 0;
+ emods = keystate[key.keycode].prevmods;
+ egroup = wrapgroup (keystate[key.keycode].prevgroup,
+ keys[key.keycode].numgroups);
+ }
+ else /* This is a keypress event. */
+ {
+ /* Calculate the effective modmap. */
+ emods = bmods;
+ emods.rmods |= lmods.rmods;
+ emods.vmods |= lmods.vmods;
+ emods.rmods |= latchedmods.rmods;
+ emods.vmods |= latchedmods.vmods;
+ }
+
+ oldmods = emods;
+ oldgroup = egroup;
+
+ level = calc_shift (key.keycode);// %
+
+ if (keys[key.keycode].groups[egroup].actionwidth >= level + 1
+ && keys[key.keycode].groups[egroup].actions[level])
+ {
+ actioncompl = action_exec
+ (keys[key.keycode].groups[egroup].actions[level], key);
+ }
+ }
+
+ if (actioncompl == KEYCONSUMED && !key.rel)
+ {
+ /* An action was executed. Store the effective modifier this key
+ so the reverse action can be called on key release. */
+ keystate[key.keycode].prevstate = 1;
+ keystate[key.keycode].prevmods = oldmods;
+ keystate[key.keycode].prevgroup = oldgroup;
+ }
+
+ debug_printf ("consumed: %d - %d -%d\n", actioncompl, key.rel,
+ !keys[key.keycode].groups[egroup].width);
+ /* If the action comsumed the keycode, this is a key release event
+ or if the key doesn't have any symbols bound to it there is no
+ symbol returned. */
+ if (actioncompl == KEYCONSUMED || key.rel ||
+ !keys[key.keycode].groups[egroup].width)
+ return -1;
+
+ /* Calculate the effective modmap. */
+ emods = bmods;
+ emods.rmods |= lmods.rmods;
+ emods.vmods |= lmods.vmods;
+ emods.rmods |= latchedmods.rmods;
+ emods.vmods |= latchedmods.vmods;
+
+ level = calc_shift (key.keycode) % keys[key.keycode].groups[egroup].width;
+
+ /* The latched modifier is used for a symbol, clear it. */
+ latchedmods.rmods = latchedmods.vmods = 0;
+
+ /* Search the symbol for this key in the keytable. Make sure the
+ group and shift level exists. */
+ sym = keys[key.keycode].groups[egroup].symbols[level];
+
+ /* Convert keypad symbols to symbols. XXX: Is this the right place
+ to do this? */
+ if ((sym >= XK_KP_Multiply && sym <= XK_KP_Equal) || sym == XK_KP_Enter)
+ sym &= ~0xFF80;
+
+ /* Check if this keypress was a part of a compose sequence. */
+ sym = compose_symbols (sym);
+
+ return sym;
+}
+
+/* CTRL + Alt + Backspace will terminate the console client by
+ default, this hardcoded behaviour can be disabled. */
+int ctrlaltbs;
+
+void
+xkb_input (keypress_t key)
+{
+ char buf[100];
+ size_t size = 0;
+ wchar_t input;
+
+ debug_printf ("input: %d, rel: %d, rep: %d\n", key.keycode, key.rel, key.repeat);
+
+ if (key.rel)
+ keystate[key.keycode].lmods = lmods;
+ input = handle_key (key);
+ //printf ("sym: %d\n", input);
+
+ debug_printf ("handle: %d\n", input);
+ if (input == -1)
+ return;
+
+ /* If the realmodifier MOD1 (AKA Alt) is set generate an ESC
+ symbol. */
+ if (emods.rmods & RMOD_MOD1)
+ buf[size++] = '\e';
+
+ buf[size] = '\0';
+
+ debug_printf ("input: %d\n", input);
+ if (!input)
+ return;
+
+ /* Special key, generate escape sequence. */
+ char *escseq = NULL;
+
+ switch (input)
+ {
+ case XK_Up: case XK_KP_Up:
+ escseq = CONS_KEY_UP;
+ break;
+ case XK_Down: case XK_KP_Down:
+ escseq = CONS_KEY_DOWN;
+ break;
+ case XK_Left: case XK_KP_Left:
+ escseq = CONS_KEY_LEFT;
+ break;
+ case XK_Right: case XK_KP_Right:
+ escseq = CONS_KEY_RIGHT;
+ break;
+ case XK_BackSpace:
+ escseq = CONS_KEY_BACKSPACE;
+ break;
+ case XK_F1: case XK_KP_F1:
+ escseq = CONS_KEY_F1;
+ break;
+ case XK_F2: case XK_KP_F2:
+ escseq = CONS_KEY_F2;
+ break;
+ case XK_F3: case XK_KP_F3:
+ escseq = CONS_KEY_F3;
+ break;
+ case XK_F4: case XK_KP_F4:
+ escseq = CONS_KEY_F4;
+ break;
+ case XK_F5:
+ escseq = CONS_KEY_F5;
+ break;
+ case XK_F6:
+ escseq = CONS_KEY_F6;
+ break;
+ case XK_F7:
+ escseq = CONS_KEY_F7;
+ break;
+ case XK_F8:
+ escseq = CONS_KEY_F8;
+ break;
+ case XK_F9:
+ escseq = CONS_KEY_F9;
+ break;
+ case XK_F10:
+ escseq = CONS_KEY_F10;
+ break;
+ case XK_F11:
+ escseq = CONS_KEY_F11;
+ break;
+ case XK_F12:
+ escseq = CONS_KEY_F12;
+ break;
+ case XK_F13:
+ escseq = CONS_KEY_F13;
+ break;
+ case XK_F14:
+ escseq = CONS_KEY_F14;
+ break;
+ case XK_F15:
+ escseq = CONS_KEY_F15;
+ break;
+ case XK_F16:
+ escseq = CONS_KEY_F16;
+ break;
+ case XK_F17:
+ escseq = CONS_KEY_F17;
+ break;
+ case XK_F18:
+ escseq = CONS_KEY_F18;
+ break;
+ case XK_F19:
+ escseq = CONS_KEY_F19;
+ break;
+ case XK_F20:
+ escseq = CONS_KEY_F20;
+ break;
+ case XK_Home: case XK_KP_Home:
+ escseq = CONS_KEY_HOME;
+ break;
+ case XK_Insert: case XK_KP_Insert:
+ escseq = CONS_KEY_IC;
+ break;
+ case XK_Delete: case XK_KP_Delete:
+ escseq = CONS_KEY_DC;
+ break;
+ case XK_End: case XK_KP_End:
+ escseq = CONS_KEY_END;
+ break;
+ case XK_Page_Up: case XK_KP_Page_Up:
+ escseq = CONS_KEY_PPAGE;
+ break;
+ case XK_Page_Down: case XK_KP_Page_Down:
+ escseq = CONS_KEY_NPAGE;
+ break;
+ case XK_KP_Begin:
+ escseq = CONS_KEY_B2;
+ break;
+ case XK_ISO_Left_Tab:
+ escseq = CONS_KEY_BTAB;
+ break;
+ case XK_Return: case XK_KP_Enter:
+ escseq = "\x0d";
+ break;
+ case XK_Tab: case XK_KP_Tab:
+ escseq = "\t";
+ break;
+ case XK_Escape:
+ escseq = "\e";
+ break;
+ }
+
+ debug_printf ("bla\n");
+ if (escseq != NULL)
+ {
+ strcat (buf + size, escseq);
+ size += strlen (escseq);
+ }
+ else
+ {
+ char *buffer = &buf[size];
+ size_t left = sizeof (buf) - size;
+ char *inbuf = (char *) &input;
+ size_t inbufsize = sizeof (wchar_t);
+ size_t nr;
+
+ /* Control key behaviour. */
+ if (bmods.rmods & RMOD_CTRL)
+ input = symtoctrlsym (input);
+
+ /* Convert the Keysym to a UCS4 characted. */
+ input = KeySymToUcs4 (input);
+ /* if (!input) */
+ /* continue; */
+
+ debug_printf ("UCS4: %d -- %c\n", (int) input, input);
+
+ /* If CAPSLOCK is active capitalize the symbol. */
+ if (emods.rmods & 2)
+ input = towupper (input);
+
+ nr = iconv (cd, &inbuf, &inbufsize, &buffer, &left);
+ if (nr == (size_t) -1)
+ {
+ if (errno == E2BIG)
+ console_error (L"Input buffer overflow");
+ else if (errno == EILSEQ)
+ console_error
+ (L"Input contained invalid byte sequence");
+ else if (errno == EINVAL)
+ console_error
+ (L"Input contained incomplete byte sequence");
+ else
+ console_error
+ (L"Input caused unexpected error");
+ }
+ size = sizeof (buf) - left;
+ }
+
+ // printf ("SIZE: %d\n", size);
+ if (size)
+ console_input (buf, size);
+ size = 0;
+}
+
+any_t
+input_loop (any_t foo)
+{
+ keycode_t prevkey = 0;
+
+ for (;;)
+ {
+ /* The previous keypress. */
+ // static keypress_t prevkey = { 0 };
+ keypress_t key;
+
+ key.keycode = read_keycode () + min_keys;
+ key.rel = key.keycode & 0x80;
+ key.redir = 0;
+
+/* if (key.keycode == 9) */
+/* console_exit (); */
+
+ // printf ("read keycode: %d\n", key.keycode);
+
+ if (!key.rel && key.keycode == prevkey)
+ key.repeat = 1;
+ else
+ key.repeat = 0;
+
+ if (key.repeat)
+ continue;
+
+ /* The keycombination CTRL+Alt+Backspace terminates the console
+ client. Keycodes instead of modifiers+symbols are used to
+ make it able to exit the client, even when the keymaps are
+ faulty. */
+ if ((keystate[64].keypressed || keystate[113].keypressed) /* Alt */
+ && (keystate[37].keypressed || keystate[109].keypressed) /* CTRL*/
+ && keystate[22].keypressed && ctrlaltbs) /* Backspace. */
+ console_exit ();
+
+ debug_printf ("---%d %d %d---\n", keystate[64].keypressed,
+ keystate[37].keypressed, keystate[22].keypressed);
+
+ if (!key.repeat)
+ xkb_input_key (key.keycode);
+ prevkey = key.keycode;
+ }
+}
+
+
+/* /\* Read a single symbol. *\/ */
+/* static symbol */
+/* read_symbol (void) */
+/* { */
+/* symbol sym; */
+
+/* for (;;) */
+/* { */
+/* keypress_t key; */
+
+/* /\* A keycode generated by a timer should be handled here. *Somehow* *\/ */
+
+
+/* /\* /\\* Check if this keypress event was the result of a typematic *\/ */
+/* /\* repeat. *\\/ *\/ */
+/* /\* if (!key.rel) *\/ */
+/* /\* { *\/ */
+/* /\* key.repeat = keystate[key.keycode].keypressed; *\/ */
+/* /\* keystate[key.keycode].lmods = lmods; *\/ */
+/* /\* } *\/ */
+/* /\* else *\/ */
+/* /\* { *\/ */
+/* /\* if (keystate[key.keycode].keypressed) *\/ */
+/* /\* key.repeat = 0; *\/ */
+/* /\* else /\\* Keyreleased that was never pressed. *\\/ *\/ */
+/* /\* return 0; *\/ */
+/* /\* } *\/ */
+
+
+
+/* // sym = handle_key (key); */
+/* sym = 0; */
+
+/* // printf ("Key: %d (%d)\n", (int) sym, key.keycode); */
+
+/* // keystate[key.keycode].hwkeypressed = key.rel ? 0 : 1; */
+
+
+/* if (!key.repeat) */
+/* prevkey = key; */
+
+/* /\* Not every keypress results in a symbol, see handle_key. *\/ */
+/* /\* XXX: returning 0 when there is no symbol is incorrect */
+/* behaviour because 0 is a valid symbol value. *\/ */
+/* if (sym != -1) */
+/* return sym; */
+/* } */
+/* } */
+
+static struct arguments
+{
+ char *xkbdir;
+ char *keymapfile;
+ char *keymap;
+ char *composefile;
+ int ctrlaltbs;
+ int pos;
+} arguments = { ctrlaltbs: 1 };
+
+error_t parse_xkbconfig (char *xkbdir, char *xkbkeymapfile, char *xkbkeymap);
+
+static error_t xkb_start (void *handle);
+static error_t xkb_init (void **handle, int no_exit, int argc, char *argv[],
+ int *next);
+
+/* const char *argp_program_version = "XKB plugin 0.003"; */
+/* const char *argp_program_bug_address = "metgerards@student.han.nl"; */
+static struct argp_option options[] = {
+ {"xkbdir", 'x', "DIR", 0,
+ "directory containing the XKB configuration files" },
+ {"keymapfile", 'f', "FILE", 0,
+ "file containing the keymap" },
+ {"keymap", 'k', "SECTIONNAME" , 0,
+ "choose keymap"},
+ {"compose", 'o', "COMPOSEFILE", 0,
+ "Compose file to load (default none)"},
+ {"ctrlaltbs", 'c', 0 , 0,
+ "CTRL + Alt + Backspace will exit the console client (default)."},
+ {"no-ctrlaltbs", 'n', 0 , 0,
+ "CTRL + Alt + Backspace will not exit the console client."},
+ {"repeat", 'r', "NODE", 0, "Set a repeater translator on NODE"},
+ {0}
+};
+
+static error_t
+parse_opt (int key, char *arg, struct argp_state *state)
+{
+ struct arguments *arguments = state->input;
+
+ switch (key)
+ {
+ case 'x':
+ arguments->xkbdir = arg;
+ break;
+
+ case 'f':
+ arguments->keymapfile = arg;
+ break;
+
+ case 'k':
+ arguments->keymap = arg;
+ break;
+
+ case 'o':
+ arguments->composefile = arg;
+ break;
+
+ case 'c':
+ arguments->ctrlaltbs = 1;
+ break;
+
+ case 'n':
+ arguments->ctrlaltbs = 0;
+ break;
+
+ case 'r':
+ repeater_node = arg;
+ break;
+
+ case ARGP_KEY_END:
+ break;
+
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+
+ arguments->pos = state->next;
+ return 0;
+}
+
+static struct argp argp = {options, parse_opt, 0, 0};
+
+static error_t
+xkb_init (void **handle, int no_exit, int argc, char **argv, int *next)
+{
+ error_t err;
+ int lastarg;
+
+ setlocale(LC_ALL, "");
+
+ arguments.pos = 1;
+ err = argp_parse (&argp, argc, argv, ARGP_IN_ORDER | ARGP_NO_EXIT
+ | ARGP_SILENT, 0, &arguments);
+ *next += arguments.pos - 1;
+ if (err && err != EINVAL)
+ return err;
+
+ /* Defaults. */
+ if (!arguments.xkbdir)
+ arguments.xkbdir = "/home/marco/xkb";
+ /* debug: */
+/* arguments.keymapfile = "keymap/hurd"; */
+/* arguments.keymap = "Hurd"; */
+/* arguments.xkbdir = "/home/marco/xkb"; */
+/* arguments.keymapfile = "keymap/xfree86"; */
+/* arguments.keymap = "us"; */
+
+
+ ctrlaltbs = arguments.ctrlaltbs;
+
+ if (arguments.composefile)
+ {
+ err = read_composefile (arguments.composefile);
+ if (err)
+ return err;
+ }
+
+ xkb_data_init ();
+ err = parse_xkbconfig (arguments.xkbdir, arguments.keymapfile,
+ arguments.keymap);
+
+ if (err)
+ return err;
+
+ determine_keytypes ();
+ interpret_all ();
+
+ return 0;
+}
+
+/* static any_t */
+/* input_loop (any_t blaat) */
+/* { */
+
+/* for (;;) */
+/* { */
+/* wchar_t input = read_symbol (); */
+
+
+/* } */
+
+
+static struct input_ops xkb_ops;
+
+static error_t
+xkb_start (void *handle)
+{
+ error_t err;
+ device_t device_master;
+
+ cd = iconv_open ("UTF-8", "WCHAR_T");
+ if (cd == (iconv_t) -1)
+ return errno;
+
+ xkb_init_repeat (100L, 10L);
+
+ err = get_privileged_ports (0, &device_master);
+ if (err)
+ return err;
+
+ err = device_open (device_master, D_READ | D_WRITE, "@>=kbd", &kbd_dev);
+ if (err == D_NO_SUCH_DEVICE)
+ {
+ /* GNU Mach v1 has a different device. */
+ gnumach_v1_compat = 1;
+ err = device_open (device_master, D_READ, "kbd", &kbd_dev);
+ }
+
+ mach_port_deallocate (mach_task_self (), device_master);
+ if (err)
+ return err;
+
+ if (gnumach_v1_compat)
+ {
+ int data = KB_EVENT;
+ err = device_set_status (kbd_dev, KDSKBDMODE, &data, 1);
+ if (err)
+ {
+ device_close (kbd_dev);
+ mach_port_deallocate (mach_task_self (), kbd_dev);
+ return err;
+ }
+ }
+
+ driver_add_input (&xkb_ops, NULL);
+
+ if (repeater_node)
+ kbd_setrepeater (repeater_node, &cnode);
+
+ cthread_detach (cthread_fork (input_loop, NULL));
+
+ return 0;
+}
+
+static error_t
+xkb_fini (void *handle, int force)
+{
+ driver_remove_input (&xkb_ops, NULL);
+
+ if (gnumach_v1_compat)
+ {
+ int data = KB_ASCII;
+ device_set_status (kbd_dev, KDSKBDMODE, &data, 1);
+ }
+ device_close (kbd_dev);
+ mach_port_deallocate (mach_task_self (), kbd_dev);
+
+ console_unregister_consnode (cnode);
+ console_destroy_consnode (cnode);
+
+ return 0;
+}
+
+static error_t
+xkb_set_scroll_lock_status (void *handle, int onoff)
+{
+ return 0;
+}
+
+struct driver_ops driver_xkb_ops =
+ {
+ xkb_init,
+ xkb_start,
+ xkb_fini
+ };
+
+static struct input_ops xkb_ops =
+ {
+ xkb_set_scroll_lock_status,
+ NULL
+ };
diff --git a/console-client/xkb/xkb.h b/console-client/xkb/xkb.h
new file mode 100644
index 00000000..9792431f
--- /dev/null
+++ b/console-client/xkb/xkb.h
@@ -0,0 +1,435 @@
+/* Keyboard plugin for the Hurd console using XKB keymaps.
+
+ Copyright (C) 2002,03 Marco Gerards
+
+ Written by Marco Gerards <marco@student.han.nl>
+
+ 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. */
+
+#include <errno.h>
+#include <argp.h>
+//#include "kbd_driver.h"
+
+typedef int keycode_t;
+typedef unsigned int scancode_t;
+typedef int symbol;
+typedef int group_t;
+typedef unsigned int boolctrls;
+//typedef int error_t;
+
+#define KEYCONSUMED 1
+#define KEYNOTCONSUMED 0
+
+#define RedirectIntoRange 1
+#define ClampIntoRange 2
+#define WrapIntoRange 0
+
+typedef enum mergemode
+ {
+ augment,
+ override,
+ replace,
+ alternate,
+ defaultmm
+ } mergemode;
+
+extern mergemode merge_mode;
+
+typedef unsigned long KeySym;
+
+/* Real modifiers. */
+#define RMOD_SHIFT 1 << 0
+#define RMOD_LOCK 1 << 1
+#define RMOD_CTRL 1 << 2
+#define RMOD_MOD1 1 << 3
+#define RMOD_MOD2 1 << 4
+#define RMOD_MOD3 1 << 5
+#define RMOD_MOD4 1 << 6
+#define RMOD_MOD5 1 << 7
+
+/* If set the key has action(s). */
+#define KEYHASACTION (1<<4)
+/* Normally the keytype will be calculated, but some keys like SYSRQ
+ can't be calculated. For these keys the name for the keytypes will
+ be given for every group fro whch the bit is set. */
+#define KEYHASTYPES 0xf
+#define KEYHASBEHAVIOUR (1<<5)
+/* Will the key be repeated when held down, or not. */
+#define KEYREPEAT (1<<6)
+#define KEYNOREPEAT (1<<7)
+
+/* The complete set of modifiers. */
+typedef struct modmap
+{
+ /* Real modifiers. */
+ int rmods;
+ /* Virtual modifiers. */
+ int vmods;
+} modmap_t;
+
+/* Modifier counter. */
+typedef struct modcount
+{
+ int rmods[8];
+ int vmods[16];
+} modcount_t;
+
+/* Map modifiers to a shift level. */
+typedef struct typemap
+{
+ /* Shift level used when required modifiers match the active modifiers. */
+ int level;
+ modmap_t mods;
+ modmap_t preserve;
+ struct typemap *next;
+} typemap_t;
+
+/* The keypad symbol range. */
+#define KEYPAD_FIRST_KEY 0xFF80
+#define KEYPAD_LAST_KEY 0xFFB9
+#define KEYPAD_MASK 0xFF80
+
+/* Convert a keypad symbol to a ASCII symbol. */
+#define keypad_to_ascii(c) c = (c & (~KEYPAD_MASK))
+
+/* The default keytypes. These can be calculated. */
+#define KT_ONE_LEVEL 0
+#define KT_TWO_LEVEL 1
+#define KT_ALPHA 2
+#define KT_KEYPAD 3
+
+typedef struct keytype
+{
+ /* Mask that determines which modifiers should be checked. */
+ modmap_t modmask;
+ /* Amount of levels. */
+ int levels;
+ /* The required set of modifiers for one specific level. */
+ struct typemap *maps;
+
+ char *name;
+ struct keytype *hnext;
+ struct keytype **prevp;
+} keytype_t;
+
+extern struct keytype *keytypes;
+extern int keytype_count;
+
+/* All Actions as described in the protocol specification. */
+typedef enum actiontype
+ {
+ SA_NoAction,
+ SA_SetMods,
+ SA_LatchMods,
+ SA_LockMods,
+ SA_SetGroup,
+ SA_LatchGroup,
+ SA_LockGroup,
+ SA_MovePtr,
+ SA_PtrBtn,
+ SA_LockPtrBtn,
+ SA_SetPtrDflt,
+ SA_ISOLock,
+ SA_TerminateServer,
+ SA_SwitchScreen,
+ SA_SetControls,
+ SA_LockControls,
+ SA_ActionMessage,
+ SA_RedirectKey,
+ SA_DeviceBtn,
+ SA_LockDeviceBtn,
+ SA_DeviceValuator,
+ SA_ConsScroll
+ } actiontype_t;
+
+typedef struct xkb_action
+{
+ actiontype_t type;
+ int data[15];
+} xkb_action_t;
+
+#define useModMap 4
+#define clearLocks 1
+#define latchToLock 2
+#define noLock 1
+#define noUnlock 2
+#define groupAbsolute 4
+#define NoAcceleration 1
+#define MoveAbsoluteX 2
+#define MoveAbsoluteY 4
+/* XXX: This flag is documentated and I've implemented it. Weird
+ stuff. */
+#define useDfltBtn 0
+#define DfltBtnAbsolute 2
+#define AffectDfltBtn 1
+#define switchApp 1
+#define screenAbs 4
+#define lineAbs 2
+#define usePercentage 8
+
+/* Defines how symbols and rmods are interpreted. This is used to
+ bound an action to a key that doesn't have an action bound to it,
+ only a modifier or action describing symbol. */
+typedef struct xkb_interpret
+{
+ symbol symbol;
+ int rmods;
+ int match;
+ int vmod; /* XXX: Why does this field have a size of only 8 bits? */
+ int flags;
+ struct xkb_action action;
+ struct xkb_interpret *next;
+} xkb_interpret_t;
+
+extern xkb_interpret_t *interpretations;
+extern int interpret_count;
+
+/* These are the parameter names that are used by the actions that
+ control modifiers. (this is stored in the data field of
+ xkb_action)*/
+typedef struct action_setmods
+{
+ actiontype_t type;
+ /* The flags configure the behaviour of the action. */
+ int flags;
+ /* XXX: The real modifiers that can be controlled by this action. */
+ int modmask;
+ /* The modifiers that are will be set/unset by this action. */
+ modmap_t modmap;
+} action_setmods_t;
+
+typedef struct action_setgroup
+{
+ actiontype_t type;
+ int flags;
+ int group;
+} action_setgroup_t;
+
+typedef struct action_moveptr
+{
+ actiontype_t type;
+ int flags;
+ int x;
+ int y;
+} action_moveptr_t;
+
+typedef struct action_ptrbtn
+{
+ actiontype_t type;
+ int flags;
+ int count; /* Isn't used for LockPtrBtn. */
+ int button;
+} action_ptrbtn_t;
+
+typedef struct action_ptr_dflt
+{
+ actiontype_t type;
+ int flags;
+ int affect;
+ int value;
+} action_ptr_dflt_t;
+
+typedef struct action_switchscrn
+{
+ actiontype_t type;
+ int flags;
+ int screen;
+} action_switchscrn_t;
+
+typedef struct action_consscroll
+{
+ actiontype_t type;
+ int flags;
+ double screen;
+ int line;
+ int percent;
+} action_consscroll_t;
+
+typedef struct action_redirkey
+{
+ actiontype_t type;
+ int newkey;
+ int rmodsmask;
+ int rmods;
+ int vmodsmask;
+ int vmods;
+} action_redirkey_t;
+
+typedef struct action_setcontrols
+{
+ actiontype_t type;
+ int controls;
+} action_setcontrols_t;
+
+/* Every key can have 4 groups, this is the information stored per
+ group. */
+struct keygroup
+{
+ /* All symbols for every available shift level and group. */
+ symbol *symbols;
+ /* All actions for every available shift level and group. */
+ struct xkb_action **actions;
+ /* The keytype of this key. The keytype determines the available
+ shift levels and which modiers are used to set the shift level.
+ */
+ struct keytype *keytype;
+ /* Amount of symbols held in this group of this key. */
+ int width;
+ int actionwidth;
+};
+
+/* A single key scancode stored in memory. */
+typedef struct key
+{
+ /* The flags that can be set for this key (To change the behaviour
+ of this key). */
+ int flags;
+ /* Every key has a maximum of 4 groups. (XXX: According to Ivan
+ Pascal's documentation... I'm not really sure if that is true.) */
+ struct keygroup groups[4];
+ int numgroups;
+ struct modmap mods;
+} keyinf_t;
+
+extern struct key *keys;
+extern int min_keys;
+extern int max_keys;
+
+/* The current state of every key. */
+typedef struct keystate
+{
+ /* Key is pressed. */
+ unsigned short keypressed:1;
+ unsigned short prevstate:1;
+ /* The key was disabled for bouncekeys. */
+ unsigned short disabled:1;
+ /* Information about locked modifiers at the time of the keypress,
+ this information is required for unlocking when the key is released. */
+ modmap_t lmods;
+ /* The modifiers and group that were active at keypress, make them
+ active again on keyrelease so the action will be undone. */
+ modmap_t prevmods;
+ boolctrls bool;
+ group_t prevgroup;
+ group_t oldgroup;
+} keystate_t;
+
+extern struct keystate keystate[255];
+
+typedef struct keypress
+{
+ keycode_t keycode;
+ keycode_t prevkc;
+ // struct keystate *state;
+ unsigned short repeat:1; /* It this a real keypress?. */
+ unsigned short redir:1; /* This is not a real keypress. */
+ unsigned short rel; /* Key release. */
+} keypress_t;
+
+/* Flags for indicators. */
+#define IM_NoExplicit 0x80
+#define IM_NoAutomatic 0x40
+#define IM_LEDDrivesKB 0x20
+
+#define IM_UseCompat 0x10
+#define IM_UseEffective 0x08
+#define IM_UseLocked 0x04
+#define IM_UseLatched 0x02
+#define IM_UseBase 0x01
+
+
+typedef struct xkb_indicator
+{
+ int flags;
+ int which_mods;
+ modmap_t modmap;
+ int which_groups;
+ int groups;
+ unsigned int ctrls;
+} xkb_indicator_t;
+
+extern xkb_indicator_t *indicators;
+extern int indicator_count;
+
+unsigned int KeySymToUcs4(int keysym);
+symbol compose_symbols (symbol symbol);
+error_t read_composefile (char *);
+KeySym XStringToKeysym(char *s);
+struct keytype *keytype_find (char *name);
+
+void key_set_action (struct key *key, group_t group, int level,
+ xkb_action_t *action);
+
+
+/* Interfaces for xkbdata.c: */
+extern struct xkb_interpret default_interpretation;
+
+
+/* Assign the name KEYNAME to the keycode KEYCODE. */
+error_t keyname_add (char *keyname, int keycode);
+
+/* Find the numberic representation of the keycode with the name
+ KEYNAME. */
+int keyname_find (char *keyname);
+
+/* Search the keytype with the name NAME. */
+struct keytype *keytype_find (char *name);
+
+/* Remove the keytype KT. */
+void keytype_delete (struct keytype *kt);
+
+/* Create a new keytype with the name NAME. */
+error_t keytype_new (char *name, struct keytype **new_kt);
+
+/* Add a level (LEVEL) to modifiers (MODS) mapping to the current
+ keytype. */
+error_t keytype_mapadd (struct keytype *kt, modmap_t mods, int level);
+
+/* For the current keytype the modifiers PRESERVE should be preserved
+ when the modifiers MODS are pressed. */
+error_t keytype_preserve_add (struct keytype *kt, modmap_t mods,
+ modmap_t preserve);
+
+/* Add a new interpretation. */
+error_t interpret_new (xkb_interpret_t **new_interpret, symbol ks);
+
+/* Get the number assigned to the virtualmodifier with the name
+ VMODNAME. */
+int vmod_find (char *vmodname);
+
+/* Give the virtualmodifier VMODNAME a number and add it to the
+ hashtable. */
+error_t vmod_add (char *vmodname);
+
+/* Initialize the list for keysyms to realmodifiers mappings. */
+void ksrm_init ();
+
+/* Add keysym to realmodifier mapping. */
+error_t ksrm_add (symbol ks, int rmod);
+
+/* Apply the rkms (realmods to keysyms) table to all keysyms. */
+void ksrm_apply (void);
+
+/* Set the current rmod for the key with keyname KEYNAME. */
+/* XXX: It shouldn't be applied immediatly because the key can be
+ replaced. */
+void set_rmod_keycode (char *keyname, int rmod);
+
+/* Initialize XKB data structures. */
+error_t xkb_data_init (void);
+
+error_t xkb_input_key (int key);
+
+error_t xkb_init_repeat (int delay, int repeat);
+
+void xkb_input (keypress_t key);
+
+int debug_printf (const char *f, ...);
diff --git a/console-client/xkb/xkbdata.c b/console-client/xkb/xkbdata.c
new file mode 100644
index 00000000..97545e52
--- /dev/null
+++ b/console-client/xkb/xkbdata.c
@@ -0,0 +1,456 @@
+/* xkbdata.c -- Manage XKB datastructures.
+
+ Copyright (C) 2003 Marco Gerards
+
+ Written by Marco Gerards <marco@student.han.nl>
+
+ 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. */
+
+/* Generate a key for the string S. XXX: The are many more effecient
+ algoritms, this one should be replaced by one of those. */
+
+#include <stdlib.h>
+#include <string.h>
+#include <hurd/ihash.h>
+#include "xkb.h"
+
+static int
+name_hash (char *s)
+{
+ int i = 0;
+ while (*s)
+ i += *(s++);
+ return i;
+}
+
+
+/* A keyname with a keycode and realmodifier bound to it. */
+struct keyname
+{
+ int keycode;
+ int rmods;
+};
+
+static struct hurd_ihash kn_mapping;
+
+/* Initialize the keyname hashtable. */
+static void
+keyname_init ()
+{
+ hurd_ihash_init (&kn_mapping, HURD_IHASH_NO_LOCP);
+ debug_printf ("Kn_mapping init");
+ /* XXX: error. */
+}
+
+/* Assign the name KEYNAME to the keycode KEYCODE. */
+error_t
+keyname_add (char *keyname, int keycode)
+{
+ struct keyname *kn;
+ int kn_int;
+
+ kn = malloc (sizeof (struct keyname));
+ if (!kn)
+ return ENOMEM;
+
+ /* XXX: 4 characters can be mapped into a int, it is safe to assume
+ this will not be changed. */
+ if (strlen (keyname) > 4)
+ {
+ debug_printf ("The keyname `%s' consist of more than 4 characters;"
+ " 4 characters is the maximum.\n", keyname);
+ /* XXX: Abort? */
+ return 0;
+ }
+
+ kn->keycode = keycode;
+ kn->rmods = 0;
+
+ kn_int = keyname[0] + (keyname[1] << 8) + (keyname[2] << 16) + (keyname[3] << 24);
+ debug_printf ("add : %d\n", kn_mapping.locp_offset);
+ hurd_ihash_add (&kn_mapping, kn_int, kn);
+
+ return 0;
+}
+
+/* Find the numberic representation of the keycode with the name
+ KEYNAME. */
+int
+keyname_find (char *keyname)
+{
+ struct keyname *kn;
+ int kn_int;
+
+ /* XXX: 4 characters can be mapped into a int, it is safe to assume
+ this will not be changed. */
+ if (strlen (keyname) > 4)
+ {
+ debug_printf ("The keyname `%s' consist of more than 4 characters;"
+ " 4 characters is the maximum.\n", keyname);
+ /* XXX: Abort? */
+ return 0;
+ }
+ kn_int = keyname[0] + (keyname[1] << 8) + (keyname[2] << 16) + (keyname[3] << 24);
+
+ kn = hurd_ihash_find (&kn_mapping, kn_int);
+ if (kn)
+ return kn->keycode;
+/* int h = name_hash (keyname); */
+/* struct keyname *kn; */
+/* for (kn = knhash[KNHASH(h)]; kn; kn = kn->hnext) */
+/* { */
+/* if (strcmp (kn->keyname, keyname)) */
+/* continue; */
+
+/* return kn->keycode; */
+/* } */
+
+ /* XXX: Is 0 an invalid keycode? */
+ return 0;
+}
+
+
+/* Keytypes and keytype maps. */
+
+/* The dummy gets used when the original may not be overwritten. */
+static struct keytype dummy_keytype;
+
+#define KTHSZ 16
+#if ((KTHSZ&(KTHSZ-1)) == 0)
+#define KTHASH(ktttl) ((ktttl)&(KTHSZ-1))
+#else
+#define KTHASH(ktttl) (((unsigned)(kt))%KTHSZ)
+#endif
+
+/* All keytypes. */
+struct keytype *kthash[KTHSZ];
+
+/* Initialize the keytypes hashtable. */
+static void
+keytype_init ()
+{
+ int n;
+ for (n = 0; n < KTHSZ; n++)
+ kthash[n] = 0;
+}
+
+/* Search the keytype with the name NAME. */
+struct keytype *
+keytype_find (char *name)
+{
+ int nhash = name_hash (name);
+ struct keytype *kt;
+
+ for (kt = kthash[KTHASH(nhash)]; kt; kt = kt->hnext)
+ if (!strcmp (name, kt->name))
+ return kt;
+ return NULL;
+}
+
+/* Remove the keytype KT. */
+void
+keytype_delete (struct keytype *kt)
+{
+ struct typemap *map;
+
+
+ *kt->prevp = kt->hnext;
+ if (kt->hnext)
+ kt->hnext->prevp = kt->prevp;
+
+ map = kt->maps;
+ while (map)
+ {
+ struct typemap *nextmap = map->next;
+ free (map);
+ map = nextmap;
+ }
+
+}
+
+/* Create a new keytype with the name NAME. */
+error_t
+keytype_new (char *name, struct keytype **new_kt)
+{
+ struct keytype *kt;
+ struct keytype *ktlist;
+ int nhash;
+
+ nhash = name_hash (name);
+ debug_printf ("New: %s\n", name);
+
+ kt = keytype_find (name);
+
+ if (kt)
+ {
+ /* If the merge mode is augement don't replace it. */
+ if (merge_mode == augment)
+ {
+ *new_kt = &dummy_keytype;
+ return 0;
+ }
+ else /* This keytype should replace the old one, remove the old one. */
+ keytype_delete (kt);
+ }
+
+ ktlist = kthash[KTHASH(nhash)];
+ kt = calloc (1, sizeof (struct keytype));
+ if (kt == NULL)
+ return ENOMEM;
+
+ kt->hnext = ktlist;
+ kt->name = strdup (name);
+ kt->prevp = &kthash[KTHASH(nhash)];
+ kt->maps = NULL;
+ if (kthash[KTHASH(nhash)])
+ kthash[KTHASH(nhash)]->prevp = &(kt->hnext);
+ kthash[KTHASH(nhash)] = kt;
+
+ *new_kt = kt;
+ return 0;
+}
+
+/* Add a level (LEVEL) to modifiers (MODS) mapping to the current
+ keytype. */
+error_t
+keytype_mapadd (struct keytype *kt, modmap_t mods, int level)
+{
+ struct typemap *map;
+ modmap_t nulmap = {0, 0};
+
+ map = malloc (sizeof (struct typemap));
+ if (!map)
+ return ENOMEM;
+
+ map->level = level;
+ map->mods = mods;
+ map->preserve = nulmap;
+ /* By default modifiers shouldn't be preserved. */
+ map->next = kt->maps;
+
+ kt->maps = map;
+
+ return 0;
+}
+
+/* For the current keytype the modifiers PRESERVE should be preserved
+ when the modifiers MODS are pressed. */
+error_t
+keytype_preserve_add (struct keytype *kt, modmap_t mods, modmap_t preserve)
+{
+ error_t err;
+ struct typemap *map;
+
+ map = kt->maps;
+ while (map)
+ {
+ if (mods.rmods == map->mods.rmods && mods.vmods == map->mods.vmods)
+ {
+ map->preserve = preserve;
+ return 0;
+ }
+ map = map->next;
+ }
+
+ /* No map has been found, add the default map. */
+ err = keytype_mapadd (kt, mods, 0);
+ if (err)
+ return err;
+
+ keytype_preserve_add (kt, mods, preserve);
+
+ return 0;
+}
+
+
+/* Interpretations. */
+
+struct xkb_interpret *last_interp;
+struct xkb_interpret default_interpretation;
+
+
+/* Add a new interpretation. */
+error_t
+interpret_new (xkb_interpret_t **new_interpret, symbol ks)
+{
+ struct xkb_interpret *new_interp;
+
+ new_interp = malloc (sizeof (struct xkb_interpret));
+ if (!new_interp)
+ return ENOMEM;
+
+ memcpy (new_interp, &default_interpretation, sizeof (struct xkb_interpret));
+ new_interp->symbol = ks;
+
+ if (ks)
+ {
+ new_interp->next = interpretations;
+ interpretations = new_interp;
+
+ if (!last_interp)
+ last_interp = new_interp;
+ }
+ else
+ {
+ if (last_interp)
+ last_interp->next = new_interp;
+
+ last_interp = new_interp;
+
+ if (!interpretations)
+ interpretations = new_interp;
+ }
+
+ *new_interpret = new_interp;
+
+ return 0;
+}
+
+
+/* XXX: Dead code!? */
+/* Virtual modifiers name to number mapping. */
+/* Last number assigned to a virtual modifier. */
+static int lastvmod = 0;
+
+/* One virtual modifiername -> vmod number mapping. */
+struct vmodname
+{
+ char *name;
+ struct vmodname *next;
+};
+
+/* A list of virtualmodifier names and its numberic representation. */
+static struct vmodname *vmodnamel;
+
+/* Get the number assigned to the virtualmodifier with the name
+ VMODNAME. */
+int
+vmod_find (char *vmodname)
+{
+ int i = 0;
+ struct vmodname *vmn = vmodnamel;
+
+ while (vmn)
+ {
+ if (!strcmp (vmn->name, vmodname))
+ return (lastvmod - i);
+ vmn = vmn->next;
+ i++;
+ }
+
+ return 0;
+}
+
+/* Give the virtualmodifier VMODNAME a number and add it to the
+ hashtable. */
+error_t
+vmod_add (char *vmodname)
+{
+ struct vmodname *vmn;
+
+ if (vmod_find (vmodname))
+ return 0;
+
+ vmn = malloc (sizeof (struct vmodname));
+ if (vmn == NULL)
+ return ENOMEM;
+
+ vmn->name = vmodname;
+ vmn->next = vmodnamel;
+ vmodnamel = vmn;
+
+ lastvmod++;
+
+ return 0;
+}
+
+
+/* XXX: Use this, no pointers. */
+struct ksrm
+{
+ symbol ks;
+
+ int rmods;
+};
+static struct hurd_ihash ksrm_mapping;
+
+/* Initialize the list for keysyms to realmodifiers mappings. */
+void
+ksrm_init ()
+{
+ hurd_ihash_init (&ksrm_mapping, HURD_IHASH_NO_LOCP);
+ debug_printf ("KSRM MAP IHASH CREATED \n");
+}
+
+/* Add keysym to realmodifier mapping. */
+error_t
+ksrm_add (symbol ks, int rmod)
+{
+ hurd_ihash_add (&ksrm_mapping, ks, (void *) rmod);
+
+ return 0;
+}
+
+/* Apply the rkms (realmods to keysyms) table to all keysyms. */
+void
+ksrm_apply (void)
+{
+ keycode_t kc;
+ for (kc = 0; kc < max_keys; kc++)
+ {
+ int group;
+ for (group = 0; group < 4; group++)
+ {
+ int cursym;
+ for (cursym = 0; cursym < keys[kc].groups[group].width; cursym++)
+ {
+ symbol ks = keys[kc].groups[group].symbols[cursym];
+ int rmods = (int) hurd_ihash_find (&ksrm_mapping, ks);
+ struct ksrm *ksrm;
+
+ if (rmods)
+ {
+ keys[kc].mods.rmods = rmods;
+ debug_printf ("kss %d = %d\n", kc, ksrm->rmods);
+ }
+ }
+ }
+ }
+}
+
+
+/* void */
+/* indicator_new (xkb_indicator_t **, */
+
+
+/* Keycode to realmodifier mapping. */
+
+/* Set the current rmod for the key with keyname KEYNAME. */
+/* XXX: It shouldn't be applied immediatly because the key can be
+ replaced. */
+void
+set_rmod_keycode (char *keyname, int rmod)
+{
+ keycode_t kc = keyname_find (keyname);
+ keys[kc].mods.rmods = rmod;
+ debug_printf ("kc %d = %d\n", kc, rmod);
+}
+
+/* Initialize XKB data structures. */
+error_t
+xkb_data_init (void)
+{
+ keyname_init ();
+ keytype_init ();
+ ksrm_init ();
+
+ return 0;
+}
diff --git a/console-client/xkb/xkbdefaults.c b/console-client/xkb/xkbdefaults.c
new file mode 100644
index 00000000..e64f471a
--- /dev/null
+++ b/console-client/xkb/xkbdefaults.c
@@ -0,0 +1,1318 @@
+char *default_xkb_keymap = "\
+xkb_keymap {\n\
+xkb_keycodes \"xfree86\" {\n\
+ minimum = 8;\n\
+ maximum = 255;\n\
+ <ESC> = 9;\n\
+ <AE01> = 10;\n\
+ <AE02> = 11;\n\
+ <AE03> = 12;\n\
+ <AE04> = 13;\n\
+ <AE05> = 14;\n\
+ <AE06> = 15;\n\
+ <AE07> = 16;\n\
+ <AE08> = 17;\n\
+ <AE09> = 18;\n\
+ <AE10> = 19;\n\
+ <AE11> = 20;\n\
+ <AE12> = 21;\n\
+ <BKSP> = 22;\n\
+ <TAB> = 23;\n\
+ <AD01> = 24;\n\
+ <AD02> = 25;\n\
+ <AD03> = 26;\n\
+ <AD04> = 27;\n\
+ <AD05> = 28;\n\
+ <AD06> = 29;\n\
+ <AD07> = 30;\n\
+ <AD08> = 31;\n\
+ <AD09> = 32;\n\
+ <AD10> = 33;\n\
+ <AD11> = 34;\n\
+ <AD12> = 35;\n\
+ <RTRN> = 36;\n\
+ <LCTL> = 37;\n\
+ <AC01> = 38;\n\
+ <AC02> = 39;\n\
+ <AC03> = 40;\n\
+ <AC04> = 41;\n\
+ <AC05> = 42;\n\
+ <AC06> = 43;\n\
+ <AC07> = 44;\n\
+ <AC08> = 45;\n\
+ <AC09> = 46;\n\
+ <AC10> = 47;\n\
+ <AC11> = 48;\n\
+ <TLDE> = 49;\n\
+ <LFSH> = 50;\n\
+ <BKSL> = 51;\n\
+ <AB01> = 52;\n\
+ <AB02> = 53;\n\
+ <AB03> = 54;\n\
+ <AB04> = 55;\n\
+ <AB05> = 56;\n\
+ <AB06> = 57;\n\
+ <AB07> = 58;\n\
+ <AB08> = 59;\n\
+ <AB09> = 60;\n\
+ <AB10> = 61;\n\
+ <RTSH> = 62;\n\
+ <KPMU> = 63;\n\
+ <LALT> = 64;\n\
+ <SPCE> = 65;\n\
+ <CAPS> = 66;\n\
+ <FK01> = 67;\n\
+ <FK02> = 68;\n\
+ <FK03> = 69;\n\
+ <FK04> = 70;\n\
+ <FK05> = 71;\n\
+ <FK06> = 72;\n\
+ <FK07> = 73;\n\
+ <FK08> = 74;\n\
+ <FK09> = 75;\n\
+ <FK10> = 76;\n\
+ <NMLK> = 77;\n\
+ <SCLK> = 78;\n\
+ <KP7> = 79;\n\
+ <KP8> = 80;\n\
+ <KP9> = 81;\n\
+ <KPSU> = 82;\n\
+ <KP4> = 83;\n\
+ <KP5> = 84;\n\
+ <KP6> = 85;\n\
+ <KPAD> = 86;\n\
+ <KP1> = 87;\n\
+ <KP2> = 88;\n\
+ <KP3> = 89;\n\
+ <KP0> = 90;\n\
+ <KPDL> = 91;\n\
+ <SYRQ> = 92;\n\
+ <LSGT> = 94;\n\
+ <FK11> = 95;\n\
+ <FK12> = 96;\n\
+ <HOME> = 97;\n\
+ <UP> = 98;\n\
+ <PGUP> = 99;\n\
+ <LEFT> = 100;\n\
+ <RGHT> = 102;\n\
+ <END> = 103;\n\
+ <DOWN> = 104;\n\
+ <PGDN> = 105;\n\
+ <INS> = 106;\n\
+ <DELE> = 107;\n\
+ <KPEN> = 108;\n\
+ <RCTL> = 109;\n\
+ <PAUS> = 110;\n\
+ <PRSC> = 111;\n\
+ <KPDV> = 112;\n\
+ <RALT> = 113;\n\
+ <BRK> = 114;\n\
+ <LWIN> = 115;\n\
+ <RWIN> = 116;\n\
+ <MENU> = 117;\n\
+ <FK13> = 118;\n\
+ <FK14> = 119;\n\
+ <FK15> = 120;\n\
+ <FK16> = 121;\n\
+ <FK17> = 122;\n\
+ <KPDC> = 123;\n\
+ <XFER> = 129;\n\
+ <I02> = 130;\n\
+ <NFER> = 131;\n\
+ <I04> = 132;\n\
+ <AE13> = 133;\n\
+ <I06> = 134;\n\
+ <I07> = 135;\n\
+ <I08> = 136;\n\
+ <I09> = 137;\n\
+ <I0A> = 138;\n\
+ <I0B> = 139;\n\
+ <I0C> = 140;\n\
+ <I0D> = 141;\n\
+ <I0E> = 142;\n\
+ <I0F> = 143;\n\
+ <I10> = 144;\n\
+ <I11> = 145;\n\
+ <I12> = 146;\n\
+ <I13> = 147;\n\
+ <I14> = 148;\n\
+ <I15> = 149;\n\
+ <I16> = 150;\n\
+ <I17> = 151;\n\
+ <I18> = 152;\n\
+ <I19> = 153;\n\
+ <I1A> = 154;\n\
+ <I1B> = 155;\n\
+ <I1E> = 158;\n\
+ <I1F> = 159;\n\
+ <I20> = 160;\n\
+ <I21> = 161;\n\
+ <I22> = 162;\n\
+ <I23> = 163;\n\
+ <I24> = 164;\n\
+ <I25> = 165;\n\
+ <I26> = 166;\n\
+ <I27> = 167;\n\
+ <I28> = 168;\n\
+ <I29> = 169;\n\
+ <I2B> = 171;\n\
+ <I2C> = 172;\n\
+ <I2D> = 173;\n\
+ <I2E> = 174;\n\
+ <I2F> = 175;\n\
+ <I30> = 176;\n\
+ <I31> = 177;\n\
+ <I32> = 178;\n\
+ <I33> = 179;\n\
+ <I34> = 180;\n\
+ <I39> = 185;\n\
+ <I3A> = 186;\n\
+ <I3B> = 187;\n\
+ <I3C> = 188;\n\
+ <I42> = 194;\n\
+ <I43> = 195;\n\
+ <I44> = 196;\n\
+ <I45> = 197;\n\
+ <I4A> = 202;\n\
+ <I54> = 212;\n\
+ <I55> = 213;\n\
+ <I56> = 214;\n\
+ <I57> = 215;\n\
+ <I58> = 216;\n\
+ <I59> = 217;\n\
+ <I5A> = 218;\n\
+ <I5E> = 222;\n\
+ <I5F> = 223;\n\
+ <I60> = 224;\n\
+ <I61> = 225;\n\
+ <I62> = 226;\n\
+ <I63> = 227;\n\
+ <I64> = 228;\n\
+ <I65> = 229;\n\
+ <I66> = 230;\n\
+ <I67> = 231;\n\
+ <I68> = 232;\n\
+ <I69> = 233;\n\
+ <I6A> = 234;\n\
+ <I6B> = 235;\n\
+ <I6C> = 236;\n\
+ <I6D> = 237;\n\
+ <I6E> = 238;\n\
+ <I6F> = 239;\n\
+ <I70> = 240;\n\
+ <I71> = 241;\n\
+ <I72> = 242;\n\
+ <I73> = 243;\n\
+ <I74> = 244;\n\
+ <I75> = 245;\n\
+ <I76> = 246;\n\
+ <I77> = 247;\n\
+ <I78> = 248;\n\
+ <I79> = 249;\n\
+ <I7A> = 250;\n\
+ <I7B> = 251;\n\
+ <I7C> = 252;\n\
+ <I7D> = 253;\n\
+ <I7E> = 254;\n\
+ <I7F> = 255;\n\
+ indicator 1 = \"Caps Lock\";\n\
+ indicator 2 = \"Num Lock\";\n\
+ indicator 3 = \"Scroll Lock\";\n\
+ virtual indicator 4 = \"Shift Lock\";\n\
+ virtual indicator 5 = \"Group 2\";\n\
+ virtual indicator 6 = \"Mouse Keys\";\n\
+ alias <HZTG> = <TLDE>;\n\
+ alias <HKTG> = <FK15>;\n\
+ alias <AB11> = <KPDC>;\n\
+ alias <AC12> = <BKSL>;\n\
+ alias <ALGR> = <RALT>;\n\
+};\n\
+\n\
+xkb_types \"complete\" {\n\
+\n\
+ virtual_modifiers NumLock,Alt,LevelThree,AltGr,ScrollLock;\n\
+\n\
+ type \"ONE_LEVEL\" {\n\
+ modifiers= none;\n\
+ level_name[Level1]= \"Any\";\n\
+ };\n\
+ type \"TWO_LEVEL\" {\n\
+ modifiers= Shift;\n\
+ map[Shift]= Level2;\n\
+ level_name[Level1]= \"Base\";\n\
+ level_name[Level2]= \"Shift\";\n\
+ };\n\
+ type \"ALPHABETIC\" {\n\
+ modifiers= Shift+Lock;\n\
+ map[Shift]= Level2;\n\
+ map[Lock]= Level1;\n\
+ preserve[Lock]= Lock;\n\
+ level_name[Level1]= \"Base\";\n\
+ level_name[Level2]= \"Caps\";\n\
+ };\n\
+ type \"KEYPAD\" {\n\
+ modifiers= Shift+NumLock;\n\
+ map[Shift]= Level2;\n\
+ map[NumLock]= Level2;\n\
+ level_name[Level1]= \"Base\";\n\
+ level_name[Level2]= \"Number\";\n\
+ };\n\
+ type \"SHIFT+ALT\" {\n\
+ modifiers= Shift+Alt;\n\
+ map[Shift+Alt]= Level2;\n\
+ level_name[Level1]= \"Base\";\n\
+ level_name[Level2]= \"Shift+Alt\";\n\
+ };\n\
+ type \"PC_BREAK\" {\n\
+ modifiers= Control;\n\
+ map[Control]= Level2;\n\
+ level_name[Level1]= \"Base\";\n\
+ level_name[Level2]= \"Control\";\n\
+ };\n\
+ type \"PC_SYSRQ\" {\n\
+ modifiers= Alt;\n\
+ map[Alt]= Level2;\n\
+ level_name[Level1]= \"Base\";\n\
+ level_name[Level2]= \"Alt\";\n\
+ };\n\
+ type \"CTRL+ALT\" {\n\
+ modifiers= Control+Alt;\n\
+ map[Control+Alt]= Level2;\n\
+ level_name[Level1]= \"Base\";\n\
+ level_name[Level2]= \"Ctrl+Alt\";\n\
+ };\n\
+ type \"THREE_LEVEL\" {\n\
+ modifiers= Shift+LevelThree;\n\
+ map[Shift]= Level2;\n\
+ map[LevelThree]= Level3;\n\
+ map[Shift+LevelThree]= Level3;\n\
+ level_name[Level1]= \"Base\";\n\
+ level_name[Level2]= \"Shift\";\n\
+ level_name[Level3]= \"Level3\";\n\
+ };\n\
+ type \"FOUR_LEVEL\" {\n\
+ modifiers= Shift+LevelThree;\n\
+ map[Shift]= Level2;\n\
+ map[LevelThree]= Level3;\n\
+ map[Shift+LevelThree]= Level4;\n\
+ level_name[Level1]= \"Base\";\n\
+ level_name[Level2]= \"Shift\";\n\
+ level_name[Level3]= \"Alt Base\";\n\
+ level_name[Level4]= \"Shift Alt\";\n\
+ };\n\
+ type \"FOUR_LEVEL_KEYPAD\" {\n\
+ modifiers= Shift+NumLock+LevelThree;\n\
+ map[Shift]= Level2;\n\
+ map[NumLock]= Level2;\n\
+ map[LevelThree]= Level3;\n\
+ map[Shift+LevelThree]= Level4;\n\
+ map[NumLock+LevelThree]= Level4;\n\
+ map[Shift+NumLock+LevelThree]= Level3;\n\
+ level_name[Level1]= \"Base\";\n\
+ level_name[Level2]= \"Number\";\n\
+ level_name[Level3]= \"Alt Base\";\n\
+ level_name[Level4]= \"Alt Number\";\n\
+ };\n\
+};\n\
+\n\
+xkb_compatibility \"complete\" {\n\
+\n\
+ virtual_modifiers NumLock,Alt,LevelThree,AltGr,ScrollLock;\n\
+\n\
+ interpret.useModMapMods= AnyLevel;\n\
+ interpret.repeat= False;\n\
+ interpret.locking= False;\n\
+ interpret ISO_Level2_Latch+Exactly(Shift) {\n\
+ useModMapMods=level1;\n\
+ action= LatchMods(modifiers=Shift,clearLocks,latchToLock);\n\
+ };\n\
+ interpret Shift_Lock+AnyOf(Shift+Lock) {\n\
+ action= LockMods(modifiers=Shift);\n\
+ };\n\
+ interpret Num_Lock+AnyOf(all) {\n\
+ virtualModifier= NumLock;\n\
+ action= LockMods(modifiers=NumLock);\n\
+ };\n\
+ interpret ISO_Lock+AnyOf(all) {\n\
+ action= ISOLock(modifiers=modMapMods,affect=all);\n\
+ };\n\
+ interpret ISO_Level3_Shift+AnyOf(all) {\n\
+ virtualModifier= LevelThree;\n\
+ useModMapMods=level1;\n\
+ action= SetMods(modifiers=LevelThree,clearLocks);\n\
+ };\n\
+ interpret ISO_Level3_Latch+AnyOf(all) {\n\
+ virtualModifier= LevelThree;\n\
+ useModMapMods=level1;\n\
+ action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);\n\
+ };\n\
+ interpret Alt_L+AnyOf(all) {\n\
+ virtualModifier= Alt;\n\
+ action= SetMods(modifiers=modMapMods,clearLocks);\n\
+ };\n\
+ interpret Alt_R+AnyOf(all) {\n\
+ virtualModifier= Alt;\n\
+ action= SetMods(modifiers=modMapMods,clearLocks);\n\
+ };\n\
+ interpret Scroll_Lock+AnyOf(all) {\n\
+ virtualModifier= ScrollLock;\n\
+ action= LockMods(modifiers=modMapMods);\n\
+ };\n\
+ interpret Mode_switch+AnyOfOrNone(all) {\n\
+ virtualModifier= AltGr;\n\
+ useModMapMods=level1;\n\
+ action= SetGroup(group=+1);\n\
+ };\n\
+ interpret ISO_Group_Latch+AnyOfOrNone(all) {\n\
+ virtualModifier= AltGr;\n\
+ useModMapMods=level1;\n\
+ action= LatchGroup(group=2);\n\
+ };\n\
+ interpret ISO_Next_Group+AnyOfOrNone(all) {\n\
+ virtualModifier= AltGr;\n\
+ useModMapMods=level1;\n\
+ action= LockGroup(group=+1);\n\
+ };\n\
+ interpret ISO_Prev_Group+AnyOfOrNone(all) {\n\
+ virtualModifier= AltGr;\n\
+ useModMapMods=level1;\n\
+ action= LockGroup(group=-1);\n\
+ };\n\
+ interpret ISO_First_Group+AnyOfOrNone(all) {\n\
+ action= LockGroup(group=1);\n\
+ };\n\
+ interpret ISO_Last_Group+AnyOfOrNone(all) {\n\
+ action= LockGroup(group=2);\n\
+ };\n\
+ interpret KP_1+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=-1,y=+1);\n\
+ };\n\
+ interpret KP_End+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=-1,y=+1);\n\
+ };\n\
+ interpret KP_2+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=+0,y=+1);\n\
+ };\n\
+ interpret KP_Down+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=+0,y=+1);\n\
+ };\n\
+ interpret KP_3+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=+1,y=+1);\n\
+ };\n\
+ interpret KP_Next+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=+1,y=+1);\n\
+ };\n\
+ interpret KP_4+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=-1,y=+0);\n\
+ };\n\
+ interpret KP_Left+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=-1,y=+0);\n\
+ };\n\
+ interpret KP_6+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=+1,y=+0);\n\
+ };\n\
+ interpret KP_Right+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=+1,y=+0);\n\
+ };\n\
+ interpret KP_7+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=-1,y=-1);\n\
+ };\n\
+ interpret KP_Home+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=-1,y=-1);\n\
+ };\n\
+ interpret KP_8+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=+0,y=-1);\n\
+ };\n\
+ interpret KP_Up+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=+0,y=-1);\n\
+ };\n\
+ interpret KP_9+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=+1,y=-1);\n\
+ };\n\
+ interpret KP_Prior+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= MovePtr(x=+1,y=-1);\n\
+ };\n\
+ interpret KP_5+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= PtrBtn(button=default);\n\
+ };\n\
+ interpret KP_Begin+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= PtrBtn(button=default);\n\
+ };\n\
+ interpret KP_F2+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= SetPtrDflt(affect=button,button=1);\n\
+ };\n\
+ interpret KP_Divide+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= SetPtrDflt(affect=button,button=1);\n\
+ };\n\
+ interpret KP_F3+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= SetPtrDflt(affect=button,button=2);\n\
+ };\n\
+ interpret KP_Multiply+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= SetPtrDflt(affect=button,button=2);\n\
+ };\n\
+ interpret KP_F4+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= SetPtrDflt(affect=button,button=3);\n\
+ };\n\
+ interpret KP_Subtract+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= SetPtrDflt(affect=button,button=3);\n\
+ };\n\
+ interpret KP_Separator+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= PtrBtn(button=default,count=2);\n\
+ };\n\
+ interpret KP_Add+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= PtrBtn(button=default,count=2);\n\
+ };\n\
+ interpret KP_0+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= LockPtrBtn(button=default,affect=lock);\n\
+ };\n\
+ interpret KP_Insert+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= LockPtrBtn(button=default,affect=lock);\n\
+ };\n\
+ interpret KP_Decimal+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= LockPtrBtn(button=default,affect=unlock);\n\
+ };\n\
+ interpret KP_Delete+AnyOfOrNone(all) {\n\
+ repeat= True;\n\
+ action= LockPtrBtn(button=default,affect=unlock);\n\
+ };\n\
+ interpret Pointer_Button_Dflt+AnyOfOrNone(all) {\n\
+ action= PtrBtn(button=default);\n\
+ };\n\
+ interpret Pointer_Button1+AnyOfOrNone(all) {\n\
+ action= PtrBtn(button=1);\n\
+ };\n\
+ interpret Pointer_Button2+AnyOfOrNone(all) {\n\
+ action= PtrBtn(button=2);\n\
+ };\n\
+ interpret Pointer_Button3+AnyOfOrNone(all) {\n\
+ action= PtrBtn(button=3);\n\
+ };\n\
+ interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {\n\
+ action= PtrBtn(button=default,count=2);\n\
+ };\n\
+ interpret Pointer_DblClick1+AnyOfOrNone(all) {\n\
+ action= PtrBtn(button=1,count=2);\n\
+ };\n\
+ interpret Pointer_DblClick2+AnyOfOrNone(all) {\n\
+ action= PtrBtn(button=2,count=2);\n\
+ };\n\
+ interpret Pointer_DblClick3+AnyOfOrNone(all) {\n\
+ action= PtrBtn(button=3,count=2);\n\
+ };\n\
+ interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {\n\
+ action= LockPtrBtn(button=default,affect=both);\n\
+ };\n\
+ interpret Pointer_Drag1+AnyOfOrNone(all) {\n\
+ action= LockPtrBtn(button=1,affect=both);\n\
+ };\n\
+ interpret Pointer_Drag2+AnyOfOrNone(all) {\n\
+ action= LockPtrBtn(button=2,affect=both);\n\
+ };\n\
+ interpret Pointer_Drag3+AnyOfOrNone(all) {\n\
+ action= LockPtrBtn(button=3,affect=both);\n\
+ };\n\
+ interpret Pointer_EnableKeys+AnyOfOrNone(all) {\n\
+ action= LockControls(controls=MouseKeys);\n\
+ };\n\
+ interpret Pointer_Accelerate+AnyOfOrNone(all) {\n\
+ action= LockControls(controls=MouseKeysAccel);\n\
+ };\n\
+ interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {\n\
+ action= SetPtrDflt(affect=button,button=+1);\n\
+ };\n\
+ interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {\n\
+ action= SetPtrDflt(affect=button,button=-1);\n\
+ };\n\
+ interpret AccessX_Enable+AnyOfOrNone(all) {\n\
+ action= LockControls(controls=AccessXKeys);\n\
+ };\n\
+ interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {\n\
+ action= LockControls(controls=AccessXFeedback);\n\
+ };\n\
+ interpret RepeatKeys_Enable+AnyOfOrNone(all) {\n\
+ action= LockControls(controls=RepeatKeys);\n\
+ };\n\
+ interpret SlowKeys_Enable+AnyOfOrNone(all) {\n\
+ action= LockControls(controls=SlowKeys);\n\
+ };\n\
+ interpret BounceKeys_Enable+AnyOfOrNone(all) {\n\
+ action= LockControls(controls=BounceKeys);\n\
+ };\n\
+ interpret StickyKeys_Enable+AnyOfOrNone(all) {\n\
+ action= LockControls(controls=StickyKeys);\n\
+ };\n\
+ interpret MouseKeys_Enable+AnyOfOrNone(all) {\n\
+ action= LockControls(controls=MouseKeys);\n\
+ };\n\
+ interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {\n\
+ action= LockControls(controls=MouseKeysAccel);\n\
+ };\n\
+ interpret Overlay1_Enable+AnyOfOrNone(all) {\n\
+ action= LockControls(controls=Overlay1);\n\
+ };\n\
+ interpret Overlay2_Enable+AnyOfOrNone(all) {\n\
+ action= LockControls(controls=Overlay2);\n\
+ };\n\
+ interpret AudibleBell_Enable+AnyOfOrNone(all) {\n\
+ action= LockControls(controls=AudibleBell);\n\
+ };\n\
+ interpret Terminate_Server+AnyOfOrNone(all) {\n\
+ action= Terminate();\n\
+ };\n\
+ interpret Any+Exactly(Lock) {\n\
+ action= LockMods(modifiers=Lock);\n\
+ };\n\
+ interpret Any+AnyOf(all) {\n\
+ action= SetMods(modifiers=modMapMods,clearLocks);\n\
+ };\n\
+ group 2 = AltGr;\n\
+ group 3 = AltGr;\n\
+ group 4 = AltGr;\n\
+ indicator \"Caps Lock\" {\n\
+ !allowExplicit;\n\
+ whichModState= locked;\n\
+ modifiers= Lock;\n\
+ };\n\
+ indicator \"Num Lock\" {\n\
+ !allowExplicit;\n\
+ whichModState= locked;\n\
+ modifiers= NumLock;\n\
+ };\n\
+ indicator \"Scroll Lock\" {\n\
+ whichModState= locked;\n\
+ modifiers= ScrollLock;\n\
+ };\n\
+ indicator \"Shift Lock\" {\n\
+ !allowExplicit;\n\
+ whichModState= locked;\n\
+ modifiers= Shift;\n\
+ };\n\
+ indicator \"Group 2\" {\n\
+ !allowExplicit;\n\
+ groups= 0xfe;\n\
+ };\n\
+ indicator \"Mouse Keys\" {\n\
+ indicatorDrivesKeyboard;\n\
+ controls= mouseKeys;\n\
+ };\n\
+};\n\
+\n\
+xkb_symbols \"en_US(pc104)\" {\n\
+\n\
+ name[group1]=\"US/ASCII\";\n\
+ name[group2]=\"ISO9995-3\";\n\
+\n\
+ key <ESC> { [ Escape ] };\n\
+ key <AE01> {\n\
+ symbols[Group1]= [ 1, exclam ],\n\
+ symbols[Group2]= [ onesuperior, exclamdown ]\n\
+ };\n\
+ key <AE02> {\n\
+ symbols[Group1]= [ 2, at ],\n\
+ symbols[Group2]= [ twosuperior, oneeighth ]\n\
+ };\n\
+ key <AE03> {\n\
+ symbols[Group1]= [ 3, numbersign ],\n\
+ symbols[Group2]= [ threesuperior, sterling ]\n\
+ };\n\
+ key <AE04> {\n\
+ symbols[Group1]= [ 4, dollar ],\n\
+ symbols[Group2]= [ onequarter, dollar ]\n\
+ };\n\
+ key <AE05> {\n\
+ symbols[Group1]= [ 5, percent ],\n\
+ symbols[Group2]= [ onehalf, threeeighths ]\n\
+ };\n\
+ key <AE06> {\n\
+ symbols[Group1]= [ 6, asciicircum ],\n\
+ symbols[Group2]= [ threequarters, fiveeighths ]\n\
+ };\n\
+ key <AE07> {\n\
+ symbols[Group1]= [ 7, ampersand ],\n\
+ symbols[Group2]= [ braceleft, seveneighths ]\n\
+ };\n\
+ key <AE08> {\n\
+ symbols[Group1]= [ 8, asterisk ],\n\
+ symbols[Group2]= [ bracketleft, trademark ]\n\
+ };\n\
+ key <AE09> {\n\
+ symbols[Group1]= [ 9, parenleft ],\n\
+ symbols[Group2]= [ bracketright, plusminus ]\n\
+ };\n\
+ key <AE10> {\n\
+ symbols[Group1]= [ 0, parenright ],\n\
+ symbols[Group2]= [ braceright, degree ]\n\
+ };\n\
+ key <AE11> {\n\
+ symbols[Group1]= [ minus, underscore ],\n\
+ symbols[Group2]= [ backslash, questiondown ]\n\
+ };\n\
+ key <AE12> {\n\
+ symbols[Group1]= [ equal, plus ],\n\
+ symbols[Group2]= [ dead_cedilla, dead_ogonek ]\n\
+ };\n\
+ key <BKSP> { [ BackSpace ] };\n\
+ key <TAB> { [ Tab, ISO_Left_Tab ] };\n\
+ key <AD01> {\n\
+ symbols[Group1]= [ q, Q ],\n\
+ symbols[Group2]= [ at, Greek_OMEGA ]\n\
+ };\n\
+ key <AD02> {\n\
+ symbols[Group1]= [ w, W ],\n\
+ symbols[Group2]= [ lstroke, Lstroke ]\n\
+ };\n\
+ key <AD03> {\n\
+ symbols[Group1]= [ e, E ],\n\
+ symbols[Group2]= [ EuroSign ]\n\
+ };\n\
+ key <AD04> {\n\
+ symbols[Group1]= [ r, R ],\n\
+ symbols[Group2]= [ paragraph, registered ]\n\
+ };\n\
+ key <AD05> {\n\
+ symbols[Group1]= [ t, T ],\n\
+ symbols[Group2]= [ tslash, Tslash ]\n\
+ };\n\
+ key <AD06> {\n\
+ symbols[Group1]= [ y, Y ],\n\
+ symbols[Group2]= [ leftarrow, yen ]\n\
+ };\n\
+ key <AD07> {\n\
+ symbols[Group1]= [ u, U ],\n\
+ symbols[Group2]= [ downarrow, uparrow ]\n\
+ };\n\
+ key <AD08> {\n\
+ symbols[Group1]= [ i, I ],\n\
+ symbols[Group2]= [ rightarrow, idotless ]\n\
+ };\n\
+ key <AD09> {\n\
+ symbols[Group1]= [ o, O ],\n\
+ symbols[Group2]= [ oslash, Ooblique ]\n\
+ };\n\
+ key <AD10> {\n\
+ symbols[Group1]= [ p, P ],\n\
+ symbols[Group2]= [ thorn, THORN ]\n\
+ };\n\
+ key <AD11> {\n\
+ symbols[Group1]= [ bracketleft, braceleft ],\n\
+ symbols[Group2]= [ dead_diaeresis, dead_abovering ]\n\
+ };\n\
+ key <AD12> {\n\
+ symbols[Group1]= [ bracketright, braceright ],\n\
+ symbols[Group2]= [ dead_tilde, dead_macron ]\n\
+ };\n\
+ key <RTRN> { [ Return ] };\n\
+ key <LCTL> {\n\
+ symbols[Group1]= [ Control_L ],\n\
+ actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]\n\
+ };\n\
+ key <AC01> {\n\
+ symbols[Group1]= [ a, A ],\n\
+ symbols[Group2]= [ ae, AE ]\n\
+ };\n\
+ key <AC02> {\n\
+ symbols[Group1]= [ s, S ],\n\
+ symbols[Group2]= [ ssharp, section ]\n\
+ };\n\
+ key <AC03> {\n\
+ symbols[Group1]= [ d, D ],\n\
+ symbols[Group2]= [ eth, ETH ]\n\
+ };\n\
+ key <AC04> {\n\
+ symbols[Group1]= [ f, F ],\n\
+ symbols[Group2]= [ dstroke, ordfeminine ]\n\
+ };\n\
+ key <AC05> {\n\
+ symbols[Group1]= [ g, G ],\n\
+ symbols[Group2]= [ eng, ENG ]\n\
+ };\n\
+ key <AC06> {\n\
+ symbols[Group1]= [ h, H ],\n\
+ symbols[Group2]= [ hstroke, Hstroke ]\n\
+ };\n\
+ key <AC07> { [ j, J ] };\n\
+ key <AC08> {\n\
+ symbols[Group1]= [ k, K ],\n\
+ symbols[Group2]= [ kra, ampersand ]\n\
+ };\n\
+ key <AC09> {\n\
+ symbols[Group1]= [ l, L ],\n\
+ symbols[Group2]= [ lstroke, Lstroke ]\n\
+ };\n\
+ key <AC10> {\n\
+ symbols[Group1]= [ semicolon, colon ],\n\
+ symbols[Group2]= [ dead_acute, dead_doubleacute ]\n\
+ };\n\
+ key <AC11> {\n\
+ symbols[Group1]= [ apostrophe, quotedbl ],\n\
+ symbols[Group2]= [ dead_circumflex, dead_caron ]\n\
+ };\n\
+ key <TLDE> {\n\
+ symbols[Group1]= [ grave, asciitilde ],\n\
+ symbols[Group2]= [ notsign ]\n\
+ };\n\
+ key <LFSH> {\n\
+ symbols[Group1]= [ Shift_L ],\n\
+ actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]\n\
+ };\n\
+ key <BKSL> {\n\
+ symbols[Group1]= [ backslash, bar ],\n\
+ symbols[Group2]= [ dead_grave, dead_breve ]\n\
+ };\n\
+ key <AB01> {\n\
+ symbols[Group1]= [ z, Z ],\n\
+ symbols[Group2]= [ guillemotleft, less ]\n\
+ };\n\
+ key <AB02> {\n\
+ symbols[Group1]= [ x, X ],\n\
+ symbols[Group2]= [ guillemotright, greater ]\n\
+ };\n\
+ key <AB03> {\n\
+ symbols[Group1]= [ c, C ],\n\
+ symbols[Group2]= [ cent, copyright ]\n\
+ };\n\
+ key <AB04> {\n\
+ symbols[Group1]= [ v, V ],\n\
+ symbols[Group2]= [ leftdoublequotemark, grave ]\n\
+ };\n\
+ key <AB05> {\n\
+ symbols[Group1]= [ b, B ],\n\
+ symbols[Group2]= [ rightdoublequotemark, apostrophe ]\n\
+ };\n\
+ key <AB06> { [ n, N ] };\n\
+ key <AB07> {\n\
+ symbols[Group1]= [ m, M ],\n\
+ symbols[Group2]= [ mu, masculine ]\n\
+ };\n\
+ key <AB08> {\n\
+ symbols[Group1]= [ comma, less ],\n\
+ symbols[Group2]= [ horizconnector, multiply ]\n\
+ };\n\
+ key <AB09> {\n\
+ symbols[Group1]= [ period, greater ],\n\
+ symbols[Group2]= [ periodcentered, division ]\n\
+ };\n\
+ key <AB10> {\n\
+ symbols[Group1]= [ slash, question ],\n\
+ symbols[Group2]= [ dead_belowdot, dead_abovedot ]\n\
+ };\n\
+ key <RTSH> {\n\
+ symbols[Group1]= [ Shift_R ],\n\
+ actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]\n\
+ };\n\
+ key <KPMU> {\n\
+ symbols[Group1]= [ KP_Multiply ],\n\
+ actions[Group1]= [ SetPtrDflt(affect=button,button=2) ]\n\
+ };\n\
+ key <LALT> {\n\
+ symbols[Group1]= [ Alt_L, Meta_L ],\n\
+ actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks), SetMods(modifiers=modMapMods,clearLocks) ]\n\
+ };\n\
+ key <SPCE> { [ space ] };\n\
+ key <CAPS> {\n\
+ symbols[Group1]= [ Caps_Lock ],\n\
+ actions[Group1]= [ LockMods(modifiers=Lock) ]\n\
+ };\n\
+ key <FK01> { [ F1 ] };\n\
+ key <FK02> { [ F2 ] };\n\
+ key <FK03> { [ F3 ] };\n\
+ key <FK04> { [ F4 ] };\n\
+ key <FK05> { [ F5 ] };\n\
+ key <FK06> { [ F6 ] };\n\
+ key <FK07> { [ F7 ] };\n\
+ key <FK08> { [ F8 ] };\n\
+ key <FK09> { [ F9 ] };\n\
+ key <FK10> { [ F10 ] };\n\
+ key <NMLK> {\n\
+ symbols[Group1]= [ Num_Lock, Pointer_EnableKeys ],\n\
+ actions[Group1]= [ LockMods(modifiers=NumLock), LockControls(controls=MouseKeys) ]\n\
+ };\n\
+ key <SCLK> {\n\
+ symbols[Group1]= [ Scroll_Lock ],\n\
+ actions[Group1]= [ LockMods(modifiers=modMapMods) ]\n\
+ };\n\
+ key <KP7> {\n\
+ symbols[Group1]= [ KP_Home, KP_7 ],\n\
+ actions[Group1]= [ MovePtr(x=-1,y=-1), MovePtr(x=-1,y=-1) ]\n\
+ };\n\
+ key <KP8> {\n\
+ symbols[Group1]= [ KP_Up, KP_8 ],\n\
+ actions[Group1]= [ MovePtr(x=+0,y=-1), MovePtr(x=+0,y=-1) ]\n\
+ };\n\
+ key <KP9> {\n\
+ symbols[Group1]= [ KP_Prior, KP_9 ],\n\
+ actions[Group1]= [ MovePtr(x=+1,y=-1), MovePtr(x=+1,y=-1) ]\n\
+ };\n\
+ key <KPSU> {\n\
+ symbols[Group1]= [ KP_Subtract ],\n\
+ actions[Group1]= [ SetPtrDflt(affect=button,button=3) ]\n\
+ };\n\
+ key <KP4> {\n\
+ symbols[Group1]= [ KP_Left, KP_4 ],\n\
+ actions[Group1]= [ MovePtr(x=-1,y=+0), MovePtr(x=-1,y=+0) ]\n\
+ };\n\
+ key <KP5> {\n\
+ symbols[Group1]= [ KP_Begin, KP_5 ],\n\
+ actions[Group1]= [ PtrBtn(button=default), PtrBtn(button=default) ]\n\
+ };\n\
+ key <KP6> {\n\
+ symbols[Group1]= [ KP_Right, KP_6 ],\n\
+ actions[Group1]= [ MovePtr(x=+1,y=+0), MovePtr(x=+1,y=+0) ]\n\
+ };\n\
+ key <KPAD> {\n\
+ symbols[Group1]= [ KP_Add ],\n\
+ actions[Group1]= [ PtrBtn(button=default,count=2) ]\n\
+ };\n\
+ key <KP1> {\n\
+ symbols[Group1]= [ KP_End, KP_1 ],\n\
+ actions[Group1]= [ MovePtr(x=-1,y=+1), MovePtr(x=-1,y=+1) ]\n\
+ };\n\
+ key <KP2> {\n\
+ symbols[Group1]= [ KP_Down, KP_2 ],\n\
+ actions[Group1]= [ MovePtr(x=+0,y=+1), MovePtr(x=+0,y=+1) ]\n\
+ };\n\
+ key <KP3> {\n\
+ symbols[Group1]= [ KP_Next, KP_3 ],\n\
+ actions[Group1]= [ MovePtr(x=+1,y=+1), MovePtr(x=+1,y=+1) ]\n\
+ };\n\
+ key <KP0> {\n\
+ symbols[Group1]= [ KP_Insert, KP_0 ],\n\
+ actions[Group1]= [ LockPtrBtn(button=default,affect=lock), LockPtrBtn(button=default,affect=lock) ]\n\
+ };\n\
+ key <KPDL> {\n\
+ symbols[Group1]= [ KP_Delete, KP_Decimal ],\n\
+ actions[Group1]= [ LockPtrBtn(button=default,affect=unlock), LockPtrBtn(button=default,affect=unlock) ]\n\
+ };\n\
+ key <SYRQ> {\n\
+ type= \"PC_SYSRQ\",\n\
+ symbols[Group1]= [ Print, Sys_Req ]\n\
+ };\n\
+ key <FK11> { [ F11 ] };\n\
+ key <FK12> { [ F12 ] };\n\
+ key <HOME> { [ Home ] };\n\
+ key <UP> { [ Up ] };\n\
+ key <PGUP> { [ Prior ] };\n\
+ key <LEFT> { [ Left ] };\n\
+ key <RGHT> { [ Right ] };\n\
+ key <END> { [ End ] };\n\
+ key <DOWN> { [ Down ] };\n\
+ key <PGDN> { [ Next ] };\n\
+ key <INS> { [ Insert ] };\n\
+ key <DELE> { [ Delete ] };\n\
+ key <KPEN> { [ KP_Enter ] };\n\
+ key <RCTL> {\n\
+ symbols[Group1]= [ Control_R ],\n\
+ actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]\n\
+ };\n\
+ key <PAUS> {\n\
+ type= \"PC_BREAK\",\n\
+ symbols[Group1]= [ Pause, Break ]\n\
+ };\n\
+ key <PRSC> {\n\
+ type= \"PC_SYSRQ\",\n\
+ symbols[Group1]= [ Print, Sys_Req ]\n\
+ };\n\
+ key <KPDV> {\n\
+ symbols[Group1]= [ KP_Divide ],\n\
+ actions[Group1]= [ SetPtrDflt(affect=button,button=1) ]\n\
+ };\n\
+ key <RALT> {\n\
+ symbols[Group1]= [ Mode_switch ],\n\
+ actions[Group1]= [ SetGroup(group=+1) ]\n\
+ };\n\
+ key <BRK> {\n\
+ type= \"PC_BREAK\",\n\
+ symbols[Group1]= [ Pause, Break ]\n\
+ };\n\
+ key <LWIN> {\n\
+ symbols[Group1]= [ Super_L ],\n\
+ actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]\n\
+ };\n\
+ key <RWIN> { [ Multi_key ] };\n\
+ key <MENU> { [ Menu ] };\n\
+ modifier_map Control { <LCTL> };\n\
+ modifier_map Shift { <LFSH> };\n\
+ modifier_map Shift { <RTSH> };\n\
+ modifier_map Mod1 { <LALT> };\n\
+ modifier_map Lock { <CAPS> };\n\
+ modifier_map Mod2 { <NMLK> };\n\
+ modifier_map Mod5 { <SCLK> };\n\
+ modifier_map Control { <RCTL> };\n\
+ modifier_map Mod3 { <RALT> };\n\
+ modifier_map Mod4 { <LWIN> };\n\
+};\n\
+\n\
+xkb_geometry \"pc(pc104)\" {\n\
+\n\
+ width= 470;\n\
+ height= 210;\n\
+\n\
+ alias <AC00> = <CAPS>;\n\
+ alias <AA00> = <LCTL>;\n\
+\n\
+ baseColor= \"white\";\n\
+ labelColor= \"black\";\n\
+ xfont= \"-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1\";\n\
+ description= \"Generic 104\";\n\
+\n\
+ shape \"NORM\" {\n\
+ corner= 1,\n\
+ { [ 18, 18 ] },\n\
+ { [ 2, 1 ], [ 16, 16 ] }\n\
+ };\n\
+ shape \"BKSP\" {\n\
+ corner= 1,\n\
+ { [ 38, 18 ] },\n\
+ { [ 2, 1 ], [ 36, 16 ] }\n\
+ };\n\
+ shape \"TABK\" {\n\
+ corner= 1,\n\
+ { [ 28, 18 ] },\n\
+ { [ 2, 1 ], [ 26, 16 ] }\n\
+ };\n\
+ shape \"BKSL\" {\n\
+ corner= 1,\n\
+ { [ 28, 18 ] },\n\
+ { [ 2, 1 ], [ 26, 16 ] }\n\
+ };\n\
+ shape \"RTRN\" {\n\
+ corner= 1,\n\
+ { [ 42, 18 ] },\n\
+ { [ 2, 1 ], [ 40, 16 ] }\n\
+ };\n\
+ shape \"CAPS\" {\n\
+ corner= 1,\n\
+ { [ 33, 18 ] },\n\
+ { [ 2, 1 ], [ 31, 16 ] }\n\
+ };\n\
+ shape \"LFSH\" {\n\
+ corner= 1,\n\
+ { [ 42, 18 ] },\n\
+ { [ 2, 1 ], [ 40, 16 ] }\n\
+ };\n\
+ shape \"RTSH\" {\n\
+ corner= 1,\n\
+ { [ 52, 18 ] },\n\
+ { [ 2, 1 ], [ 50, 16 ] }\n\
+ };\n\
+ shape \"MODK\" {\n\
+ corner= 1,\n\
+ { [ 27, 18 ] },\n\
+ { [ 2, 1 ], [ 25, 16 ] }\n\
+ };\n\
+ shape \"SMOD\" {\n\
+ corner= 1,\n\
+ { [ 23, 18 ] },\n\
+ { [ 2, 1 ], [ 21, 16 ] }\n\
+ };\n\
+ shape \"SPCE\" {\n\
+ corner= 1,\n\
+ { [ 113, 18 ] },\n\
+ { [ 2, 1 ], [ 111, 16 ] }\n\
+ };\n\
+ shape \"KP0\" {\n\
+ corner= 1,\n\
+ { [ 37, 18 ] },\n\
+ { [ 2, 1 ], [ 35, 16 ] }\n\
+ };\n\
+ shape \"KPAD\" {\n\
+ corner= 1,\n\
+ { [ 18, 37 ] },\n\
+ { [ 2, 1 ], [ 16, 35 ] }\n\
+ };\n\
+ shape \"LEDS\" { { [ 75, 20 ] } };\n\
+ shape \"LED\" { { [ 5, 1 ] } };\n\
+ section \"Function\" {\n\
+ key.color= \"grey20\";\n\
+ priority= 7;\n\
+ top= 52;\n\
+ left= 19;\n\
+ width= 351;\n\
+ height= 19;\n\
+ row {\n\
+ top= 1;\n\
+ left= 1;\n\
+ keys {\n\
+ { <ESC>, \"NORM\", 1 },\n\
+ { <FK01>, \"NORM\", 20, color=\"white\" },\n\
+ { <FK02>, \"NORM\", 1, color=\"white\" },\n\
+ { <FK03>, \"NORM\", 1, color=\"white\" },\n\
+ { <FK04>, \"NORM\", 1, color=\"white\" },\n\
+ { <FK05>, \"NORM\", 11, color=\"white\" },\n\
+ { <FK06>, \"NORM\", 1, color=\"white\" },\n\
+ { <FK07>, \"NORM\", 1, color=\"white\" },\n\
+ { <FK08>, \"NORM\", 1, color=\"white\" },\n\
+ { <FK09>, \"NORM\", 11, color=\"white\" },\n\
+ { <FK10>, \"NORM\", 1, color=\"white\" },\n\
+ { <FK11>, \"NORM\", 1, color=\"white\" },\n\
+ { <FK12>, \"NORM\", 1, color=\"white\" },\n\
+ { <PRSC>, \"NORM\", 8, color=\"white\" },\n\
+ { <SCLK>, \"NORM\", 1, color=\"white\" },\n\
+ { <PAUS>, \"NORM\", 1, color=\"white\" }\n\
+ };\n\
+ };\n\
+ }; // End of \"Function\" section\n\
+\n\
+ section \"Alpha\" {\n\
+ key.color= \"white\";\n\
+ priority= 8;\n\
+ top= 91;\n\
+ left= 19;\n\
+ width= 287;\n\
+ height= 95;\n\
+ row {\n\
+ top= 1;\n\
+ left= 1;\n\
+ keys {\n\
+ { <TLDE>, \"NORM\", 1 }, { <AE01>, \"NORM\", 1 },\n\
+ { <AE02>, \"NORM\", 1 }, { <AE03>, \"NORM\", 1 },\n\
+ { <AE04>, \"NORM\", 1 }, { <AE05>, \"NORM\", 1 },\n\
+ { <AE06>, \"NORM\", 1 }, { <AE07>, \"NORM\", 1 },\n\
+ { <AE08>, \"NORM\", 1 }, { <AE09>, \"NORM\", 1 },\n\
+ { <AE10>, \"NORM\", 1 }, { <AE11>, \"NORM\", 1 },\n\
+ { <AE12>, \"NORM\", 1 },\n\
+ { <BKSP>, \"BKSP\", 1, color=\"grey20\" }\n\
+ };\n\
+ };\n\
+ row {\n\
+ top= 20;\n\
+ left= 1;\n\
+ keys {\n\
+ { <TAB>, \"TABK\", 1, color=\"grey20\" },\n\
+ { <AD01>, \"NORM\", 1 }, { <AD02>, \"NORM\", 1 },\n\
+ { <AD03>, \"NORM\", 1 }, { <AD04>, \"NORM\", 1 },\n\
+ { <AD05>, \"NORM\", 1 }, { <AD06>, \"NORM\", 1 },\n\
+ { <AD07>, \"NORM\", 1 }, { <AD08>, \"NORM\", 1 },\n\
+ { <AD09>, \"NORM\", 1 }, { <AD10>, \"NORM\", 1 },\n\
+ { <AD11>, \"NORM\", 1 }, { <AD12>, \"NORM\", 1 },\n\
+ { <BKSL>, \"BKSL\", 1 }\n\
+ };\n\
+ };\n\
+ row {\n\
+ top= 39;\n\
+ left= 1;\n\
+ keys {\n\
+ { <CAPS>, \"CAPS\", 1, color=\"grey20\" },\n\
+ { <AC01>, \"NORM\", 1 }, { <AC02>, \"NORM\", 1 },\n\
+ { <AC03>, \"NORM\", 1 }, { <AC04>, \"NORM\", 1 },\n\
+ { <AC05>, \"NORM\", 1 }, { <AC06>, \"NORM\", 1 },\n\
+ { <AC07>, \"NORM\", 1 }, { <AC08>, \"NORM\", 1 },\n\
+ { <AC09>, \"NORM\", 1 }, { <AC10>, \"NORM\", 1 },\n\
+ { <AC11>, \"NORM\", 1 },\n\
+ { <RTRN>, \"RTRN\", 1, color=\"grey20\" }\n\
+ };\n\
+ };\n\
+ row {\n\
+ top= 58;\n\
+ left= 1;\n\
+ keys {\n\
+ { <LFSH>, \"LFSH\", 1, color=\"grey20\" },\n\
+ { <AB01>, \"NORM\", 1 }, { <AB02>, \"NORM\", 1 },\n\
+ { <AB03>, \"NORM\", 1 }, { <AB04>, \"NORM\", 1 },\n\
+ { <AB05>, \"NORM\", 1 }, { <AB06>, \"NORM\", 1 },\n\
+ { <AB07>, \"NORM\", 1 }, { <AB08>, \"NORM\", 1 },\n\
+ { <AB09>, \"NORM\", 1 }, { <AB10>, \"NORM\", 1 },\n\
+ { <RTSH>, \"RTSH\", 1, color=\"grey20\" }\n\
+ };\n\
+ };\n\
+ row {\n\
+ top= 77;\n\
+ left= 1;\n\
+ keys {\n\
+ { <LCTL>, \"MODK\", 1, color=\"grey20\" },\n\
+ { <LWIN>, \"SMOD\", 1, color=\"grey20\" },\n\
+ { <LALT>, \"SMOD\", 1, color=\"grey20\" },\n\
+ { <SPCE>, \"SPCE\", 1 },\n\
+ { <RALT>, \"SMOD\", 1, color=\"grey20\" },\n\
+ { <RWIN>, \"SMOD\", 1, color=\"grey20\" },\n\
+ { <MENU>, \"SMOD\", 1, color=\"grey20\" },\n\
+ { <RCTL>, \"SMOD\", 1, color=\"grey20\" }\n\
+ };\n\
+ };\n\
+ }; // End of \"Alpha\" section\n\
+\n\
+ section \"Editing\" {\n\
+ key.color= \"grey20\";\n\
+ priority= 9;\n\
+ top= 91;\n\
+ left= 312;\n\
+ width= 58;\n\
+ height= 95;\n\
+ row {\n\
+ top= 1;\n\
+ left= 1;\n\
+ keys {\n\
+ { <INS>, \"NORM\", 1 }, { <HOME>, \"NORM\", 1 },\n\
+ { <PGUP>, \"NORM\", 1 }\n\
+ };\n\
+ };\n\
+ row {\n\
+ top= 20;\n\
+ left= 1;\n\
+ keys {\n\
+ { <DELE>, \"NORM\", 1 }, { <END>, \"NORM\", 1 },\n\
+ { <PGDN>, \"NORM\", 1 }\n\
+ };\n\
+ };\n\
+ row {\n\
+ top= 58;\n\
+ left= 20;\n\
+ keys {\n\
+ { <UP>, \"NORM\", 1 }\n\
+ };\n\
+ };\n\
+ row {\n\
+ top= 77;\n\
+ left= 1;\n\
+ keys {\n\
+ { <LEFT>, \"NORM\", 1 }, { <DOWN>, \"NORM\", 1 },\n\
+ { <RGHT>, \"NORM\", 1 }\n\
+ };\n\
+ };\n\
+ }; // End of \"Editing\" section\n\
+\n\
+ section \"Keypad\" {\n\
+ key.color= \"grey20\";\n\
+ priority= 10;\n\
+ top= 91;\n\
+ left= 376;\n\
+ width= 77;\n\
+ height= 95;\n\
+ row {\n\
+ top= 1;\n\
+ left= 1;\n\
+ keys {\n\
+ { <NMLK>, \"NORM\", 1 }, { <KPDV>, \"NORM\", 1 },\n\
+ { <KPMU>, \"NORM\", 1 }, { <KPSU>, \"NORM\", 1 }\n\
+ };\n\
+ };\n\
+ row {\n\
+ top= 20;\n\
+ left= 1;\n\
+ keys {\n\
+ { <KP7>, \"NORM\", 1, color=\"white\" },\n\
+ { <KP8>, \"NORM\", 1, color=\"white\" },\n\
+ { <KP9>, \"NORM\", 1, color=\"white\" },\n\
+ { <KPAD>, \"KPAD\", 1 }\n\
+ };\n\
+ };\n\
+ row {\n\
+ top= 39;\n\
+ left= 1;\n\
+ keys {\n\
+ { <KP4>, \"NORM\", 1, color=\"white\" },\n\
+ { <KP5>, \"NORM\", 1, color=\"white\" },\n\
+ { <KP6>, \"NORM\", 1, color=\"white\" }\n\
+ };\n\
+ };\n\
+ row {\n\
+ top= 58;\n\
+ left= 1;\n\
+ keys {\n\
+ { <KP1>, \"NORM\", 1, color=\"white\" },\n\
+ { <KP2>, \"NORM\", 1, color=\"white\" },\n\
+ { <KP3>, \"NORM\", 1, color=\"white\" },\n\
+ { <KPEN>, \"KPAD\", 1 }\n\
+ };\n\
+ };\n\
+ row {\n\
+ top= 77;\n\
+ left= 1;\n\
+ keys {\n\
+ { <KP0>, \"KP0\", 1, color=\"white\" },\n\
+ { <KPDL>, \"NORM\", 1, color=\"white\" }\n\
+ };\n\
+ };\n\
+ }; // End of \"Keypad\" section\n\
+\n\
+ solid \"LedPanel\" {\n\
+ top= 52;\n\
+ left= 377;\n\
+ priority= 0;\n\
+ color= \"grey10\";\n\
+ shape= \"LEDS\";\n\
+ };\n\
+ indicator \"NumLock\" {\n\
+ top= 67;\n\
+ left= 382;\n\
+ priority= 1;\n\
+ onColor= \"green\";\n\
+ offColor= \"green30\";\n\
+ shape= \"LED\";\n\
+ };\n\
+ indicator \"CapsLock\" {\n\
+ top= 67;\n\
+ left= 407;\n\
+ priority= 2;\n\
+ onColor= \"green\";\n\
+ offColor= \"green30\";\n\
+ shape= \"LED\";\n\
+ };\n\
+ indicator \"ScrollLock\" {\n\
+ top= 67;\n\
+ left= 433;\n\
+ priority= 3;\n\
+ onColor= \"green\";\n\
+ offColor= \"green30\";\n\
+ shape= \"LED\";\n\
+ };\n\
+ text \"NumLockLabel\" {\n\
+ top= 55;\n\
+ left= 378;\n\
+ priority= 4;\n\
+ width= 19.8;\n\
+ height= 10;\n\
+ XFont= \"-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1\";\n\
+ text= \"Num\\nLock\";\n\
+ };\n\
+ text \"CapsLockLabel\" {\n\
+ top= 55;\n\
+ left= 403;\n\
+ priority= 5;\n\
+ width= 26.4;\n\
+ height= 10;\n\
+ XFont= \"-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1\";\n\
+ text= \"Caps\\nLock\";\n\
+ };\n\
+ text \"ScrollLockLabel\" {\n\
+ top= 55;\n\
+ left= 428;\n\
+ priority= 6;\n\
+ width= 39.6;\n\
+ height= 10;\n\
+ XFont= \"-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1\";\n\
+ text= \"Scroll\\nLock\";\n\
+ };\n\
+};\n\
+\n\
+};\n\
+\0";
diff --git a/console-client/xkb/xkbtimer.c b/console-client/xkb/xkbtimer.c
new file mode 100644
index 00000000..f50bb9ad
--- /dev/null
+++ b/console-client/xkb/xkbtimer.c
@@ -0,0 +1,236 @@
+/* xkbtimer.c -- Manage XKB timers.
+
+ Copyright (C) 2003, 2004 Marco Gerards
+
+ Written by Marco Gerards <marco@student.han.nl>
+
+ 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. */
+
+/* XKB requires a timer for key repeat and accessibility. Carefully
+ stack all compatibility features. */
+
+#include <mach.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "xkb.h"
+#include "timer.h"
+
+/* Lock the access to handle_key. */
+static struct mutex *lock_key;
+
+/* Timer used to time key controls. */
+//static struct timer_list key_timer;
+
+/* For key repeat. */
+static int key_delay = 0;
+static int key_repeat = 0;
+
+/* SlowKeys. */
+static int slowkeys_delay = 50;
+static int slowkeys_active = 0;
+
+/* BounceKeys. */
+static int bouncekeys_delay = 100;
+static int bouncekeys_active = 0;
+
+/* The current status of the timer. */
+enum timer_status
+ {
+ timer_stopped,
+ timer_slowkeys,
+ timer_repeat_delay,
+ timer_repeating
+ };
+
+static struct per_key_timer
+{
+ /* Used for slowkeys and repeat. */
+ struct timer_list enable_timer;
+
+ /* Status of the enable timer. */
+ enum timer_status enable_status;
+
+ /* Used for bouncekeys. */
+ struct timer_list disable_timer;
+} per_key_timers[255];
+
+/* The last pressed key. Only this key may generate keyrepeat events. */
+static int lastkey = 0;
+
+error_t
+xkb_handle_key (keycode_t kc)
+{
+ static keycode_t prevkc = 0;
+ keypress_t key;
+
+ key.keycode = kc & 127;
+ key.prevkc = prevkc;
+ key.repeat = (prevkc == kc);
+ key.redir = 0;
+ key.rel = kc & 128;
+ keystate[key.keycode & 127].keypressed = key.rel ? 0 : 1;
+ debug_printf ("PRESSED: %d\n", !(key.rel));
+ xkb_input (key);
+ prevkc = key.keycode;
+ return 0;
+}
+
+error_t
+xkb_init_repeat (int delay, int repeat)
+{
+ error_t err;
+ err = timer_init ();
+ if (err)
+ return err;
+
+ key_delay = delay;
+ key_repeat = repeat;
+
+ return 0;
+}
+
+static int
+key_enable (void *handle)
+{
+ int key = (int) handle;
+
+ /* Enable the key. */
+ keystate[key].disabled = 0;
+
+ return 0;
+}
+
+/* Called by key timer. The global variable timer_status determines
+ the current control. */
+static int
+key_timing (void *handle)
+{
+ int current_key = (int) handle;
+
+ xkb_handle_key (current_key);
+
+ /* Another key was pressed after this key, stop repeating. */
+ if (lastkey != current_key)
+ {
+ per_key_timers[current_key].enable_status = timer_stopped;
+ return 0;
+ }
+
+ switch (per_key_timers[current_key].enable_status)
+ {
+ case timer_stopped:
+ assert ("Stopped timer triggered timer event\n");
+ break;
+ case timer_slowkeys:
+ per_key_timers[current_key].enable_timer.expires
+ = fetch_jiffies () + key_delay;
+ lastkey = current_key;
+
+ if (keys[current_key].flags & KEYNOREPEAT)
+ {
+ per_key_timers[current_key].enable_status = timer_stopped;
+ /* Stop the timer. */
+ return 0;
+ }
+ else
+ {
+ per_key_timers[current_key].enable_status = timer_repeat_delay;
+ }
+ break;
+ case timer_repeat_delay:
+ per_key_timers[current_key].enable_status = timer_repeating;
+ /* Fall through. */
+ case timer_repeating:
+ per_key_timers[current_key].enable_timer.expires
+ = fetch_jiffies () + key_repeat;
+ break;
+ }
+ return 1;
+}
+
+error_t
+xkb_input_key (int key)
+{
+ int pressed = !(key & 128);
+ int keyc = key & 127;
+
+ debug_printf ("KEYIN: %d\n", key);
+
+ /* Filter out any double or disabled keys. */
+ if (key == lastkey || keystate[keyc].disabled)
+ return 0;
+
+ /* Always handle keyrelease events. */
+ if (!pressed)
+ {
+ /* Stop the timer for this released key. */
+ if (per_key_timers[keyc].enable_status != timer_stopped)
+ {
+ timer_remove (&per_key_timers[keyc].enable_timer);
+ per_key_timers[keyc].enable_status = timer_stopped;
+ }
+
+ /* No more last key; it was released. */
+ if (keyc == lastkey)
+ lastkey = 0;
+
+ /* Make sure the key was pressed before releasing it, it might
+ not have been accepted. */
+ if (keystate[key & 127].keypressed)
+ xkb_handle_key (key);
+
+ /* If bouncekeys is active, disable the key. */
+ if (bouncekeys_active)
+ {
+ keystate[keyc].disabled = 1;
+
+ /* Setup a timer to enable the key. */
+ timer_clear (&per_key_timers[keyc].disable_timer);
+ per_key_timers[keyc].disable_timer.fnc = key_enable;
+ per_key_timers[keyc].disable_timer.fnc_data = (void *) keyc;
+ per_key_timers[keyc].disable_timer.expires
+ = fetch_jiffies () + bouncekeys_delay;
+ timer_add (&per_key_timers[keyc].disable_timer);
+ }
+
+ return 0;
+ }
+
+ /* Setup the timer for slowkeys. */
+ timer_clear (&per_key_timers[keyc].enable_timer);
+ lastkey = keyc;
+ per_key_timers[keyc].enable_timer.fnc = key_timing;
+ per_key_timers[keyc].enable_timer.fnc_data = (void *) keyc;
+
+ if (slowkeys_active)
+ {
+ per_key_timers[keyc].enable_status = timer_slowkeys;
+ per_key_timers[keyc].enable_timer.expires
+ = fetch_jiffies () + slowkeys_delay;
+ }
+ else
+ {
+ /* Immediatly report the keypress. */
+ xkb_handle_key (keyc);
+
+ /* Check if this repeat is allowed for this keycode. */
+ if (keys[keyc].flags & KEYNOREPEAT)
+ return 0; /* Nope. */
+
+ per_key_timers[keyc].enable_status = timer_repeat_delay;
+ per_key_timers[keyc].enable_timer.expires
+ = fetch_jiffies () + key_delay;
+ }
+ timer_add (&per_key_timers[keyc].enable_timer);
+
+ return 0;
+}