]> git.proxmox.com Git - spiceterm.git/commitdiff
use kvm keymap files
authorDietmar Maurer <dietmar@proxmox.com>
Tue, 29 Oct 2013 08:39:30 +0000 (09:39 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Tue, 29 Oct 2013 08:45:21 +0000 (09:45 +0100)
Makefile
genkeysym.pl [new file with mode: 0755]
input.c
keysyms.h [new file with mode: 0644]
spiceterm.c
spiceterm.h

index 128a8c59c361b8e2edef1426e2a6bcad24adade1..47d39a597c5aea96f170560e924e56bfd308e75f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 
 PROGRAMS=spiceterm
 
-HEADERS=translations.h event_loop.h glyphs.h spiceterm.h
+HEADERS=translations.h event_loop.h glyphs.h spiceterm.h keysyms.h
 SOURCES=screen.c event_loop.c input.c spiceterm.c auth-pve.c
 
 #export G_MESSAGES_DEBUG=all 
@@ -10,12 +10,15 @@ SOURCES=screen.c event_loop.c input.c spiceterm.c auth-pve.c
 all: ${PROGRAMS}
 
 spiceterm: ${SOURCES} ${HEADERS} spiceterm.c 
-       gcc -Werror -Wall -Wtype-limits ${SOURCES} -g -O2 -o $@ -lutil $(shell pkg-config --cflags gdk-3.0) $(shell pkg-config --cflags --libs gthread-2.0,spice-protocol,spice-server)
+       gcc -Werror -Wall -Wtype-limits ${SOURCES} -g -O2 -o $@ -lutil $(shell pkg-config --cflags gdk-3.0) $(shell pkg-config --cflags --libs gthread-2.0,spice-protocol,spice-server,gdk-3.0)
+
+keysyms.h: genkeysym.pl
+       ./genkeysym.pl >$@
 
 .PHONY: test
 test: spiceterm
-       #./spiceterm & remote-viewer spice://localhost:5900
-       G_MESSAGES_DEBUG=all SPICE_DEBUG=1 SPICE_TICKET=test ./spiceterm & G_MESSAGES_DEBUG=all SPICE_DEBUG=1 remote-viewer --debug 'spice://localhost?tls-port=5900' --spice-ca-file /etc/pve/pve-root-ca.pem --spice-secure-channels=all
+       ./spiceterm --noauth --keymap de & remote-viewer spice://localhost?tls-port=5900
+       #G_MESSAGES_DEBUG=all SPICE_DEBUG=1 SPICE_TICKET=test ./spiceterm & G_MESSAGES_DEBUG=all SPICE_DEBUG=1 remote-viewer --debug 'spice://localhost?tls-port=5900' --spice-ca-file /etc/pve/pve-root-ca.pem --spice-secure-channels=all
 
 .PHONY: distclean
 distclean: clean
diff --git a/genkeysym.pl b/genkeysym.pl
new file mode 100755 (executable)
index 0000000..cdccf3c
--- /dev/null
@@ -0,0 +1,62 @@
+#!/usr/bin/perl 
+
+use strict;
+use warnings;
+
+
+my $header = "/usr/include/X11/keysymdef.h";
+
+print <<__EOD;
+typedef struct {
+       const char* name;
+       int keysym;
+       int unicode;
+} name2keysym_t;
+
+static const name2keysym_t name2keysym[] = {
+__EOD
+
+open(TMP, "<$header");
+while (defined(my $line = <TMP>)) {
+    next if $line !~ m/\#define /;
+    my @ea = split(/\s+/, $line, 4);
+
+    next if $ea[1] !~ m/^XK_(\S+)$/;
+    my $name = $1;
+    
+    next if $ea[2] !~ m/^0x([A-Za-z0-9]+)$/;
+    my $keysym = hex($ea[2]);
+
+    my $unicode = 0;
+    if ($ea[3] && $ea[3] =~ m/\/\* U\+([0-9A-Fa-f]{4,6}) /) {
+       $unicode = hex($1);
+    }
+
+    if (!$unicode) {
+       # Latin-1 characters (1:1 mapping)
+       if (($keysym >= 0x0020 && $keysym <= 0x007e) ||
+           ($keysym >= 0x00a0 && $keysym <= 0x00ff)) {
+           $unicode = $keysym;
+       } elsif (($keysym & 0xff000000) == 0x01000000) { 
+           # directly encoded 24-bit UCS characters */
+           $unicode = $keysym & 0x00ffffff;
+       } elsif ($keysym >= 0x0ff08 && $keysym <= 0x0ff1b) {
+           # tty BS, LF, RETURN, Delete
+           $unicode = $keysym - 0x0ff00;
+       } elsif ($keysym >= 0x0ffaa && $keysym <= 0x0ffaf) {
+           # keypad +*-/
+           $unicode = $keysym - 0x0ff80;
+       } elsif ($keysym >= 0x0ffb0 && $keysym <= 0x0ffb9) {
+           # keypad 01234...
+           $unicode = $keysym - 0x0ff80;
+       }
+    }
+
+    printf("    { \"%s\", 0x%03x,  0x%04x },\n", $name, $keysym, $unicode);
+}
+
+printf("    { NULL, 0x%03x,  0x%04x },\n", 0, 0);
+
+print <<__EOD;
+};
+__EOD
diff --git a/input.c b/input.c
index fdd6cfe473685b707b68125c96fad3413221cdfd..48f25760de8a1cb752069ddb10c9402f3c8920b3 100644 (file)
--- a/input.c
+++ b/input.c
 #include <unistd.h>
 #include <sys/types.h>
 #include <string.h>
+#include <errno.h>
 
 #include "spiceterm.h"
+#include "keysyms.h"
 
 #include <glib.h>
 #include <spice.h>
@@ -53,13 +55,42 @@ my_kbd_get_leds(SpiceKbdInstance *sin)
     return 0;
 }
 
+#define MOD_MASK_SHIFT (1<<0)
+#define MOD_MASK_ALTGR (1<<1)
+#define MOD_MASK_NUMLOCK (1<<2)
+
+
+typedef struct keymap_entry {
+    gint hkey; //(mask << 8 || keycode)
+    guint8 mask; // MOD_MASK_*
+    guint8 keycode;
+    guint keysym;
+    guint unicode;
+} keymap_entry;
+
+static GHashTable *keymap = NULL;
+
 #define KBD_MOD_CONTROL_L_FLAG (1<<0)
 #define KBD_MOD_CONTROL_R_FLAG (1<<1)
 #define KBD_MOD_SHIFT_L_FLAG (1<<2)
 #define KBD_MOD_SHIFT_R_FLAG (1<<3)
+#define KBD_MOD_ALTGR_FLAG (1<<4)
+#define KBD_MOD_NUMLOCK (1<<5)
+#define KBD_MOD_SHIFTLOCK (1<<6)
 
 static int kbd_flags = 0;
 
+static const name2keysym_t * 
+lookup_keysym(const char *name)
+{
+    const name2keysym_t *p;
+    for(p = name2keysym; p->name != NULL; p++) {
+        if (!strcmp(p->name, name))
+            return p;
+    }
+    return NULL;
+}
+
 static void
 my_kbd_push_key(SpiceKbdInstance *sin, uint8_t frag)
 {
@@ -70,7 +101,7 @@ my_kbd_push_key(SpiceKbdInstance *sin, uint8_t frag)
     static int e0_mode = 0;
 
     DPRINTF(1, "enter frag=%02x flags=%08x", frag, kbd_flags);
-
+    
     if (e0_mode) {
         e0_mode = 0;
         switch (frag) {
@@ -80,6 +111,12 @@ my_kbd_push_key(SpiceKbdInstance *sin, uint8_t frag)
         case  0x9d: // release Control_R
             kbd_flags &= ~KBD_MOD_CONTROL_R_FLAG;
             break;
+        case 0x38: // press ALTGR
+            kbd_flags |= KBD_MOD_ALTGR_FLAG;
+            break;
+        case  0xb8: // release ALTGR
+            kbd_flags &= ~KBD_MOD_ALTGR_FLAG;
+            break;
         case 0x47: // press Home
             esc = "OH";
             break;
@@ -101,6 +138,9 @@ my_kbd_push_key(SpiceKbdInstance *sin, uint8_t frag)
         case 0x52: // press INSERT
             esc = "[2~";
             break;
+        case 0x53: // press Delete
+            esc = "[3~";
+            break;
         case 0x49: // press PAGE_UP
             if (kbd_flags & (KBD_MOD_SHIFT_L_FLAG|KBD_MOD_SHIFT_R_FLAG)) {
                 spiceterm_virtual_scroll(vt, -vt->height/2);
@@ -136,28 +176,50 @@ my_kbd_push_key(SpiceKbdInstance *sin, uint8_t frag)
             kbd_flags &= ~KBD_MOD_SHIFT_R_FLAG;
             break;
         case 0x52: // press KP_INSERT
-            esc = "[2~";
+            if (!(kbd_flags & KBD_MOD_NUMLOCK))
+                esc = "[2~";
             break;
         case 0x53: // press KP_Delete
-            esc = "[3~";
+            if (!(kbd_flags & KBD_MOD_NUMLOCK))
+                esc = "[3~";
+            break;
+        case 0x45: // press Numlock
+            if (kbd_flags & KBD_MOD_NUMLOCK) {
+                kbd_flags &= ~KBD_MOD_NUMLOCK;
+            } else {
+                kbd_flags |= KBD_MOD_NUMLOCK;
+            }
             break;
-        case 0x47: // press KP_Home
-            esc = "OH";
+        case 0x3a: // press Shiftlock
+            if (kbd_flags & KBD_MOD_SHIFTLOCK) {
+                kbd_flags &= ~KBD_MOD_SHIFTLOCK;
+            } else {
+                kbd_flags |= KBD_MOD_SHIFTLOCK;
+            }
+            break;
+         case 0x47: // press KP_Home
+            if (!(kbd_flags & KBD_MOD_NUMLOCK))
+                esc = "OH";
             break;
         case 0x4f: // press KP_END
-            esc = "OF";
+            if (!(kbd_flags & KBD_MOD_NUMLOCK))
+                esc = "OF";
             break;
         case 0x48: // press KP_UP
-            esc = "OA";
+            if (!(kbd_flags & KBD_MOD_NUMLOCK))
+                esc = "OA";
             break;
         case 0x50: // press KP_DOWN
-            esc = "OB";
+            if (!(kbd_flags & KBD_MOD_NUMLOCK))
+                esc = "OB";
             break;
         case 0x4b: // press KP_LEFT
-            esc = "OD";
+            if (!(kbd_flags & KBD_MOD_NUMLOCK))
+                esc = "OD";
             break;
         case 0x4d: // press KP_RIGHT
-            esc = "OC";
+            if (!(kbd_flags & KBD_MOD_NUMLOCK))
+                esc = "OC";
             break;
         case 0x3b: // press F1
             esc = "OP";
@@ -208,45 +270,59 @@ my_kbd_push_key(SpiceKbdInstance *sin, uint8_t frag)
         }
 
         spiceterm_update_watch_mask(vt, TRUE);
-    }
-
-    DPRINTF(1, "leave frag=%02x flags=%08x", frag, kbd_flags);
-    return;
-}
+    } else if (frag < 128) {
+
+        guint mask = 0;
+        if (kbd_flags & (KBD_MOD_SHIFT_L_FLAG|KBD_MOD_SHIFT_R_FLAG)) {
+            mask |= MOD_MASK_SHIFT;
+        } 
+        if (kbd_flags & KBD_MOD_SHIFTLOCK) {
+            if (mask & MOD_MASK_SHIFT) {
+                mask &= ~MOD_MASK_SHIFT;
+            } else {
+                mask |= MOD_MASK_SHIFT;
+            }
+        }
+        if (kbd_flags & KBD_MOD_ALTGR_FLAG) {
+            mask |= MOD_MASK_ALTGR;
+        }
+        if (kbd_flags & KBD_MOD_NUMLOCK) {
+            mask |= MOD_MASK_NUMLOCK;
+        }
 
-static void
-my_kbd_push_utf8(SpiceKbdInstance *sin, uint32_t size, uint8_t *data)
-{
-    spiceTerm *vt = SPICE_CONTAINEROF(sin, spiceTerm, keyboard_sin);
 
-    DPRINTF(1, " size=%d data[0]=%02x", size, data[0]);
-    
-    if (kbd_flags & (KBD_MOD_CONTROL_L_FLAG|KBD_MOD_CONTROL_R_FLAG)) {
-        if (size != 1) return;
-        if (data[0] >= 'a' && data[0] <= 'z') {
-            uint8_t buf[1] = { data[0] - 'a' + 1 };
-            spiceterm_respond_data(vt, 1, buf);
-
-        } else if (data[0] >= 'A' && data[0] <= 'Z') {
-            uint8_t buf[1] = { data[0] - 'A' + 1 };
-            spiceterm_respond_data(vt, 1, buf);           
-        }
-    } else {
-        if (size == 1 && data[0] == 0x7f) {
-            /* use an escape sequence for DELETE, else it behaves like BACKSPACE */
-            spiceterm_respond_esc(vt, "[3~");
-        } else {
-            spiceterm_respond_data(vt, size, data);
+        gint hkey = mask << 8 | (frag & 127);
+        keymap_entry *e = (keymap_entry *)g_hash_table_lookup(keymap, &hkey);
+        if (!e && (kbd_flags & KBD_MOD_NUMLOCK)) {
+            mask &= ~ MOD_MASK_NUMLOCK;
+            hkey = mask << 8 | (frag & 127);
+            e = (keymap_entry *)g_hash_table_lookup(keymap, &hkey);
         }
-    }
-    
-    if (vt->y_displ != vt->y_base) {
-        vt->y_displ = vt->y_base;
-        spiceterm_refresh(vt);
-    }
 
-    spiceterm_update_watch_mask(vt, TRUE);
+        if (e && e->unicode) {
+            guint32 uc = e->unicode;
+            gchar buf[32];
+            guint8 len;
+            if (uc && ((len = g_unichar_to_utf8(uc, buf)) > 0)) {
+                if (kbd_flags & (KBD_MOD_CONTROL_L_FLAG|KBD_MOD_CONTROL_R_FLAG)) {
+                    if (buf[0] >= 'a' && buf[0] <= 'z') {
+                        uint8_t ctrl[1] = { buf[0] - 'a' + 1 };
+                        spiceterm_respond_data(vt, 1, ctrl);
+                        spiceterm_update_watch_mask(vt, TRUE);
+                    } else if (buf[0] >= 'A' && buf[0] <= 'Z') {
+                        uint8_t ctrl[1] = { buf[0] - 'A' + 1 };
+                        spiceterm_respond_data(vt, 1, ctrl);
+                        spiceterm_update_watch_mask(vt, TRUE);
+                    }
+                } else {
+                    spiceterm_respond_data(vt, len, (uint8_t *)buf);
+                    spiceterm_update_watch_mask(vt, TRUE);
+                }
+            }
+        }
 
+    }
+    DPRINTF(1, "leave frag=%02x flags=%08x", frag, kbd_flags);
     return;
 }
 
@@ -257,7 +333,6 @@ static SpiceKbdInterface my_keyboard_sif = {
     .base.minor_version = SPICE_INTERFACE_KEYBOARD_MINOR,
     .push_scan_freg     = my_kbd_push_key,
     .get_leds           = my_kbd_get_leds,
-    .push_utf8          = my_kbd_push_utf8,
 };
 
 
@@ -619,14 +694,118 @@ static SpiceCharDeviceInterface my_vdagent_sif = {
     .read               = vmc_read,
 };
 
+static void 
+add_keymap_entry(guint8 mask, guint8 keycode, guint keysym, guint unicode)
+{
+    keymap_entry *e = g_new0(keymap_entry, 1);
+    e->mask = mask;
+    e->keysym = keysym;
+    e->unicode = unicode;
+    e->keycode = keycode;
+    e->hkey = mask << 8 | (keycode & 255);
+
+    // only insert first mapping (other are most likely dead keys)
+    if (!g_hash_table_lookup(keymap, &e->hkey)) {
+        g_hash_table_insert(keymap, &e->hkey, e);
+    }
+}
+
+static void 
+parse_keymap(const char *language)
+{
+    char line[1024];
+    int len;
+
+    printf("parse keymap %s\n", language);
+
+    char *filename = g_strdup_printf("/usr/share/kvm/keymaps/%s", language);
+    FILE *f = fopen(filename, "r");
+    g_free(filename);
+    if (!f) {
+       fprintf(stderr, "Could not read keymap file: '%s'\n", language);
+        return;
+    }
+
+    for(;;) {
+       if (fgets(line, 1024, f) == NULL)
+            break;
+        len = strlen(line);
+        if (len > 0 && line[len - 1] == '\n')
+            line[len - 1] = '\0';
+        if (line[0] == '#' || line[0] == '\0')
+           continue;
+       if (!strncmp(line, "map ", 4))
+           continue;
+       if (!strncmp(line, "include ", 8)) {
+           parse_keymap(line + 8);
+        } else {
+            printf("LINE: %s\n", line);
+            char *tok = strtok(line, " ");
+            if (!tok) {
+                fprintf(stderr, "Warning: unknown keysym\n");
+                g_assert_not_reached();
+            }
+            const name2keysym_t *map = lookup_keysym(tok);
+            if (!map) {
+                fprintf(stderr, "Warning: unknown keysym '%s'\n", tok);
+                g_assert_not_reached();
+            } 
+
+            guint8 mask = 0;
+            guint keycode = 0;
+            gboolean addupper = FALSE;
+            while ((tok = strtok(NULL, " "))) {
+                if (!strcmp(tok, "shift")) {
+                   mask |= MOD_MASK_SHIFT;
+                } else if (!strcmp(tok, "numlock")) {
+                    mask |= MOD_MASK_NUMLOCK;
+                } else if (!strcmp(tok, "altgr")) {
+                    mask |= MOD_MASK_ALTGR;
+                } else if (!strcmp(tok, "addupper")) {
+                    addupper = TRUE;
+                } else if (!strcmp(tok, "inhibit")) {
+                    // fixme
+                } else if (!strcmp(tok, "localstate")) {
+                    //skip
+                } else {
+                    char *endptr;
+                    errno = 0;
+                    keycode = strtol(tok, &endptr, 0);
+                    if (errno != 0 || *endptr != '\0' || keycode >= 255) {
+                        printf("got unknown modifier '%s' %d\n", tok, keycode);
+                        g_assert_not_reached();
+                    }
+
+                }
+            }
+
+            printf("got keycode %u ==> %02x:%d\n", map->keysym, mask, keycode);
+
+            add_keymap_entry(mask, keycode, map->keysym, map->unicode);
+            if (addupper) {
+                gchar uc = g_ascii_toupper(line[0]);
+                if (uc != line[0]) {
+                    char ucname[] = { uc, '\0' }; 
+                    if ((map = lookup_keysym(ucname))) {
+                        add_keymap_entry(mask|MOD_MASK_SHIFT, keycode, 
+                                         map->keysym, map->unicode);
+                    }
+                }
+            }
+        }
+    }
+}
+
 spiceTerm *
 spiceterm_create(uint32_t width, uint32_t height, SpiceTermOptions *opts)
 {
     SpiceCoreInterface *core = basic_event_loop_init();
     SpiceScreen *spice_screen = spice_screen_new(core, width, height, opts);
 
-    //spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESS_OFF);
-        
+    keymap = g_hash_table_new(g_int_hash, g_int_equal);
+    parse_keymap(opts->keymap ?  opts->keymap : "en-us");
+
     spice_screen->image_cache = g_hash_table_new(g_int_hash, g_int_equal);
 
     spiceTerm *vt = (spiceTerm *)calloc (sizeof(spiceTerm), 1);
diff --git a/keysyms.h b/keysyms.h
new file mode 100644 (file)
index 0000000..aaa143b
--- /dev/null
+++ b/keysyms.h
@@ -0,0 +1,2104 @@
+typedef struct {
+       const char* name;
+       int keysym;
+       int unicode;
+} name2keysym_t;
+
+static const name2keysym_t name2keysym[] = {
+    { "VoidSymbol", 0xffffff,  0x0000 },
+    { "BackSpace", 0xff08,  0x0008 },
+    { "Tab", 0xff09,  0x0009 },
+    { "Linefeed", 0xff0a,  0x000a },
+    { "Clear", 0xff0b,  0x000b },
+    { "Return", 0xff0d,  0x000d },
+    { "Pause", 0xff13,  0x0013 },
+    { "Scroll_Lock", 0xff14,  0x0014 },
+    { "Sys_Req", 0xff15,  0x0015 },
+    { "Escape", 0xff1b,  0x001b },
+    { "Delete", 0xffff,  0x0000 },
+    { "Multi_key", 0xff20,  0x0000 },
+    { "Codeinput", 0xff37,  0x0000 },
+    { "SingleCandidate", 0xff3c,  0x0000 },
+    { "MultipleCandidate", 0xff3d,  0x0000 },
+    { "PreviousCandidate", 0xff3e,  0x0000 },
+    { "Kanji", 0xff21,  0x0000 },
+    { "Muhenkan", 0xff22,  0x0000 },
+    { "Henkan_Mode", 0xff23,  0x0000 },
+    { "Henkan", 0xff23,  0x0000 },
+    { "Romaji", 0xff24,  0x0000 },
+    { "Hiragana", 0xff25,  0x0000 },
+    { "Katakana", 0xff26,  0x0000 },
+    { "Hiragana_Katakana", 0xff27,  0x0000 },
+    { "Zenkaku", 0xff28,  0x0000 },
+    { "Hankaku", 0xff29,  0x0000 },
+    { "Zenkaku_Hankaku", 0xff2a,  0x0000 },
+    { "Touroku", 0xff2b,  0x0000 },
+    { "Massyo", 0xff2c,  0x0000 },
+    { "Kana_Lock", 0xff2d,  0x0000 },
+    { "Kana_Shift", 0xff2e,  0x0000 },
+    { "Eisu_Shift", 0xff2f,  0x0000 },
+    { "Eisu_toggle", 0xff30,  0x0000 },
+    { "Kanji_Bangou", 0xff37,  0x0000 },
+    { "Zen_Koho", 0xff3d,  0x0000 },
+    { "Mae_Koho", 0xff3e,  0x0000 },
+    { "Home", 0xff50,  0x0000 },
+    { "Left", 0xff51,  0x0000 },
+    { "Up", 0xff52,  0x0000 },
+    { "Right", 0xff53,  0x0000 },
+    { "Down", 0xff54,  0x0000 },
+    { "Prior", 0xff55,  0x0000 },
+    { "Page_Up", 0xff55,  0x0000 },
+    { "Next", 0xff56,  0x0000 },
+    { "Page_Down", 0xff56,  0x0000 },
+    { "End", 0xff57,  0x0000 },
+    { "Begin", 0xff58,  0x0000 },
+    { "Select", 0xff60,  0x0000 },
+    { "Print", 0xff61,  0x0000 },
+    { "Execute", 0xff62,  0x0000 },
+    { "Insert", 0xff63,  0x0000 },
+    { "Undo", 0xff65,  0x0000 },
+    { "Redo", 0xff66,  0x0000 },
+    { "Menu", 0xff67,  0x0000 },
+    { "Find", 0xff68,  0x0000 },
+    { "Cancel", 0xff69,  0x0000 },
+    { "Help", 0xff6a,  0x0000 },
+    { "Break", 0xff6b,  0x0000 },
+    { "Mode_switch", 0xff7e,  0x0000 },
+    { "script_switch", 0xff7e,  0x0000 },
+    { "Num_Lock", 0xff7f,  0x0000 },
+    { "KP_Space", 0xff80,  0x0000 },
+    { "KP_Tab", 0xff89,  0x0000 },
+    { "KP_Enter", 0xff8d,  0x0000 },
+    { "KP_F1", 0xff91,  0x0000 },
+    { "KP_F2", 0xff92,  0x0000 },
+    { "KP_F3", 0xff93,  0x0000 },
+    { "KP_F4", 0xff94,  0x0000 },
+    { "KP_Home", 0xff95,  0x0000 },
+    { "KP_Left", 0xff96,  0x0000 },
+    { "KP_Up", 0xff97,  0x0000 },
+    { "KP_Right", 0xff98,  0x0000 },
+    { "KP_Down", 0xff99,  0x0000 },
+    { "KP_Prior", 0xff9a,  0x0000 },
+    { "KP_Page_Up", 0xff9a,  0x0000 },
+    { "KP_Next", 0xff9b,  0x0000 },
+    { "KP_Page_Down", 0xff9b,  0x0000 },
+    { "KP_End", 0xff9c,  0x0000 },
+    { "KP_Begin", 0xff9d,  0x0000 },
+    { "KP_Insert", 0xff9e,  0x0000 },
+    { "KP_Delete", 0xff9f,  0x0000 },
+    { "KP_Equal", 0xffbd,  0x0000 },
+    { "KP_Multiply", 0xffaa,  0x002a },
+    { "KP_Add", 0xffab,  0x002b },
+    { "KP_Separator", 0xffac,  0x002c },
+    { "KP_Subtract", 0xffad,  0x002d },
+    { "KP_Decimal", 0xffae,  0x002e },
+    { "KP_Divide", 0xffaf,  0x002f },
+    { "KP_0", 0xffb0,  0x0030 },
+    { "KP_1", 0xffb1,  0x0031 },
+    { "KP_2", 0xffb2,  0x0032 },
+    { "KP_3", 0xffb3,  0x0033 },
+    { "KP_4", 0xffb4,  0x0034 },
+    { "KP_5", 0xffb5,  0x0035 },
+    { "KP_6", 0xffb6,  0x0036 },
+    { "KP_7", 0xffb7,  0x0037 },
+    { "KP_8", 0xffb8,  0x0038 },
+    { "KP_9", 0xffb9,  0x0039 },
+    { "F1", 0xffbe,  0x0000 },
+    { "F2", 0xffbf,  0x0000 },
+    { "F3", 0xffc0,  0x0000 },
+    { "F4", 0xffc1,  0x0000 },
+    { "F5", 0xffc2,  0x0000 },
+    { "F6", 0xffc3,  0x0000 },
+    { "F7", 0xffc4,  0x0000 },
+    { "F8", 0xffc5,  0x0000 },
+    { "F9", 0xffc6,  0x0000 },
+    { "F10", 0xffc7,  0x0000 },
+    { "F11", 0xffc8,  0x0000 },
+    { "L1", 0xffc8,  0x0000 },
+    { "F12", 0xffc9,  0x0000 },
+    { "L2", 0xffc9,  0x0000 },
+    { "F13", 0xffca,  0x0000 },
+    { "L3", 0xffca,  0x0000 },
+    { "F14", 0xffcb,  0x0000 },
+    { "L4", 0xffcb,  0x0000 },
+    { "F15", 0xffcc,  0x0000 },
+    { "L5", 0xffcc,  0x0000 },
+    { "F16", 0xffcd,  0x0000 },
+    { "L6", 0xffcd,  0x0000 },
+    { "F17", 0xffce,  0x0000 },
+    { "L7", 0xffce,  0x0000 },
+    { "F18", 0xffcf,  0x0000 },
+    { "L8", 0xffcf,  0x0000 },
+    { "F19", 0xffd0,  0x0000 },
+    { "L9", 0xffd0,  0x0000 },
+    { "F20", 0xffd1,  0x0000 },
+    { "L10", 0xffd1,  0x0000 },
+    { "F21", 0xffd2,  0x0000 },
+    { "R1", 0xffd2,  0x0000 },
+    { "F22", 0xffd3,  0x0000 },
+    { "R2", 0xffd3,  0x0000 },
+    { "F23", 0xffd4,  0x0000 },
+    { "R3", 0xffd4,  0x0000 },
+    { "F24", 0xffd5,  0x0000 },
+    { "R4", 0xffd5,  0x0000 },
+    { "F25", 0xffd6,  0x0000 },
+    { "R5", 0xffd6,  0x0000 },
+    { "F26", 0xffd7,  0x0000 },
+    { "R6", 0xffd7,  0x0000 },
+    { "F27", 0xffd8,  0x0000 },
+    { "R7", 0xffd8,  0x0000 },
+    { "F28", 0xffd9,  0x0000 },
+    { "R8", 0xffd9,  0x0000 },
+    { "F29", 0xffda,  0x0000 },
+    { "R9", 0xffda,  0x0000 },
+    { "F30", 0xffdb,  0x0000 },
+    { "R10", 0xffdb,  0x0000 },
+    { "F31", 0xffdc,  0x0000 },
+    { "R11", 0xffdc,  0x0000 },
+    { "F32", 0xffdd,  0x0000 },
+    { "R12", 0xffdd,  0x0000 },
+    { "F33", 0xffde,  0x0000 },
+    { "R13", 0xffde,  0x0000 },
+    { "F34", 0xffdf,  0x0000 },
+    { "R14", 0xffdf,  0x0000 },
+    { "F35", 0xffe0,  0x0000 },
+    { "R15", 0xffe0,  0x0000 },
+    { "Shift_L", 0xffe1,  0x0000 },
+    { "Shift_R", 0xffe2,  0x0000 },
+    { "Control_L", 0xffe3,  0x0000 },
+    { "Control_R", 0xffe4,  0x0000 },
+    { "Caps_Lock", 0xffe5,  0x0000 },
+    { "Shift_Lock", 0xffe6,  0x0000 },
+    { "Meta_L", 0xffe7,  0x0000 },
+    { "Meta_R", 0xffe8,  0x0000 },
+    { "Alt_L", 0xffe9,  0x0000 },
+    { "Alt_R", 0xffea,  0x0000 },
+    { "Super_L", 0xffeb,  0x0000 },
+    { "Super_R", 0xffec,  0x0000 },
+    { "Hyper_L", 0xffed,  0x0000 },
+    { "Hyper_R", 0xffee,  0x0000 },
+    { "ISO_Lock", 0xfe01,  0x0000 },
+    { "ISO_Level2_Latch", 0xfe02,  0x0000 },
+    { "ISO_Level3_Shift", 0xfe03,  0x0000 },
+    { "ISO_Level3_Latch", 0xfe04,  0x0000 },
+    { "ISO_Level3_Lock", 0xfe05,  0x0000 },
+    { "ISO_Level5_Shift", 0xfe11,  0x0000 },
+    { "ISO_Level5_Latch", 0xfe12,  0x0000 },
+    { "ISO_Level5_Lock", 0xfe13,  0x0000 },
+    { "ISO_Group_Shift", 0xff7e,  0x0000 },
+    { "ISO_Group_Latch", 0xfe06,  0x0000 },
+    { "ISO_Group_Lock", 0xfe07,  0x0000 },
+    { "ISO_Next_Group", 0xfe08,  0x0000 },
+    { "ISO_Next_Group_Lock", 0xfe09,  0x0000 },
+    { "ISO_Prev_Group", 0xfe0a,  0x0000 },
+    { "ISO_Prev_Group_Lock", 0xfe0b,  0x0000 },
+    { "ISO_First_Group", 0xfe0c,  0x0000 },
+    { "ISO_First_Group_Lock", 0xfe0d,  0x0000 },
+    { "ISO_Last_Group", 0xfe0e,  0x0000 },
+    { "ISO_Last_Group_Lock", 0xfe0f,  0x0000 },
+    { "ISO_Left_Tab", 0xfe20,  0x0000 },
+    { "ISO_Move_Line_Up", 0xfe21,  0x0000 },
+    { "ISO_Move_Line_Down", 0xfe22,  0x0000 },
+    { "ISO_Partial_Line_Up", 0xfe23,  0x0000 },
+    { "ISO_Partial_Line_Down", 0xfe24,  0x0000 },
+    { "ISO_Partial_Space_Left", 0xfe25,  0x0000 },
+    { "ISO_Partial_Space_Right", 0xfe26,  0x0000 },
+    { "ISO_Set_Margin_Left", 0xfe27,  0x0000 },
+    { "ISO_Set_Margin_Right", 0xfe28,  0x0000 },
+    { "ISO_Release_Margin_Left", 0xfe29,  0x0000 },
+    { "ISO_Release_Margin_Right", 0xfe2a,  0x0000 },
+    { "ISO_Release_Both_Margins", 0xfe2b,  0x0000 },
+    { "ISO_Fast_Cursor_Left", 0xfe2c,  0x0000 },
+    { "ISO_Fast_Cursor_Right", 0xfe2d,  0x0000 },
+    { "ISO_Fast_Cursor_Up", 0xfe2e,  0x0000 },
+    { "ISO_Fast_Cursor_Down", 0xfe2f,  0x0000 },
+    { "ISO_Continuous_Underline", 0xfe30,  0x0000 },
+    { "ISO_Discontinuous_Underline", 0xfe31,  0x0000 },
+    { "ISO_Emphasize", 0xfe32,  0x0000 },
+    { "ISO_Center_Object", 0xfe33,  0x0000 },
+    { "ISO_Enter", 0xfe34,  0x0000 },
+    { "dead_grave", 0xfe50,  0x0000 },
+    { "dead_acute", 0xfe51,  0x0000 },
+    { "dead_circumflex", 0xfe52,  0x0000 },
+    { "dead_tilde", 0xfe53,  0x0000 },
+    { "dead_perispomeni", 0xfe53,  0x0000 },
+    { "dead_macron", 0xfe54,  0x0000 },
+    { "dead_breve", 0xfe55,  0x0000 },
+    { "dead_abovedot", 0xfe56,  0x0000 },
+    { "dead_diaeresis", 0xfe57,  0x0000 },
+    { "dead_abovering", 0xfe58,  0x0000 },
+    { "dead_doubleacute", 0xfe59,  0x0000 },
+    { "dead_caron", 0xfe5a,  0x0000 },
+    { "dead_cedilla", 0xfe5b,  0x0000 },
+    { "dead_ogonek", 0xfe5c,  0x0000 },
+    { "dead_iota", 0xfe5d,  0x0000 },
+    { "dead_voiced_sound", 0xfe5e,  0x0000 },
+    { "dead_semivoiced_sound", 0xfe5f,  0x0000 },
+    { "dead_belowdot", 0xfe60,  0x0000 },
+    { "dead_hook", 0xfe61,  0x0000 },
+    { "dead_horn", 0xfe62,  0x0000 },
+    { "dead_stroke", 0xfe63,  0x0000 },
+    { "dead_abovecomma", 0xfe64,  0x0000 },
+    { "dead_psili", 0xfe64,  0x0000 },
+    { "dead_abovereversedcomma", 0xfe65,  0x0000 },
+    { "dead_dasia", 0xfe65,  0x0000 },
+    { "dead_doublegrave", 0xfe66,  0x0000 },
+    { "dead_belowring", 0xfe67,  0x0000 },
+    { "dead_belowmacron", 0xfe68,  0x0000 },
+    { "dead_belowcircumflex", 0xfe69,  0x0000 },
+    { "dead_belowtilde", 0xfe6a,  0x0000 },
+    { "dead_belowbreve", 0xfe6b,  0x0000 },
+    { "dead_belowdiaeresis", 0xfe6c,  0x0000 },
+    { "dead_invertedbreve", 0xfe6d,  0x0000 },
+    { "dead_belowcomma", 0xfe6e,  0x0000 },
+    { "dead_currency", 0xfe6f,  0x0000 },
+    { "dead_a", 0xfe80,  0x0000 },
+    { "dead_A", 0xfe81,  0x0000 },
+    { "dead_e", 0xfe82,  0x0000 },
+    { "dead_E", 0xfe83,  0x0000 },
+    { "dead_i", 0xfe84,  0x0000 },
+    { "dead_I", 0xfe85,  0x0000 },
+    { "dead_o", 0xfe86,  0x0000 },
+    { "dead_O", 0xfe87,  0x0000 },
+    { "dead_u", 0xfe88,  0x0000 },
+    { "dead_U", 0xfe89,  0x0000 },
+    { "dead_small_schwa", 0xfe8a,  0x0000 },
+    { "dead_capital_schwa", 0xfe8b,  0x0000 },
+    { "dead_greek", 0xfe8c,  0x0000 },
+    { "First_Virtual_Screen", 0xfed0,  0x0000 },
+    { "Prev_Virtual_Screen", 0xfed1,  0x0000 },
+    { "Next_Virtual_Screen", 0xfed2,  0x0000 },
+    { "Last_Virtual_Screen", 0xfed4,  0x0000 },
+    { "Terminate_Server", 0xfed5,  0x0000 },
+    { "AccessX_Enable", 0xfe70,  0x0000 },
+    { "AccessX_Feedback_Enable", 0xfe71,  0x0000 },
+    { "RepeatKeys_Enable", 0xfe72,  0x0000 },
+    { "SlowKeys_Enable", 0xfe73,  0x0000 },
+    { "BounceKeys_Enable", 0xfe74,  0x0000 },
+    { "StickyKeys_Enable", 0xfe75,  0x0000 },
+    { "MouseKeys_Enable", 0xfe76,  0x0000 },
+    { "MouseKeys_Accel_Enable", 0xfe77,  0x0000 },
+    { "Overlay1_Enable", 0xfe78,  0x0000 },
+    { "Overlay2_Enable", 0xfe79,  0x0000 },
+    { "AudibleBell_Enable", 0xfe7a,  0x0000 },
+    { "Pointer_Left", 0xfee0,  0x0000 },
+    { "Pointer_Right", 0xfee1,  0x0000 },
+    { "Pointer_Up", 0xfee2,  0x0000 },
+    { "Pointer_Down", 0xfee3,  0x0000 },
+    { "Pointer_UpLeft", 0xfee4,  0x0000 },
+    { "Pointer_UpRight", 0xfee5,  0x0000 },
+    { "Pointer_DownLeft", 0xfee6,  0x0000 },
+    { "Pointer_DownRight", 0xfee7,  0x0000 },
+    { "Pointer_Button_Dflt", 0xfee8,  0x0000 },
+    { "Pointer_Button1", 0xfee9,  0x0000 },
+    { "Pointer_Button2", 0xfeea,  0x0000 },
+    { "Pointer_Button3", 0xfeeb,  0x0000 },
+    { "Pointer_Button4", 0xfeec,  0x0000 },
+    { "Pointer_Button5", 0xfeed,  0x0000 },
+    { "Pointer_DblClick_Dflt", 0xfeee,  0x0000 },
+    { "Pointer_DblClick1", 0xfeef,  0x0000 },
+    { "Pointer_DblClick2", 0xfef0,  0x0000 },
+    { "Pointer_DblClick3", 0xfef1,  0x0000 },
+    { "Pointer_DblClick4", 0xfef2,  0x0000 },
+    { "Pointer_DblClick5", 0xfef3,  0x0000 },
+    { "Pointer_Drag_Dflt", 0xfef4,  0x0000 },
+    { "Pointer_Drag1", 0xfef5,  0x0000 },
+    { "Pointer_Drag2", 0xfef6,  0x0000 },
+    { "Pointer_Drag3", 0xfef7,  0x0000 },
+    { "Pointer_Drag4", 0xfef8,  0x0000 },
+    { "Pointer_Drag5", 0xfefd,  0x0000 },
+    { "Pointer_EnableKeys", 0xfef9,  0x0000 },
+    { "Pointer_Accelerate", 0xfefa,  0x0000 },
+    { "Pointer_DfltBtnNext", 0xfefb,  0x0000 },
+    { "Pointer_DfltBtnPrev", 0xfefc,  0x0000 },
+    { "ch", 0xfea0,  0x0000 },
+    { "Ch", 0xfea1,  0x0000 },
+    { "CH", 0xfea2,  0x0000 },
+    { "c_h", 0xfea3,  0x0000 },
+    { "C_h", 0xfea4,  0x0000 },
+    { "C_H", 0xfea5,  0x0000 },
+    { "3270_Duplicate", 0xfd01,  0x0000 },
+    { "3270_FieldMark", 0xfd02,  0x0000 },
+    { "3270_Right2", 0xfd03,  0x0000 },
+    { "3270_Left2", 0xfd04,  0x0000 },
+    { "3270_BackTab", 0xfd05,  0x0000 },
+    { "3270_EraseEOF", 0xfd06,  0x0000 },
+    { "3270_EraseInput", 0xfd07,  0x0000 },
+    { "3270_Reset", 0xfd08,  0x0000 },
+    { "3270_Quit", 0xfd09,  0x0000 },
+    { "3270_PA1", 0xfd0a,  0x0000 },
+    { "3270_PA2", 0xfd0b,  0x0000 },
+    { "3270_PA3", 0xfd0c,  0x0000 },
+    { "3270_Test", 0xfd0d,  0x0000 },
+    { "3270_Attn", 0xfd0e,  0x0000 },
+    { "3270_CursorBlink", 0xfd0f,  0x0000 },
+    { "3270_AltCursor", 0xfd10,  0x0000 },
+    { "3270_KeyClick", 0xfd11,  0x0000 },
+    { "3270_Jump", 0xfd12,  0x0000 },
+    { "3270_Ident", 0xfd13,  0x0000 },
+    { "3270_Rule", 0xfd14,  0x0000 },
+    { "3270_Copy", 0xfd15,  0x0000 },
+    { "3270_Play", 0xfd16,  0x0000 },
+    { "3270_Setup", 0xfd17,  0x0000 },
+    { "3270_Record", 0xfd18,  0x0000 },
+    { "3270_ChangeScreen", 0xfd19,  0x0000 },
+    { "3270_DeleteWord", 0xfd1a,  0x0000 },
+    { "3270_ExSelect", 0xfd1b,  0x0000 },
+    { "3270_CursorSelect", 0xfd1c,  0x0000 },
+    { "3270_PrintScreen", 0xfd1d,  0x0000 },
+    { "3270_Enter", 0xfd1e,  0x0000 },
+    { "space", 0x020,  0x0020 },
+    { "exclam", 0x021,  0x0021 },
+    { "quotedbl", 0x022,  0x0022 },
+    { "numbersign", 0x023,  0x0023 },
+    { "dollar", 0x024,  0x0024 },
+    { "percent", 0x025,  0x0025 },
+    { "ampersand", 0x026,  0x0026 },
+    { "apostrophe", 0x027,  0x0027 },
+    { "quoteright", 0x027,  0x0027 },
+    { "parenleft", 0x028,  0x0028 },
+    { "parenright", 0x029,  0x0029 },
+    { "asterisk", 0x02a,  0x002a },
+    { "plus", 0x02b,  0x002b },
+    { "comma", 0x02c,  0x002c },
+    { "minus", 0x02d,  0x002d },
+    { "period", 0x02e,  0x002e },
+    { "slash", 0x02f,  0x002f },
+    { "0", 0x030,  0x0030 },
+    { "1", 0x031,  0x0031 },
+    { "2", 0x032,  0x0032 },
+    { "3", 0x033,  0x0033 },
+    { "4", 0x034,  0x0034 },
+    { "5", 0x035,  0x0035 },
+    { "6", 0x036,  0x0036 },
+    { "7", 0x037,  0x0037 },
+    { "8", 0x038,  0x0038 },
+    { "9", 0x039,  0x0039 },
+    { "colon", 0x03a,  0x003a },
+    { "semicolon", 0x03b,  0x003b },
+    { "less", 0x03c,  0x003c },
+    { "equal", 0x03d,  0x003d },
+    { "greater", 0x03e,  0x003e },
+    { "question", 0x03f,  0x003f },
+    { "at", 0x040,  0x0040 },
+    { "A", 0x041,  0x0041 },
+    { "B", 0x042,  0x0042 },
+    { "C", 0x043,  0x0043 },
+    { "D", 0x044,  0x0044 },
+    { "E", 0x045,  0x0045 },
+    { "F", 0x046,  0x0046 },
+    { "G", 0x047,  0x0047 },
+    { "H", 0x048,  0x0048 },
+    { "I", 0x049,  0x0049 },
+    { "J", 0x04a,  0x004a },
+    { "K", 0x04b,  0x004b },
+    { "L", 0x04c,  0x004c },
+    { "M", 0x04d,  0x004d },
+    { "N", 0x04e,  0x004e },
+    { "O", 0x04f,  0x004f },
+    { "P", 0x050,  0x0050 },
+    { "Q", 0x051,  0x0051 },
+    { "R", 0x052,  0x0052 },
+    { "S", 0x053,  0x0053 },
+    { "T", 0x054,  0x0054 },
+    { "U", 0x055,  0x0055 },
+    { "V", 0x056,  0x0056 },
+    { "W", 0x057,  0x0057 },
+    { "X", 0x058,  0x0058 },
+    { "Y", 0x059,  0x0059 },
+    { "Z", 0x05a,  0x005a },
+    { "bracketleft", 0x05b,  0x005b },
+    { "backslash", 0x05c,  0x005c },
+    { "bracketright", 0x05d,  0x005d },
+    { "asciicircum", 0x05e,  0x005e },
+    { "underscore", 0x05f,  0x005f },
+    { "grave", 0x060,  0x0060 },
+    { "quoteleft", 0x060,  0x0060 },
+    { "a", 0x061,  0x0061 },
+    { "b", 0x062,  0x0062 },
+    { "c", 0x063,  0x0063 },
+    { "d", 0x064,  0x0064 },
+    { "e", 0x065,  0x0065 },
+    { "f", 0x066,  0x0066 },
+    { "g", 0x067,  0x0067 },
+    { "h", 0x068,  0x0068 },
+    { "i", 0x069,  0x0069 },
+    { "j", 0x06a,  0x006a },
+    { "k", 0x06b,  0x006b },
+    { "l", 0x06c,  0x006c },
+    { "m", 0x06d,  0x006d },
+    { "n", 0x06e,  0x006e },
+    { "o", 0x06f,  0x006f },
+    { "p", 0x070,  0x0070 },
+    { "q", 0x071,  0x0071 },
+    { "r", 0x072,  0x0072 },
+    { "s", 0x073,  0x0073 },
+    { "t", 0x074,  0x0074 },
+    { "u", 0x075,  0x0075 },
+    { "v", 0x076,  0x0076 },
+    { "w", 0x077,  0x0077 },
+    { "x", 0x078,  0x0078 },
+    { "y", 0x079,  0x0079 },
+    { "z", 0x07a,  0x007a },
+    { "braceleft", 0x07b,  0x007b },
+    { "bar", 0x07c,  0x007c },
+    { "braceright", 0x07d,  0x007d },
+    { "asciitilde", 0x07e,  0x007e },
+    { "nobreakspace", 0x0a0,  0x00a0 },
+    { "exclamdown", 0x0a1,  0x00a1 },
+    { "cent", 0x0a2,  0x00a2 },
+    { "sterling", 0x0a3,  0x00a3 },
+    { "currency", 0x0a4,  0x00a4 },
+    { "yen", 0x0a5,  0x00a5 },
+    { "brokenbar", 0x0a6,  0x00a6 },
+    { "section", 0x0a7,  0x00a7 },
+    { "diaeresis", 0x0a8,  0x00a8 },
+    { "copyright", 0x0a9,  0x00a9 },
+    { "ordfeminine", 0x0aa,  0x00aa },
+    { "guillemotleft", 0x0ab,  0x00ab },
+    { "notsign", 0x0ac,  0x00ac },
+    { "hyphen", 0x0ad,  0x00ad },
+    { "registered", 0x0ae,  0x00ae },
+    { "macron", 0x0af,  0x00af },
+    { "degree", 0x0b0,  0x00b0 },
+    { "plusminus", 0x0b1,  0x00b1 },
+    { "twosuperior", 0x0b2,  0x00b2 },
+    { "threesuperior", 0x0b3,  0x00b3 },
+    { "acute", 0x0b4,  0x00b4 },
+    { "mu", 0x0b5,  0x00b5 },
+    { "paragraph", 0x0b6,  0x00b6 },
+    { "periodcentered", 0x0b7,  0x00b7 },
+    { "cedilla", 0x0b8,  0x00b8 },
+    { "onesuperior", 0x0b9,  0x00b9 },
+    { "masculine", 0x0ba,  0x00ba },
+    { "guillemotright", 0x0bb,  0x00bb },
+    { "onequarter", 0x0bc,  0x00bc },
+    { "onehalf", 0x0bd,  0x00bd },
+    { "threequarters", 0x0be,  0x00be },
+    { "questiondown", 0x0bf,  0x00bf },
+    { "Agrave", 0x0c0,  0x00c0 },
+    { "Aacute", 0x0c1,  0x00c1 },
+    { "Acircumflex", 0x0c2,  0x00c2 },
+    { "Atilde", 0x0c3,  0x00c3 },
+    { "Adiaeresis", 0x0c4,  0x00c4 },
+    { "Aring", 0x0c5,  0x00c5 },
+    { "AE", 0x0c6,  0x00c6 },
+    { "Ccedilla", 0x0c7,  0x00c7 },
+    { "Egrave", 0x0c8,  0x00c8 },
+    { "Eacute", 0x0c9,  0x00c9 },
+    { "Ecircumflex", 0x0ca,  0x00ca },
+    { "Ediaeresis", 0x0cb,  0x00cb },
+    { "Igrave", 0x0cc,  0x00cc },
+    { "Iacute", 0x0cd,  0x00cd },
+    { "Icircumflex", 0x0ce,  0x00ce },
+    { "Idiaeresis", 0x0cf,  0x00cf },
+    { "ETH", 0x0d0,  0x00d0 },
+    { "Eth", 0x0d0,  0x00d0 },
+    { "Ntilde", 0x0d1,  0x00d1 },
+    { "Ograve", 0x0d2,  0x00d2 },
+    { "Oacute", 0x0d3,  0x00d3 },
+    { "Ocircumflex", 0x0d4,  0x00d4 },
+    { "Otilde", 0x0d5,  0x00d5 },
+    { "Odiaeresis", 0x0d6,  0x00d6 },
+    { "multiply", 0x0d7,  0x00d7 },
+    { "Oslash", 0x0d8,  0x00d8 },
+    { "Ooblique", 0x0d8,  0x00d8 },
+    { "Ugrave", 0x0d9,  0x00d9 },
+    { "Uacute", 0x0da,  0x00da },
+    { "Ucircumflex", 0x0db,  0x00db },
+    { "Udiaeresis", 0x0dc,  0x00dc },
+    { "Yacute", 0x0dd,  0x00dd },
+    { "THORN", 0x0de,  0x00de },
+    { "Thorn", 0x0de,  0x00de },
+    { "ssharp", 0x0df,  0x00df },
+    { "agrave", 0x0e0,  0x00e0 },
+    { "aacute", 0x0e1,  0x00e1 },
+    { "acircumflex", 0x0e2,  0x00e2 },
+    { "atilde", 0x0e3,  0x00e3 },
+    { "adiaeresis", 0x0e4,  0x00e4 },
+    { "aring", 0x0e5,  0x00e5 },
+    { "ae", 0x0e6,  0x00e6 },
+    { "ccedilla", 0x0e7,  0x00e7 },
+    { "egrave", 0x0e8,  0x00e8 },
+    { "eacute", 0x0e9,  0x00e9 },
+    { "ecircumflex", 0x0ea,  0x00ea },
+    { "ediaeresis", 0x0eb,  0x00eb },
+    { "igrave", 0x0ec,  0x00ec },
+    { "iacute", 0x0ed,  0x00ed },
+    { "icircumflex", 0x0ee,  0x00ee },
+    { "idiaeresis", 0x0ef,  0x00ef },
+    { "eth", 0x0f0,  0x00f0 },
+    { "ntilde", 0x0f1,  0x00f1 },
+    { "ograve", 0x0f2,  0x00f2 },
+    { "oacute", 0x0f3,  0x00f3 },
+    { "ocircumflex", 0x0f4,  0x00f4 },
+    { "otilde", 0x0f5,  0x00f5 },
+    { "odiaeresis", 0x0f6,  0x00f6 },
+    { "division", 0x0f7,  0x00f7 },
+    { "oslash", 0x0f8,  0x00f8 },
+    { "ooblique", 0x0f8,  0x00f8 },
+    { "ugrave", 0x0f9,  0x00f9 },
+    { "uacute", 0x0fa,  0x00fa },
+    { "ucircumflex", 0x0fb,  0x00fb },
+    { "udiaeresis", 0x0fc,  0x00fc },
+    { "yacute", 0x0fd,  0x00fd },
+    { "thorn", 0x0fe,  0x00fe },
+    { "ydiaeresis", 0x0ff,  0x00ff },
+    { "Aogonek", 0x1a1,  0x0104 },
+    { "breve", 0x1a2,  0x02d8 },
+    { "Lstroke", 0x1a3,  0x0141 },
+    { "Lcaron", 0x1a5,  0x013d },
+    { "Sacute", 0x1a6,  0x015a },
+    { "Scaron", 0x1a9,  0x0160 },
+    { "Scedilla", 0x1aa,  0x015e },
+    { "Tcaron", 0x1ab,  0x0164 },
+    { "Zacute", 0x1ac,  0x0179 },
+    { "Zcaron", 0x1ae,  0x017d },
+    { "Zabovedot", 0x1af,  0x017b },
+    { "aogonek", 0x1b1,  0x0105 },
+    { "ogonek", 0x1b2,  0x02db },
+    { "lstroke", 0x1b3,  0x0142 },
+    { "lcaron", 0x1b5,  0x013e },
+    { "sacute", 0x1b6,  0x015b },
+    { "caron", 0x1b7,  0x02c7 },
+    { "scaron", 0x1b9,  0x0161 },
+    { "scedilla", 0x1ba,  0x015f },
+    { "tcaron", 0x1bb,  0x0165 },
+    { "zacute", 0x1bc,  0x017a },
+    { "doubleacute", 0x1bd,  0x02dd },
+    { "zcaron", 0x1be,  0x017e },
+    { "zabovedot", 0x1bf,  0x017c },
+    { "Racute", 0x1c0,  0x0154 },
+    { "Abreve", 0x1c3,  0x0102 },
+    { "Lacute", 0x1c5,  0x0139 },
+    { "Cacute", 0x1c6,  0x0106 },
+    { "Ccaron", 0x1c8,  0x010c },
+    { "Eogonek", 0x1ca,  0x0118 },
+    { "Ecaron", 0x1cc,  0x011a },
+    { "Dcaron", 0x1cf,  0x010e },
+    { "Dstroke", 0x1d0,  0x0110 },
+    { "Nacute", 0x1d1,  0x0143 },
+    { "Ncaron", 0x1d2,  0x0147 },
+    { "Odoubleacute", 0x1d5,  0x0150 },
+    { "Rcaron", 0x1d8,  0x0158 },
+    { "Uring", 0x1d9,  0x016e },
+    { "Udoubleacute", 0x1db,  0x0170 },
+    { "Tcedilla", 0x1de,  0x0162 },
+    { "racute", 0x1e0,  0x0155 },
+    { "abreve", 0x1e3,  0x0103 },
+    { "lacute", 0x1e5,  0x013a },
+    { "cacute", 0x1e6,  0x0107 },
+    { "ccaron", 0x1e8,  0x010d },
+    { "eogonek", 0x1ea,  0x0119 },
+    { "ecaron", 0x1ec,  0x011b },
+    { "dcaron", 0x1ef,  0x010f },
+    { "dstroke", 0x1f0,  0x0111 },
+    { "nacute", 0x1f1,  0x0144 },
+    { "ncaron", 0x1f2,  0x0148 },
+    { "odoubleacute", 0x1f5,  0x0151 },
+    { "rcaron", 0x1f8,  0x0159 },
+    { "uring", 0x1f9,  0x016f },
+    { "udoubleacute", 0x1fb,  0x0171 },
+    { "tcedilla", 0x1fe,  0x0163 },
+    { "abovedot", 0x1ff,  0x02d9 },
+    { "Hstroke", 0x2a1,  0x0126 },
+    { "Hcircumflex", 0x2a6,  0x0124 },
+    { "Iabovedot", 0x2a9,  0x0130 },
+    { "Gbreve", 0x2ab,  0x011e },
+    { "Jcircumflex", 0x2ac,  0x0134 },
+    { "hstroke", 0x2b1,  0x0127 },
+    { "hcircumflex", 0x2b6,  0x0125 },
+    { "idotless", 0x2b9,  0x0131 },
+    { "gbreve", 0x2bb,  0x011f },
+    { "jcircumflex", 0x2bc,  0x0135 },
+    { "Cabovedot", 0x2c5,  0x010a },
+    { "Ccircumflex", 0x2c6,  0x0108 },
+    { "Gabovedot", 0x2d5,  0x0120 },
+    { "Gcircumflex", 0x2d8,  0x011c },
+    { "Ubreve", 0x2dd,  0x016c },
+    { "Scircumflex", 0x2de,  0x015c },
+    { "cabovedot", 0x2e5,  0x010b },
+    { "ccircumflex", 0x2e6,  0x0109 },
+    { "gabovedot", 0x2f5,  0x0121 },
+    { "gcircumflex", 0x2f8,  0x011d },
+    { "ubreve", 0x2fd,  0x016d },
+    { "scircumflex", 0x2fe,  0x015d },
+    { "kra", 0x3a2,  0x0138 },
+    { "kappa", 0x3a2,  0x0000 },
+    { "Rcedilla", 0x3a3,  0x0156 },
+    { "Itilde", 0x3a5,  0x0128 },
+    { "Lcedilla", 0x3a6,  0x013b },
+    { "Emacron", 0x3aa,  0x0112 },
+    { "Gcedilla", 0x3ab,  0x0122 },
+    { "Tslash", 0x3ac,  0x0166 },
+    { "rcedilla", 0x3b3,  0x0157 },
+    { "itilde", 0x3b5,  0x0129 },
+    { "lcedilla", 0x3b6,  0x013c },
+    { "emacron", 0x3ba,  0x0113 },
+    { "gcedilla", 0x3bb,  0x0123 },
+    { "tslash", 0x3bc,  0x0167 },
+    { "ENG", 0x3bd,  0x014a },
+    { "eng", 0x3bf,  0x014b },
+    { "Amacron", 0x3c0,  0x0100 },
+    { "Iogonek", 0x3c7,  0x012e },
+    { "Eabovedot", 0x3cc,  0x0116 },
+    { "Imacron", 0x3cf,  0x012a },
+    { "Ncedilla", 0x3d1,  0x0145 },
+    { "Omacron", 0x3d2,  0x014c },
+    { "Kcedilla", 0x3d3,  0x0136 },
+    { "Uogonek", 0x3d9,  0x0172 },
+    { "Utilde", 0x3dd,  0x0168 },
+    { "Umacron", 0x3de,  0x016a },
+    { "amacron", 0x3e0,  0x0101 },
+    { "iogonek", 0x3e7,  0x012f },
+    { "eabovedot", 0x3ec,  0x0117 },
+    { "imacron", 0x3ef,  0x012b },
+    { "ncedilla", 0x3f1,  0x0146 },
+    { "omacron", 0x3f2,  0x014d },
+    { "kcedilla", 0x3f3,  0x0137 },
+    { "uogonek", 0x3f9,  0x0173 },
+    { "utilde", 0x3fd,  0x0169 },
+    { "umacron", 0x3fe,  0x016b },
+    { "Wcircumflex", 0x1000174,  0x0174 },
+    { "wcircumflex", 0x1000175,  0x0175 },
+    { "Ycircumflex", 0x1000176,  0x0176 },
+    { "ycircumflex", 0x1000177,  0x0177 },
+    { "Babovedot", 0x1001e02,  0x1e02 },
+    { "babovedot", 0x1001e03,  0x1e03 },
+    { "Dabovedot", 0x1001e0a,  0x1e0a },
+    { "dabovedot", 0x1001e0b,  0x1e0b },
+    { "Fabovedot", 0x1001e1e,  0x1e1e },
+    { "fabovedot", 0x1001e1f,  0x1e1f },
+    { "Mabovedot", 0x1001e40,  0x1e40 },
+    { "mabovedot", 0x1001e41,  0x1e41 },
+    { "Pabovedot", 0x1001e56,  0x1e56 },
+    { "pabovedot", 0x1001e57,  0x1e57 },
+    { "Sabovedot", 0x1001e60,  0x1e60 },
+    { "sabovedot", 0x1001e61,  0x1e61 },
+    { "Tabovedot", 0x1001e6a,  0x1e6a },
+    { "tabovedot", 0x1001e6b,  0x1e6b },
+    { "Wgrave", 0x1001e80,  0x1e80 },
+    { "wgrave", 0x1001e81,  0x1e81 },
+    { "Wacute", 0x1001e82,  0x1e82 },
+    { "wacute", 0x1001e83,  0x1e83 },
+    { "Wdiaeresis", 0x1001e84,  0x1e84 },
+    { "wdiaeresis", 0x1001e85,  0x1e85 },
+    { "Ygrave", 0x1001ef2,  0x1ef2 },
+    { "ygrave", 0x1001ef3,  0x1ef3 },
+    { "OE", 0x13bc,  0x0152 },
+    { "oe", 0x13bd,  0x0153 },
+    { "Ydiaeresis", 0x13be,  0x0178 },
+    { "overline", 0x47e,  0x203e },
+    { "kana_fullstop", 0x4a1,  0x3002 },
+    { "kana_openingbracket", 0x4a2,  0x300c },
+    { "kana_closingbracket", 0x4a3,  0x300d },
+    { "kana_comma", 0x4a4,  0x3001 },
+    { "kana_conjunctive", 0x4a5,  0x30fb },
+    { "kana_middledot", 0x4a5,  0x0000 },
+    { "kana_WO", 0x4a6,  0x30f2 },
+    { "kana_a", 0x4a7,  0x30a1 },
+    { "kana_i", 0x4a8,  0x30a3 },
+    { "kana_u", 0x4a9,  0x30a5 },
+    { "kana_e", 0x4aa,  0x30a7 },
+    { "kana_o", 0x4ab,  0x30a9 },
+    { "kana_ya", 0x4ac,  0x30e3 },
+    { "kana_yu", 0x4ad,  0x30e5 },
+    { "kana_yo", 0x4ae,  0x30e7 },
+    { "kana_tsu", 0x4af,  0x30c3 },
+    { "kana_tu", 0x4af,  0x0000 },
+    { "prolongedsound", 0x4b0,  0x30fc },
+    { "kana_A", 0x4b1,  0x30a2 },
+    { "kana_I", 0x4b2,  0x30a4 },
+    { "kana_U", 0x4b3,  0x30a6 },
+    { "kana_E", 0x4b4,  0x30a8 },
+    { "kana_O", 0x4b5,  0x30aa },
+    { "kana_KA", 0x4b6,  0x30ab },
+    { "kana_KI", 0x4b7,  0x30ad },
+    { "kana_KU", 0x4b8,  0x30af },
+    { "kana_KE", 0x4b9,  0x30b1 },
+    { "kana_KO", 0x4ba,  0x30b3 },
+    { "kana_SA", 0x4bb,  0x30b5 },
+    { "kana_SHI", 0x4bc,  0x30b7 },
+    { "kana_SU", 0x4bd,  0x30b9 },
+    { "kana_SE", 0x4be,  0x30bb },
+    { "kana_SO", 0x4bf,  0x30bd },
+    { "kana_TA", 0x4c0,  0x30bf },
+    { "kana_CHI", 0x4c1,  0x30c1 },
+    { "kana_TI", 0x4c1,  0x0000 },
+    { "kana_TSU", 0x4c2,  0x30c4 },
+    { "kana_TU", 0x4c2,  0x0000 },
+    { "kana_TE", 0x4c3,  0x30c6 },
+    { "kana_TO", 0x4c4,  0x30c8 },
+    { "kana_NA", 0x4c5,  0x30ca },
+    { "kana_NI", 0x4c6,  0x30cb },
+    { "kana_NU", 0x4c7,  0x30cc },
+    { "kana_NE", 0x4c8,  0x30cd },
+    { "kana_NO", 0x4c9,  0x30ce },
+    { "kana_HA", 0x4ca,  0x30cf },
+    { "kana_HI", 0x4cb,  0x30d2 },
+    { "kana_FU", 0x4cc,  0x30d5 },
+    { "kana_HU", 0x4cc,  0x0000 },
+    { "kana_HE", 0x4cd,  0x30d8 },
+    { "kana_HO", 0x4ce,  0x30db },
+    { "kana_MA", 0x4cf,  0x30de },
+    { "kana_MI", 0x4d0,  0x30df },
+    { "kana_MU", 0x4d1,  0x30e0 },
+    { "kana_ME", 0x4d2,  0x30e1 },
+    { "kana_MO", 0x4d3,  0x30e2 },
+    { "kana_YA", 0x4d4,  0x30e4 },
+    { "kana_YU", 0x4d5,  0x30e6 },
+    { "kana_YO", 0x4d6,  0x30e8 },
+    { "kana_RA", 0x4d7,  0x30e9 },
+    { "kana_RI", 0x4d8,  0x30ea },
+    { "kana_RU", 0x4d9,  0x30eb },
+    { "kana_RE", 0x4da,  0x30ec },
+    { "kana_RO", 0x4db,  0x30ed },
+    { "kana_WA", 0x4dc,  0x30ef },
+    { "kana_N", 0x4dd,  0x30f3 },
+    { "voicedsound", 0x4de,  0x309b },
+    { "semivoicedsound", 0x4df,  0x309c },
+    { "kana_switch", 0xff7e,  0x0000 },
+    { "Farsi_0", 0x10006f0,  0x06f0 },
+    { "Farsi_1", 0x10006f1,  0x06f1 },
+    { "Farsi_2", 0x10006f2,  0x06f2 },
+    { "Farsi_3", 0x10006f3,  0x06f3 },
+    { "Farsi_4", 0x10006f4,  0x06f4 },
+    { "Farsi_5", 0x10006f5,  0x06f5 },
+    { "Farsi_6", 0x10006f6,  0x06f6 },
+    { "Farsi_7", 0x10006f7,  0x06f7 },
+    { "Farsi_8", 0x10006f8,  0x06f8 },
+    { "Farsi_9", 0x10006f9,  0x06f9 },
+    { "Arabic_percent", 0x100066a,  0x066a },
+    { "Arabic_superscript_alef", 0x1000670,  0x0670 },
+    { "Arabic_tteh", 0x1000679,  0x0679 },
+    { "Arabic_peh", 0x100067e,  0x067e },
+    { "Arabic_tcheh", 0x1000686,  0x0686 },
+    { "Arabic_ddal", 0x1000688,  0x0688 },
+    { "Arabic_rreh", 0x1000691,  0x0691 },
+    { "Arabic_comma", 0x5ac,  0x060c },
+    { "Arabic_fullstop", 0x10006d4,  0x06d4 },
+    { "Arabic_0", 0x1000660,  0x0660 },
+    { "Arabic_1", 0x1000661,  0x0661 },
+    { "Arabic_2", 0x1000662,  0x0662 },
+    { "Arabic_3", 0x1000663,  0x0663 },
+    { "Arabic_4", 0x1000664,  0x0664 },
+    { "Arabic_5", 0x1000665,  0x0665 },
+    { "Arabic_6", 0x1000666,  0x0666 },
+    { "Arabic_7", 0x1000667,  0x0667 },
+    { "Arabic_8", 0x1000668,  0x0668 },
+    { "Arabic_9", 0x1000669,  0x0669 },
+    { "Arabic_semicolon", 0x5bb,  0x061b },
+    { "Arabic_question_mark", 0x5bf,  0x061f },
+    { "Arabic_hamza", 0x5c1,  0x0621 },
+    { "Arabic_maddaonalef", 0x5c2,  0x0622 },
+    { "Arabic_hamzaonalef", 0x5c3,  0x0623 },
+    { "Arabic_hamzaonwaw", 0x5c4,  0x0624 },
+    { "Arabic_hamzaunderalef", 0x5c5,  0x0625 },
+    { "Arabic_hamzaonyeh", 0x5c6,  0x0626 },
+    { "Arabic_alef", 0x5c7,  0x0627 },
+    { "Arabic_beh", 0x5c8,  0x0628 },
+    { "Arabic_tehmarbuta", 0x5c9,  0x0629 },
+    { "Arabic_teh", 0x5ca,  0x062a },
+    { "Arabic_theh", 0x5cb,  0x062b },
+    { "Arabic_jeem", 0x5cc,  0x062c },
+    { "Arabic_hah", 0x5cd,  0x062d },
+    { "Arabic_khah", 0x5ce,  0x062e },
+    { "Arabic_dal", 0x5cf,  0x062f },
+    { "Arabic_thal", 0x5d0,  0x0630 },
+    { "Arabic_ra", 0x5d1,  0x0631 },
+    { "Arabic_zain", 0x5d2,  0x0632 },
+    { "Arabic_seen", 0x5d3,  0x0633 },
+    { "Arabic_sheen", 0x5d4,  0x0634 },
+    { "Arabic_sad", 0x5d5,  0x0635 },
+    { "Arabic_dad", 0x5d6,  0x0636 },
+    { "Arabic_tah", 0x5d7,  0x0637 },
+    { "Arabic_zah", 0x5d8,  0x0638 },
+    { "Arabic_ain", 0x5d9,  0x0639 },
+    { "Arabic_ghain", 0x5da,  0x063a },
+    { "Arabic_tatweel", 0x5e0,  0x0640 },
+    { "Arabic_feh", 0x5e1,  0x0641 },
+    { "Arabic_qaf", 0x5e2,  0x0642 },
+    { "Arabic_kaf", 0x5e3,  0x0643 },
+    { "Arabic_lam", 0x5e4,  0x0644 },
+    { "Arabic_meem", 0x5e5,  0x0645 },
+    { "Arabic_noon", 0x5e6,  0x0646 },
+    { "Arabic_ha", 0x5e7,  0x0647 },
+    { "Arabic_heh", 0x5e7,  0x0000 },
+    { "Arabic_waw", 0x5e8,  0x0648 },
+    { "Arabic_alefmaksura", 0x5e9,  0x0649 },
+    { "Arabic_yeh", 0x5ea,  0x064a },
+    { "Arabic_fathatan", 0x5eb,  0x064b },
+    { "Arabic_dammatan", 0x5ec,  0x064c },
+    { "Arabic_kasratan", 0x5ed,  0x064d },
+    { "Arabic_fatha", 0x5ee,  0x064e },
+    { "Arabic_damma", 0x5ef,  0x064f },
+    { "Arabic_kasra", 0x5f0,  0x0650 },
+    { "Arabic_shadda", 0x5f1,  0x0651 },
+    { "Arabic_sukun", 0x5f2,  0x0652 },
+    { "Arabic_madda_above", 0x1000653,  0x0653 },
+    { "Arabic_hamza_above", 0x1000654,  0x0654 },
+    { "Arabic_hamza_below", 0x1000655,  0x0655 },
+    { "Arabic_jeh", 0x1000698,  0x0698 },
+    { "Arabic_veh", 0x10006a4,  0x06a4 },
+    { "Arabic_keheh", 0x10006a9,  0x06a9 },
+    { "Arabic_gaf", 0x10006af,  0x06af },
+    { "Arabic_noon_ghunna", 0x10006ba,  0x06ba },
+    { "Arabic_heh_doachashmee", 0x10006be,  0x06be },
+    { "Farsi_yeh", 0x10006cc,  0x06cc },
+    { "Arabic_farsi_yeh", 0x10006cc,  0x06cc },
+    { "Arabic_yeh_baree", 0x10006d2,  0x06d2 },
+    { "Arabic_heh_goal", 0x10006c1,  0x06c1 },
+    { "Arabic_switch", 0xff7e,  0x0000 },
+    { "Cyrillic_GHE_bar", 0x1000492,  0x0492 },
+    { "Cyrillic_ghe_bar", 0x1000493,  0x0493 },
+    { "Cyrillic_ZHE_descender", 0x1000496,  0x0496 },
+    { "Cyrillic_zhe_descender", 0x1000497,  0x0497 },
+    { "Cyrillic_KA_descender", 0x100049a,  0x049a },
+    { "Cyrillic_ka_descender", 0x100049b,  0x049b },
+    { "Cyrillic_KA_vertstroke", 0x100049c,  0x049c },
+    { "Cyrillic_ka_vertstroke", 0x100049d,  0x049d },
+    { "Cyrillic_EN_descender", 0x10004a2,  0x04a2 },
+    { "Cyrillic_en_descender", 0x10004a3,  0x04a3 },
+    { "Cyrillic_U_straight", 0x10004ae,  0x04ae },
+    { "Cyrillic_u_straight", 0x10004af,  0x04af },
+    { "Cyrillic_U_straight_bar", 0x10004b0,  0x04b0 },
+    { "Cyrillic_u_straight_bar", 0x10004b1,  0x04b1 },
+    { "Cyrillic_HA_descender", 0x10004b2,  0x04b2 },
+    { "Cyrillic_ha_descender", 0x10004b3,  0x04b3 },
+    { "Cyrillic_CHE_descender", 0x10004b6,  0x04b6 },
+    { "Cyrillic_che_descender", 0x10004b7,  0x04b7 },
+    { "Cyrillic_CHE_vertstroke", 0x10004b8,  0x04b8 },
+    { "Cyrillic_che_vertstroke", 0x10004b9,  0x04b9 },
+    { "Cyrillic_SHHA", 0x10004ba,  0x04ba },
+    { "Cyrillic_shha", 0x10004bb,  0x04bb },
+    { "Cyrillic_SCHWA", 0x10004d8,  0x04d8 },
+    { "Cyrillic_schwa", 0x10004d9,  0x04d9 },
+    { "Cyrillic_I_macron", 0x10004e2,  0x04e2 },
+    { "Cyrillic_i_macron", 0x10004e3,  0x04e3 },
+    { "Cyrillic_O_bar", 0x10004e8,  0x04e8 },
+    { "Cyrillic_o_bar", 0x10004e9,  0x04e9 },
+    { "Cyrillic_U_macron", 0x10004ee,  0x04ee },
+    { "Cyrillic_u_macron", 0x10004ef,  0x04ef },
+    { "Serbian_dje", 0x6a1,  0x0452 },
+    { "Macedonia_gje", 0x6a2,  0x0453 },
+    { "Cyrillic_io", 0x6a3,  0x0451 },
+    { "Ukrainian_ie", 0x6a4,  0x0454 },
+    { "Ukranian_je", 0x6a4,  0x0000 },
+    { "Macedonia_dse", 0x6a5,  0x0455 },
+    { "Ukrainian_i", 0x6a6,  0x0456 },
+    { "Ukranian_i", 0x6a6,  0x0000 },
+    { "Ukrainian_yi", 0x6a7,  0x0457 },
+    { "Ukranian_yi", 0x6a7,  0x0000 },
+    { "Cyrillic_je", 0x6a8,  0x0458 },
+    { "Serbian_je", 0x6a8,  0x0000 },
+    { "Cyrillic_lje", 0x6a9,  0x0459 },
+    { "Serbian_lje", 0x6a9,  0x0000 },
+    { "Cyrillic_nje", 0x6aa,  0x045a },
+    { "Serbian_nje", 0x6aa,  0x0000 },
+    { "Serbian_tshe", 0x6ab,  0x045b },
+    { "Macedonia_kje", 0x6ac,  0x045c },
+    { "Ukrainian_ghe_with_upturn", 0x6ad,  0x0491 },
+    { "Byelorussian_shortu", 0x6ae,  0x045e },
+    { "Cyrillic_dzhe", 0x6af,  0x045f },
+    { "Serbian_dze", 0x6af,  0x0000 },
+    { "numerosign", 0x6b0,  0x2116 },
+    { "Serbian_DJE", 0x6b1,  0x0402 },
+    { "Macedonia_GJE", 0x6b2,  0x0403 },
+    { "Cyrillic_IO", 0x6b3,  0x0401 },
+    { "Ukrainian_IE", 0x6b4,  0x0404 },
+    { "Ukranian_JE", 0x6b4,  0x0000 },
+    { "Macedonia_DSE", 0x6b5,  0x0405 },
+    { "Ukrainian_I", 0x6b6,  0x0406 },
+    { "Ukranian_I", 0x6b6,  0x0000 },
+    { "Ukrainian_YI", 0x6b7,  0x0407 },
+    { "Ukranian_YI", 0x6b7,  0x0000 },
+    { "Cyrillic_JE", 0x6b8,  0x0408 },
+    { "Serbian_JE", 0x6b8,  0x0000 },
+    { "Cyrillic_LJE", 0x6b9,  0x0409 },
+    { "Serbian_LJE", 0x6b9,  0x0000 },
+    { "Cyrillic_NJE", 0x6ba,  0x040a },
+    { "Serbian_NJE", 0x6ba,  0x0000 },
+    { "Serbian_TSHE", 0x6bb,  0x040b },
+    { "Macedonia_KJE", 0x6bc,  0x040c },
+    { "Ukrainian_GHE_WITH_UPTURN", 0x6bd,  0x0490 },
+    { "Byelorussian_SHORTU", 0x6be,  0x040e },
+    { "Cyrillic_DZHE", 0x6bf,  0x040f },
+    { "Serbian_DZE", 0x6bf,  0x0000 },
+    { "Cyrillic_yu", 0x6c0,  0x044e },
+    { "Cyrillic_a", 0x6c1,  0x0430 },
+    { "Cyrillic_be", 0x6c2,  0x0431 },
+    { "Cyrillic_tse", 0x6c3,  0x0446 },
+    { "Cyrillic_de", 0x6c4,  0x0434 },
+    { "Cyrillic_ie", 0x6c5,  0x0435 },
+    { "Cyrillic_ef", 0x6c6,  0x0444 },
+    { "Cyrillic_ghe", 0x6c7,  0x0433 },
+    { "Cyrillic_ha", 0x6c8,  0x0445 },
+    { "Cyrillic_i", 0x6c9,  0x0438 },
+    { "Cyrillic_shorti", 0x6ca,  0x0439 },
+    { "Cyrillic_ka", 0x6cb,  0x043a },
+    { "Cyrillic_el", 0x6cc,  0x043b },
+    { "Cyrillic_em", 0x6cd,  0x043c },
+    { "Cyrillic_en", 0x6ce,  0x043d },
+    { "Cyrillic_o", 0x6cf,  0x043e },
+    { "Cyrillic_pe", 0x6d0,  0x043f },
+    { "Cyrillic_ya", 0x6d1,  0x044f },
+    { "Cyrillic_er", 0x6d2,  0x0440 },
+    { "Cyrillic_es", 0x6d3,  0x0441 },
+    { "Cyrillic_te", 0x6d4,  0x0442 },
+    { "Cyrillic_u", 0x6d5,  0x0443 },
+    { "Cyrillic_zhe", 0x6d6,  0x0436 },
+    { "Cyrillic_ve", 0x6d7,  0x0432 },
+    { "Cyrillic_softsign", 0x6d8,  0x044c },
+    { "Cyrillic_yeru", 0x6d9,  0x044b },
+    { "Cyrillic_ze", 0x6da,  0x0437 },
+    { "Cyrillic_sha", 0x6db,  0x0448 },
+    { "Cyrillic_e", 0x6dc,  0x044d },
+    { "Cyrillic_shcha", 0x6dd,  0x0449 },
+    { "Cyrillic_che", 0x6de,  0x0447 },
+    { "Cyrillic_hardsign", 0x6df,  0x044a },
+    { "Cyrillic_YU", 0x6e0,  0x042e },
+    { "Cyrillic_A", 0x6e1,  0x0410 },
+    { "Cyrillic_BE", 0x6e2,  0x0411 },
+    { "Cyrillic_TSE", 0x6e3,  0x0426 },
+    { "Cyrillic_DE", 0x6e4,  0x0414 },
+    { "Cyrillic_IE", 0x6e5,  0x0415 },
+    { "Cyrillic_EF", 0x6e6,  0x0424 },
+    { "Cyrillic_GHE", 0x6e7,  0x0413 },
+    { "Cyrillic_HA", 0x6e8,  0x0425 },
+    { "Cyrillic_I", 0x6e9,  0x0418 },
+    { "Cyrillic_SHORTI", 0x6ea,  0x0419 },
+    { "Cyrillic_KA", 0x6eb,  0x041a },
+    { "Cyrillic_EL", 0x6ec,  0x041b },
+    { "Cyrillic_EM", 0x6ed,  0x041c },
+    { "Cyrillic_EN", 0x6ee,  0x041d },
+    { "Cyrillic_O", 0x6ef,  0x041e },
+    { "Cyrillic_PE", 0x6f0,  0x041f },
+    { "Cyrillic_YA", 0x6f1,  0x042f },
+    { "Cyrillic_ER", 0x6f2,  0x0420 },
+    { "Cyrillic_ES", 0x6f3,  0x0421 },
+    { "Cyrillic_TE", 0x6f4,  0x0422 },
+    { "Cyrillic_U", 0x6f5,  0x0423 },
+    { "Cyrillic_ZHE", 0x6f6,  0x0416 },
+    { "Cyrillic_VE", 0x6f7,  0x0412 },
+    { "Cyrillic_SOFTSIGN", 0x6f8,  0x042c },
+    { "Cyrillic_YERU", 0x6f9,  0x042b },
+    { "Cyrillic_ZE", 0x6fa,  0x0417 },
+    { "Cyrillic_SHA", 0x6fb,  0x0428 },
+    { "Cyrillic_E", 0x6fc,  0x042d },
+    { "Cyrillic_SHCHA", 0x6fd,  0x0429 },
+    { "Cyrillic_CHE", 0x6fe,  0x0427 },
+    { "Cyrillic_HARDSIGN", 0x6ff,  0x042a },
+    { "Greek_ALPHAaccent", 0x7a1,  0x0386 },
+    { "Greek_EPSILONaccent", 0x7a2,  0x0388 },
+    { "Greek_ETAaccent", 0x7a3,  0x0389 },
+    { "Greek_IOTAaccent", 0x7a4,  0x038a },
+    { "Greek_IOTAdieresis", 0x7a5,  0x03aa },
+    { "Greek_IOTAdiaeresis", 0x7a5,  0x0000 },
+    { "Greek_OMICRONaccent", 0x7a7,  0x038c },
+    { "Greek_UPSILONaccent", 0x7a8,  0x038e },
+    { "Greek_UPSILONdieresis", 0x7a9,  0x03ab },
+    { "Greek_OMEGAaccent", 0x7ab,  0x038f },
+    { "Greek_accentdieresis", 0x7ae,  0x0385 },
+    { "Greek_horizbar", 0x7af,  0x2015 },
+    { "Greek_alphaaccent", 0x7b1,  0x03ac },
+    { "Greek_epsilonaccent", 0x7b2,  0x03ad },
+    { "Greek_etaaccent", 0x7b3,  0x03ae },
+    { "Greek_iotaaccent", 0x7b4,  0x03af },
+    { "Greek_iotadieresis", 0x7b5,  0x03ca },
+    { "Greek_iotaaccentdieresis", 0x7b6,  0x0390 },
+    { "Greek_omicronaccent", 0x7b7,  0x03cc },
+    { "Greek_upsilonaccent", 0x7b8,  0x03cd },
+    { "Greek_upsilondieresis", 0x7b9,  0x03cb },
+    { "Greek_upsilonaccentdieresis", 0x7ba,  0x03b0 },
+    { "Greek_omegaaccent", 0x7bb,  0x03ce },
+    { "Greek_ALPHA", 0x7c1,  0x0391 },
+    { "Greek_BETA", 0x7c2,  0x0392 },
+    { "Greek_GAMMA", 0x7c3,  0x0393 },
+    { "Greek_DELTA", 0x7c4,  0x0394 },
+    { "Greek_EPSILON", 0x7c5,  0x0395 },
+    { "Greek_ZETA", 0x7c6,  0x0396 },
+    { "Greek_ETA", 0x7c7,  0x0397 },
+    { "Greek_THETA", 0x7c8,  0x0398 },
+    { "Greek_IOTA", 0x7c9,  0x0399 },
+    { "Greek_KAPPA", 0x7ca,  0x039a },
+    { "Greek_LAMDA", 0x7cb,  0x039b },
+    { "Greek_LAMBDA", 0x7cb,  0x039b },
+    { "Greek_MU", 0x7cc,  0x039c },
+    { "Greek_NU", 0x7cd,  0x039d },
+    { "Greek_XI", 0x7ce,  0x039e },
+    { "Greek_OMICRON", 0x7cf,  0x039f },
+    { "Greek_PI", 0x7d0,  0x03a0 },
+    { "Greek_RHO", 0x7d1,  0x03a1 },
+    { "Greek_SIGMA", 0x7d2,  0x03a3 },
+    { "Greek_TAU", 0x7d4,  0x03a4 },
+    { "Greek_UPSILON", 0x7d5,  0x03a5 },
+    { "Greek_PHI", 0x7d6,  0x03a6 },
+    { "Greek_CHI", 0x7d7,  0x03a7 },
+    { "Greek_PSI", 0x7d8,  0x03a8 },
+    { "Greek_OMEGA", 0x7d9,  0x03a9 },
+    { "Greek_alpha", 0x7e1,  0x03b1 },
+    { "Greek_beta", 0x7e2,  0x03b2 },
+    { "Greek_gamma", 0x7e3,  0x03b3 },
+    { "Greek_delta", 0x7e4,  0x03b4 },
+    { "Greek_epsilon", 0x7e5,  0x03b5 },
+    { "Greek_zeta", 0x7e6,  0x03b6 },
+    { "Greek_eta", 0x7e7,  0x03b7 },
+    { "Greek_theta", 0x7e8,  0x03b8 },
+    { "Greek_iota", 0x7e9,  0x03b9 },
+    { "Greek_kappa", 0x7ea,  0x03ba },
+    { "Greek_lamda", 0x7eb,  0x03bb },
+    { "Greek_lambda", 0x7eb,  0x03bb },
+    { "Greek_mu", 0x7ec,  0x03bc },
+    { "Greek_nu", 0x7ed,  0x03bd },
+    { "Greek_xi", 0x7ee,  0x03be },
+    { "Greek_omicron", 0x7ef,  0x03bf },
+    { "Greek_pi", 0x7f0,  0x03c0 },
+    { "Greek_rho", 0x7f1,  0x03c1 },
+    { "Greek_sigma", 0x7f2,  0x03c3 },
+    { "Greek_finalsmallsigma", 0x7f3,  0x03c2 },
+    { "Greek_tau", 0x7f4,  0x03c4 },
+    { "Greek_upsilon", 0x7f5,  0x03c5 },
+    { "Greek_phi", 0x7f6,  0x03c6 },
+    { "Greek_chi", 0x7f7,  0x03c7 },
+    { "Greek_psi", 0x7f8,  0x03c8 },
+    { "Greek_omega", 0x7f9,  0x03c9 },
+    { "Greek_switch", 0xff7e,  0x0000 },
+    { "leftradical", 0x8a1,  0x23b7 },
+    { "topleftradical", 0x8a2,  0x0000 },
+    { "horizconnector", 0x8a3,  0x0000 },
+    { "topintegral", 0x8a4,  0x2320 },
+    { "botintegral", 0x8a5,  0x2321 },
+    { "vertconnector", 0x8a6,  0x0000 },
+    { "topleftsqbracket", 0x8a7,  0x23a1 },
+    { "botleftsqbracket", 0x8a8,  0x23a3 },
+    { "toprightsqbracket", 0x8a9,  0x23a4 },
+    { "botrightsqbracket", 0x8aa,  0x23a6 },
+    { "topleftparens", 0x8ab,  0x239b },
+    { "botleftparens", 0x8ac,  0x239d },
+    { "toprightparens", 0x8ad,  0x239e },
+    { "botrightparens", 0x8ae,  0x23a0 },
+    { "leftmiddlecurlybrace", 0x8af,  0x23a8 },
+    { "rightmiddlecurlybrace", 0x8b0,  0x23ac },
+    { "topleftsummation", 0x8b1,  0x0000 },
+    { "botleftsummation", 0x8b2,  0x0000 },
+    { "topvertsummationconnector", 0x8b3,  0x0000 },
+    { "botvertsummationconnector", 0x8b4,  0x0000 },
+    { "toprightsummation", 0x8b5,  0x0000 },
+    { "botrightsummation", 0x8b6,  0x0000 },
+    { "rightmiddlesummation", 0x8b7,  0x0000 },
+    { "lessthanequal", 0x8bc,  0x2264 },
+    { "notequal", 0x8bd,  0x2260 },
+    { "greaterthanequal", 0x8be,  0x2265 },
+    { "integral", 0x8bf,  0x222b },
+    { "therefore", 0x8c0,  0x2234 },
+    { "variation", 0x8c1,  0x221d },
+    { "infinity", 0x8c2,  0x221e },
+    { "nabla", 0x8c5,  0x2207 },
+    { "approximate", 0x8c8,  0x223c },
+    { "similarequal", 0x8c9,  0x2243 },
+    { "ifonlyif", 0x8cd,  0x21d4 },
+    { "implies", 0x8ce,  0x21d2 },
+    { "identical", 0x8cf,  0x2261 },
+    { "radical", 0x8d6,  0x221a },
+    { "includedin", 0x8da,  0x2282 },
+    { "includes", 0x8db,  0x2283 },
+    { "intersection", 0x8dc,  0x2229 },
+    { "union", 0x8dd,  0x222a },
+    { "logicaland", 0x8de,  0x2227 },
+    { "logicalor", 0x8df,  0x2228 },
+    { "partialderivative", 0x8ef,  0x2202 },
+    { "function", 0x8f6,  0x0192 },
+    { "leftarrow", 0x8fb,  0x2190 },
+    { "uparrow", 0x8fc,  0x2191 },
+    { "rightarrow", 0x8fd,  0x2192 },
+    { "downarrow", 0x8fe,  0x2193 },
+    { "blank", 0x9df,  0x0000 },
+    { "soliddiamond", 0x9e0,  0x25c6 },
+    { "checkerboard", 0x9e1,  0x2592 },
+    { "ht", 0x9e2,  0x2409 },
+    { "ff", 0x9e3,  0x240c },
+    { "cr", 0x9e4,  0x240d },
+    { "lf", 0x9e5,  0x240a },
+    { "nl", 0x9e8,  0x2424 },
+    { "vt", 0x9e9,  0x240b },
+    { "lowrightcorner", 0x9ea,  0x2518 },
+    { "uprightcorner", 0x9eb,  0x2510 },
+    { "upleftcorner", 0x9ec,  0x250c },
+    { "lowleftcorner", 0x9ed,  0x2514 },
+    { "crossinglines", 0x9ee,  0x253c },
+    { "horizlinescan1", 0x9ef,  0x23ba },
+    { "horizlinescan3", 0x9f0,  0x23bb },
+    { "horizlinescan5", 0x9f1,  0x2500 },
+    { "horizlinescan7", 0x9f2,  0x23bc },
+    { "horizlinescan9", 0x9f3,  0x23bd },
+    { "leftt", 0x9f4,  0x251c },
+    { "rightt", 0x9f5,  0x2524 },
+    { "bott", 0x9f6,  0x2534 },
+    { "topt", 0x9f7,  0x252c },
+    { "vertbar", 0x9f8,  0x2502 },
+    { "emspace", 0xaa1,  0x2003 },
+    { "enspace", 0xaa2,  0x2002 },
+    { "em3space", 0xaa3,  0x2004 },
+    { "em4space", 0xaa4,  0x2005 },
+    { "digitspace", 0xaa5,  0x2007 },
+    { "punctspace", 0xaa6,  0x2008 },
+    { "thinspace", 0xaa7,  0x2009 },
+    { "hairspace", 0xaa8,  0x200a },
+    { "emdash", 0xaa9,  0x2014 },
+    { "endash", 0xaaa,  0x2013 },
+    { "signifblank", 0xaac,  0x0000 },
+    { "ellipsis", 0xaae,  0x2026 },
+    { "doubbaselinedot", 0xaaf,  0x2025 },
+    { "onethird", 0xab0,  0x2153 },
+    { "twothirds", 0xab1,  0x2154 },
+    { "onefifth", 0xab2,  0x2155 },
+    { "twofifths", 0xab3,  0x2156 },
+    { "threefifths", 0xab4,  0x2157 },
+    { "fourfifths", 0xab5,  0x2158 },
+    { "onesixth", 0xab6,  0x2159 },
+    { "fivesixths", 0xab7,  0x215a },
+    { "careof", 0xab8,  0x2105 },
+    { "figdash", 0xabb,  0x2012 },
+    { "leftanglebracket", 0xabc,  0x0000 },
+    { "decimalpoint", 0xabd,  0x0000 },
+    { "rightanglebracket", 0xabe,  0x0000 },
+    { "marker", 0xabf,  0x0000 },
+    { "oneeighth", 0xac3,  0x215b },
+    { "threeeighths", 0xac4,  0x215c },
+    { "fiveeighths", 0xac5,  0x215d },
+    { "seveneighths", 0xac6,  0x215e },
+    { "trademark", 0xac9,  0x2122 },
+    { "signaturemark", 0xaca,  0x0000 },
+    { "trademarkincircle", 0xacb,  0x0000 },
+    { "leftopentriangle", 0xacc,  0x0000 },
+    { "rightopentriangle", 0xacd,  0x0000 },
+    { "emopencircle", 0xace,  0x0000 },
+    { "emopenrectangle", 0xacf,  0x0000 },
+    { "leftsinglequotemark", 0xad0,  0x2018 },
+    { "rightsinglequotemark", 0xad1,  0x2019 },
+    { "leftdoublequotemark", 0xad2,  0x201c },
+    { "rightdoublequotemark", 0xad3,  0x201d },
+    { "prescription", 0xad4,  0x211e },
+    { "permille", 0xad5,  0x2030 },
+    { "minutes", 0xad6,  0x2032 },
+    { "seconds", 0xad7,  0x2033 },
+    { "latincross", 0xad9,  0x271d },
+    { "hexagram", 0xada,  0x0000 },
+    { "filledrectbullet", 0xadb,  0x0000 },
+    { "filledlefttribullet", 0xadc,  0x0000 },
+    { "filledrighttribullet", 0xadd,  0x0000 },
+    { "emfilledcircle", 0xade,  0x0000 },
+    { "emfilledrect", 0xadf,  0x0000 },
+    { "enopencircbullet", 0xae0,  0x0000 },
+    { "enopensquarebullet", 0xae1,  0x0000 },
+    { "openrectbullet", 0xae2,  0x0000 },
+    { "opentribulletup", 0xae3,  0x0000 },
+    { "opentribulletdown", 0xae4,  0x0000 },
+    { "openstar", 0xae5,  0x0000 },
+    { "enfilledcircbullet", 0xae6,  0x0000 },
+    { "enfilledsqbullet", 0xae7,  0x0000 },
+    { "filledtribulletup", 0xae8,  0x0000 },
+    { "filledtribulletdown", 0xae9,  0x0000 },
+    { "leftpointer", 0xaea,  0x0000 },
+    { "rightpointer", 0xaeb,  0x0000 },
+    { "club", 0xaec,  0x2663 },
+    { "diamond", 0xaed,  0x2666 },
+    { "heart", 0xaee,  0x2665 },
+    { "maltesecross", 0xaf0,  0x2720 },
+    { "dagger", 0xaf1,  0x2020 },
+    { "doubledagger", 0xaf2,  0x2021 },
+    { "checkmark", 0xaf3,  0x2713 },
+    { "ballotcross", 0xaf4,  0x2717 },
+    { "musicalsharp", 0xaf5,  0x266f },
+    { "musicalflat", 0xaf6,  0x266d },
+    { "malesymbol", 0xaf7,  0x2642 },
+    { "femalesymbol", 0xaf8,  0x2640 },
+    { "telephone", 0xaf9,  0x260e },
+    { "telephonerecorder", 0xafa,  0x2315 },
+    { "phonographcopyright", 0xafb,  0x2117 },
+    { "caret", 0xafc,  0x2038 },
+    { "singlelowquotemark", 0xafd,  0x201a },
+    { "doublelowquotemark", 0xafe,  0x201e },
+    { "cursor", 0xaff,  0x0000 },
+    { "leftcaret", 0xba3,  0x0000 },
+    { "rightcaret", 0xba6,  0x0000 },
+    { "downcaret", 0xba8,  0x0000 },
+    { "upcaret", 0xba9,  0x0000 },
+    { "overbar", 0xbc0,  0x0000 },
+    { "downtack", 0xbc2,  0x22a4 },
+    { "upshoe", 0xbc3,  0x0000 },
+    { "downstile", 0xbc4,  0x230a },
+    { "underbar", 0xbc6,  0x0000 },
+    { "jot", 0xbca,  0x2218 },
+    { "quad", 0xbcc,  0x2395 },
+    { "uptack", 0xbce,  0x22a5 },
+    { "circle", 0xbcf,  0x25cb },
+    { "upstile", 0xbd3,  0x2308 },
+    { "downshoe", 0xbd6,  0x0000 },
+    { "rightshoe", 0xbd8,  0x0000 },
+    { "leftshoe", 0xbda,  0x0000 },
+    { "lefttack", 0xbdc,  0x22a3 },
+    { "righttack", 0xbfc,  0x22a2 },
+    { "hebrew_doublelowline", 0xcdf,  0x2017 },
+    { "hebrew_aleph", 0xce0,  0x05d0 },
+    { "hebrew_bet", 0xce1,  0x05d1 },
+    { "hebrew_beth", 0xce1,  0x0000 },
+    { "hebrew_gimel", 0xce2,  0x05d2 },
+    { "hebrew_gimmel", 0xce2,  0x0000 },
+    { "hebrew_dalet", 0xce3,  0x05d3 },
+    { "hebrew_daleth", 0xce3,  0x0000 },
+    { "hebrew_he", 0xce4,  0x05d4 },
+    { "hebrew_waw", 0xce5,  0x05d5 },
+    { "hebrew_zain", 0xce6,  0x05d6 },
+    { "hebrew_zayin", 0xce6,  0x0000 },
+    { "hebrew_chet", 0xce7,  0x05d7 },
+    { "hebrew_het", 0xce7,  0x0000 },
+    { "hebrew_tet", 0xce8,  0x05d8 },
+    { "hebrew_teth", 0xce8,  0x0000 },
+    { "hebrew_yod", 0xce9,  0x05d9 },
+    { "hebrew_finalkaph", 0xcea,  0x05da },
+    { "hebrew_kaph", 0xceb,  0x05db },
+    { "hebrew_lamed", 0xcec,  0x05dc },
+    { "hebrew_finalmem", 0xced,  0x05dd },
+    { "hebrew_mem", 0xcee,  0x05de },
+    { "hebrew_finalnun", 0xcef,  0x05df },
+    { "hebrew_nun", 0xcf0,  0x05e0 },
+    { "hebrew_samech", 0xcf1,  0x05e1 },
+    { "hebrew_samekh", 0xcf1,  0x0000 },
+    { "hebrew_ayin", 0xcf2,  0x05e2 },
+    { "hebrew_finalpe", 0xcf3,  0x05e3 },
+    { "hebrew_pe", 0xcf4,  0x05e4 },
+    { "hebrew_finalzade", 0xcf5,  0x05e5 },
+    { "hebrew_finalzadi", 0xcf5,  0x0000 },
+    { "hebrew_zade", 0xcf6,  0x05e6 },
+    { "hebrew_zadi", 0xcf6,  0x0000 },
+    { "hebrew_qoph", 0xcf7,  0x05e7 },
+    { "hebrew_kuf", 0xcf7,  0x0000 },
+    { "hebrew_resh", 0xcf8,  0x05e8 },
+    { "hebrew_shin", 0xcf9,  0x05e9 },
+    { "hebrew_taw", 0xcfa,  0x05ea },
+    { "hebrew_taf", 0xcfa,  0x0000 },
+    { "Hebrew_switch", 0xff7e,  0x0000 },
+    { "Thai_kokai", 0xda1,  0x0e01 },
+    { "Thai_khokhai", 0xda2,  0x0e02 },
+    { "Thai_khokhuat", 0xda3,  0x0e03 },
+    { "Thai_khokhwai", 0xda4,  0x0e04 },
+    { "Thai_khokhon", 0xda5,  0x0e05 },
+    { "Thai_khorakhang", 0xda6,  0x0e06 },
+    { "Thai_ngongu", 0xda7,  0x0e07 },
+    { "Thai_chochan", 0xda8,  0x0e08 },
+    { "Thai_choching", 0xda9,  0x0e09 },
+    { "Thai_chochang", 0xdaa,  0x0e0a },
+    { "Thai_soso", 0xdab,  0x0e0b },
+    { "Thai_chochoe", 0xdac,  0x0e0c },
+    { "Thai_yoying", 0xdad,  0x0e0d },
+    { "Thai_dochada", 0xdae,  0x0e0e },
+    { "Thai_topatak", 0xdaf,  0x0e0f },
+    { "Thai_thothan", 0xdb0,  0x0e10 },
+    { "Thai_thonangmontho", 0xdb1,  0x0e11 },
+    { "Thai_thophuthao", 0xdb2,  0x0e12 },
+    { "Thai_nonen", 0xdb3,  0x0e13 },
+    { "Thai_dodek", 0xdb4,  0x0e14 },
+    { "Thai_totao", 0xdb5,  0x0e15 },
+    { "Thai_thothung", 0xdb6,  0x0e16 },
+    { "Thai_thothahan", 0xdb7,  0x0e17 },
+    { "Thai_thothong", 0xdb8,  0x0e18 },
+    { "Thai_nonu", 0xdb9,  0x0e19 },
+    { "Thai_bobaimai", 0xdba,  0x0e1a },
+    { "Thai_popla", 0xdbb,  0x0e1b },
+    { "Thai_phophung", 0xdbc,  0x0e1c },
+    { "Thai_fofa", 0xdbd,  0x0e1d },
+    { "Thai_phophan", 0xdbe,  0x0e1e },
+    { "Thai_fofan", 0xdbf,  0x0e1f },
+    { "Thai_phosamphao", 0xdc0,  0x0e20 },
+    { "Thai_moma", 0xdc1,  0x0e21 },
+    { "Thai_yoyak", 0xdc2,  0x0e22 },
+    { "Thai_rorua", 0xdc3,  0x0e23 },
+    { "Thai_ru", 0xdc4,  0x0e24 },
+    { "Thai_loling", 0xdc5,  0x0e25 },
+    { "Thai_lu", 0xdc6,  0x0e26 },
+    { "Thai_wowaen", 0xdc7,  0x0e27 },
+    { "Thai_sosala", 0xdc8,  0x0e28 },
+    { "Thai_sorusi", 0xdc9,  0x0e29 },
+    { "Thai_sosua", 0xdca,  0x0e2a },
+    { "Thai_hohip", 0xdcb,  0x0e2b },
+    { "Thai_lochula", 0xdcc,  0x0e2c },
+    { "Thai_oang", 0xdcd,  0x0e2d },
+    { "Thai_honokhuk", 0xdce,  0x0e2e },
+    { "Thai_paiyannoi", 0xdcf,  0x0e2f },
+    { "Thai_saraa", 0xdd0,  0x0e30 },
+    { "Thai_maihanakat", 0xdd1,  0x0e31 },
+    { "Thai_saraaa", 0xdd2,  0x0e32 },
+    { "Thai_saraam", 0xdd3,  0x0e33 },
+    { "Thai_sarai", 0xdd4,  0x0e34 },
+    { "Thai_saraii", 0xdd5,  0x0e35 },
+    { "Thai_saraue", 0xdd6,  0x0e36 },
+    { "Thai_sarauee", 0xdd7,  0x0e37 },
+    { "Thai_sarau", 0xdd8,  0x0e38 },
+    { "Thai_sarauu", 0xdd9,  0x0e39 },
+    { "Thai_phinthu", 0xdda,  0x0e3a },
+    { "Thai_maihanakat_maitho", 0xdde,  0x0000 },
+    { "Thai_baht", 0xddf,  0x0e3f },
+    { "Thai_sarae", 0xde0,  0x0e40 },
+    { "Thai_saraae", 0xde1,  0x0e41 },
+    { "Thai_sarao", 0xde2,  0x0e42 },
+    { "Thai_saraaimaimuan", 0xde3,  0x0e43 },
+    { "Thai_saraaimaimalai", 0xde4,  0x0e44 },
+    { "Thai_lakkhangyao", 0xde5,  0x0e45 },
+    { "Thai_maiyamok", 0xde6,  0x0e46 },
+    { "Thai_maitaikhu", 0xde7,  0x0e47 },
+    { "Thai_maiek", 0xde8,  0x0e48 },
+    { "Thai_maitho", 0xde9,  0x0e49 },
+    { "Thai_maitri", 0xdea,  0x0e4a },
+    { "Thai_maichattawa", 0xdeb,  0x0e4b },
+    { "Thai_thanthakhat", 0xdec,  0x0e4c },
+    { "Thai_nikhahit", 0xded,  0x0e4d },
+    { "Thai_leksun", 0xdf0,  0x0e50 },
+    { "Thai_leknung", 0xdf1,  0x0e51 },
+    { "Thai_leksong", 0xdf2,  0x0e52 },
+    { "Thai_leksam", 0xdf3,  0x0e53 },
+    { "Thai_leksi", 0xdf4,  0x0e54 },
+    { "Thai_lekha", 0xdf5,  0x0e55 },
+    { "Thai_lekhok", 0xdf6,  0x0e56 },
+    { "Thai_lekchet", 0xdf7,  0x0e57 },
+    { "Thai_lekpaet", 0xdf8,  0x0e58 },
+    { "Thai_lekkao", 0xdf9,  0x0e59 },
+    { "Hangul", 0xff31,  0x0000 },
+    { "Hangul_Start", 0xff32,  0x0000 },
+    { "Hangul_End", 0xff33,  0x0000 },
+    { "Hangul_Hanja", 0xff34,  0x0000 },
+    { "Hangul_Jamo", 0xff35,  0x0000 },
+    { "Hangul_Romaja", 0xff36,  0x0000 },
+    { "Hangul_Codeinput", 0xff37,  0x0000 },
+    { "Hangul_Jeonja", 0xff38,  0x0000 },
+    { "Hangul_Banja", 0xff39,  0x0000 },
+    { "Hangul_PreHanja", 0xff3a,  0x0000 },
+    { "Hangul_PostHanja", 0xff3b,  0x0000 },
+    { "Hangul_SingleCandidate", 0xff3c,  0x0000 },
+    { "Hangul_MultipleCandidate", 0xff3d,  0x0000 },
+    { "Hangul_PreviousCandidate", 0xff3e,  0x0000 },
+    { "Hangul_Special", 0xff3f,  0x0000 },
+    { "Hangul_switch", 0xff7e,  0x0000 },
+    { "Hangul_Kiyeog", 0xea1,  0x0000 },
+    { "Hangul_SsangKiyeog", 0xea2,  0x0000 },
+    { "Hangul_KiyeogSios", 0xea3,  0x0000 },
+    { "Hangul_Nieun", 0xea4,  0x0000 },
+    { "Hangul_NieunJieuj", 0xea5,  0x0000 },
+    { "Hangul_NieunHieuh", 0xea6,  0x0000 },
+    { "Hangul_Dikeud", 0xea7,  0x0000 },
+    { "Hangul_SsangDikeud", 0xea8,  0x0000 },
+    { "Hangul_Rieul", 0xea9,  0x0000 },
+    { "Hangul_RieulKiyeog", 0xeaa,  0x0000 },
+    { "Hangul_RieulMieum", 0xeab,  0x0000 },
+    { "Hangul_RieulPieub", 0xeac,  0x0000 },
+    { "Hangul_RieulSios", 0xead,  0x0000 },
+    { "Hangul_RieulTieut", 0xeae,  0x0000 },
+    { "Hangul_RieulPhieuf", 0xeaf,  0x0000 },
+    { "Hangul_RieulHieuh", 0xeb0,  0x0000 },
+    { "Hangul_Mieum", 0xeb1,  0x0000 },
+    { "Hangul_Pieub", 0xeb2,  0x0000 },
+    { "Hangul_SsangPieub", 0xeb3,  0x0000 },
+    { "Hangul_PieubSios", 0xeb4,  0x0000 },
+    { "Hangul_Sios", 0xeb5,  0x0000 },
+    { "Hangul_SsangSios", 0xeb6,  0x0000 },
+    { "Hangul_Ieung", 0xeb7,  0x0000 },
+    { "Hangul_Jieuj", 0xeb8,  0x0000 },
+    { "Hangul_SsangJieuj", 0xeb9,  0x0000 },
+    { "Hangul_Cieuc", 0xeba,  0x0000 },
+    { "Hangul_Khieuq", 0xebb,  0x0000 },
+    { "Hangul_Tieut", 0xebc,  0x0000 },
+    { "Hangul_Phieuf", 0xebd,  0x0000 },
+    { "Hangul_Hieuh", 0xebe,  0x0000 },
+    { "Hangul_A", 0xebf,  0x0000 },
+    { "Hangul_AE", 0xec0,  0x0000 },
+    { "Hangul_YA", 0xec1,  0x0000 },
+    { "Hangul_YAE", 0xec2,  0x0000 },
+    { "Hangul_EO", 0xec3,  0x0000 },
+    { "Hangul_E", 0xec4,  0x0000 },
+    { "Hangul_YEO", 0xec5,  0x0000 },
+    { "Hangul_YE", 0xec6,  0x0000 },
+    { "Hangul_O", 0xec7,  0x0000 },
+    { "Hangul_WA", 0xec8,  0x0000 },
+    { "Hangul_WAE", 0xec9,  0x0000 },
+    { "Hangul_OE", 0xeca,  0x0000 },
+    { "Hangul_YO", 0xecb,  0x0000 },
+    { "Hangul_U", 0xecc,  0x0000 },
+    { "Hangul_WEO", 0xecd,  0x0000 },
+    { "Hangul_WE", 0xece,  0x0000 },
+    { "Hangul_WI", 0xecf,  0x0000 },
+    { "Hangul_YU", 0xed0,  0x0000 },
+    { "Hangul_EU", 0xed1,  0x0000 },
+    { "Hangul_YI", 0xed2,  0x0000 },
+    { "Hangul_I", 0xed3,  0x0000 },
+    { "Hangul_J_Kiyeog", 0xed4,  0x0000 },
+    { "Hangul_J_SsangKiyeog", 0xed5,  0x0000 },
+    { "Hangul_J_KiyeogSios", 0xed6,  0x0000 },
+    { "Hangul_J_Nieun", 0xed7,  0x0000 },
+    { "Hangul_J_NieunJieuj", 0xed8,  0x0000 },
+    { "Hangul_J_NieunHieuh", 0xed9,  0x0000 },
+    { "Hangul_J_Dikeud", 0xeda,  0x0000 },
+    { "Hangul_J_Rieul", 0xedb,  0x0000 },
+    { "Hangul_J_RieulKiyeog", 0xedc,  0x0000 },
+    { "Hangul_J_RieulMieum", 0xedd,  0x0000 },
+    { "Hangul_J_RieulPieub", 0xede,  0x0000 },
+    { "Hangul_J_RieulSios", 0xedf,  0x0000 },
+    { "Hangul_J_RieulTieut", 0xee0,  0x0000 },
+    { "Hangul_J_RieulPhieuf", 0xee1,  0x0000 },
+    { "Hangul_J_RieulHieuh", 0xee2,  0x0000 },
+    { "Hangul_J_Mieum", 0xee3,  0x0000 },
+    { "Hangul_J_Pieub", 0xee4,  0x0000 },
+    { "Hangul_J_PieubSios", 0xee5,  0x0000 },
+    { "Hangul_J_Sios", 0xee6,  0x0000 },
+    { "Hangul_J_SsangSios", 0xee7,  0x0000 },
+    { "Hangul_J_Ieung", 0xee8,  0x0000 },
+    { "Hangul_J_Jieuj", 0xee9,  0x0000 },
+    { "Hangul_J_Cieuc", 0xeea,  0x0000 },
+    { "Hangul_J_Khieuq", 0xeeb,  0x0000 },
+    { "Hangul_J_Tieut", 0xeec,  0x0000 },
+    { "Hangul_J_Phieuf", 0xeed,  0x0000 },
+    { "Hangul_J_Hieuh", 0xeee,  0x0000 },
+    { "Hangul_RieulYeorinHieuh", 0xeef,  0x0000 },
+    { "Hangul_SunkyeongeumMieum", 0xef0,  0x0000 },
+    { "Hangul_SunkyeongeumPieub", 0xef1,  0x0000 },
+    { "Hangul_PanSios", 0xef2,  0x0000 },
+    { "Hangul_KkogjiDalrinIeung", 0xef3,  0x0000 },
+    { "Hangul_SunkyeongeumPhieuf", 0xef4,  0x0000 },
+    { "Hangul_YeorinHieuh", 0xef5,  0x0000 },
+    { "Hangul_AraeA", 0xef6,  0x0000 },
+    { "Hangul_AraeAE", 0xef7,  0x0000 },
+    { "Hangul_J_PanSios", 0xef8,  0x0000 },
+    { "Hangul_J_KkogjiDalrinIeung", 0xef9,  0x0000 },
+    { "Hangul_J_YeorinHieuh", 0xefa,  0x0000 },
+    { "Korean_Won", 0xeff,  0x0000 },
+    { "Armenian_ligature_ew", 0x1000587,  0x0587 },
+    { "Armenian_full_stop", 0x1000589,  0x0589 },
+    { "Armenian_verjaket", 0x1000589,  0x0589 },
+    { "Armenian_separation_mark", 0x100055d,  0x055d },
+    { "Armenian_but", 0x100055d,  0x055d },
+    { "Armenian_hyphen", 0x100058a,  0x058a },
+    { "Armenian_yentamna", 0x100058a,  0x058a },
+    { "Armenian_exclam", 0x100055c,  0x055c },
+    { "Armenian_amanak", 0x100055c,  0x055c },
+    { "Armenian_accent", 0x100055b,  0x055b },
+    { "Armenian_shesht", 0x100055b,  0x055b },
+    { "Armenian_question", 0x100055e,  0x055e },
+    { "Armenian_paruyk", 0x100055e,  0x055e },
+    { "Armenian_AYB", 0x1000531,  0x0531 },
+    { "Armenian_ayb", 0x1000561,  0x0561 },
+    { "Armenian_BEN", 0x1000532,  0x0532 },
+    { "Armenian_ben", 0x1000562,  0x0562 },
+    { "Armenian_GIM", 0x1000533,  0x0533 },
+    { "Armenian_gim", 0x1000563,  0x0563 },
+    { "Armenian_DA", 0x1000534,  0x0534 },
+    { "Armenian_da", 0x1000564,  0x0564 },
+    { "Armenian_YECH", 0x1000535,  0x0535 },
+    { "Armenian_yech", 0x1000565,  0x0565 },
+    { "Armenian_ZA", 0x1000536,  0x0536 },
+    { "Armenian_za", 0x1000566,  0x0566 },
+    { "Armenian_E", 0x1000537,  0x0537 },
+    { "Armenian_e", 0x1000567,  0x0567 },
+    { "Armenian_AT", 0x1000538,  0x0538 },
+    { "Armenian_at", 0x1000568,  0x0568 },
+    { "Armenian_TO", 0x1000539,  0x0539 },
+    { "Armenian_to", 0x1000569,  0x0569 },
+    { "Armenian_ZHE", 0x100053a,  0x053a },
+    { "Armenian_zhe", 0x100056a,  0x056a },
+    { "Armenian_INI", 0x100053b,  0x053b },
+    { "Armenian_ini", 0x100056b,  0x056b },
+    { "Armenian_LYUN", 0x100053c,  0x053c },
+    { "Armenian_lyun", 0x100056c,  0x056c },
+    { "Armenian_KHE", 0x100053d,  0x053d },
+    { "Armenian_khe", 0x100056d,  0x056d },
+    { "Armenian_TSA", 0x100053e,  0x053e },
+    { "Armenian_tsa", 0x100056e,  0x056e },
+    { "Armenian_KEN", 0x100053f,  0x053f },
+    { "Armenian_ken", 0x100056f,  0x056f },
+    { "Armenian_HO", 0x1000540,  0x0540 },
+    { "Armenian_ho", 0x1000570,  0x0570 },
+    { "Armenian_DZA", 0x1000541,  0x0541 },
+    { "Armenian_dza", 0x1000571,  0x0571 },
+    { "Armenian_GHAT", 0x1000542,  0x0542 },
+    { "Armenian_ghat", 0x1000572,  0x0572 },
+    { "Armenian_TCHE", 0x1000543,  0x0543 },
+    { "Armenian_tche", 0x1000573,  0x0573 },
+    { "Armenian_MEN", 0x1000544,  0x0544 },
+    { "Armenian_men", 0x1000574,  0x0574 },
+    { "Armenian_HI", 0x1000545,  0x0545 },
+    { "Armenian_hi", 0x1000575,  0x0575 },
+    { "Armenian_NU", 0x1000546,  0x0546 },
+    { "Armenian_nu", 0x1000576,  0x0576 },
+    { "Armenian_SHA", 0x1000547,  0x0547 },
+    { "Armenian_sha", 0x1000577,  0x0577 },
+    { "Armenian_VO", 0x1000548,  0x0548 },
+    { "Armenian_vo", 0x1000578,  0x0578 },
+    { "Armenian_CHA", 0x1000549,  0x0549 },
+    { "Armenian_cha", 0x1000579,  0x0579 },
+    { "Armenian_PE", 0x100054a,  0x054a },
+    { "Armenian_pe", 0x100057a,  0x057a },
+    { "Armenian_JE", 0x100054b,  0x054b },
+    { "Armenian_je", 0x100057b,  0x057b },
+    { "Armenian_RA", 0x100054c,  0x054c },
+    { "Armenian_ra", 0x100057c,  0x057c },
+    { "Armenian_SE", 0x100054d,  0x054d },
+    { "Armenian_se", 0x100057d,  0x057d },
+    { "Armenian_VEV", 0x100054e,  0x054e },
+    { "Armenian_vev", 0x100057e,  0x057e },
+    { "Armenian_TYUN", 0x100054f,  0x054f },
+    { "Armenian_tyun", 0x100057f,  0x057f },
+    { "Armenian_RE", 0x1000550,  0x0550 },
+    { "Armenian_re", 0x1000580,  0x0580 },
+    { "Armenian_TSO", 0x1000551,  0x0551 },
+    { "Armenian_tso", 0x1000581,  0x0581 },
+    { "Armenian_VYUN", 0x1000552,  0x0552 },
+    { "Armenian_vyun", 0x1000582,  0x0582 },
+    { "Armenian_PYUR", 0x1000553,  0x0553 },
+    { "Armenian_pyur", 0x1000583,  0x0583 },
+    { "Armenian_KE", 0x1000554,  0x0554 },
+    { "Armenian_ke", 0x1000584,  0x0584 },
+    { "Armenian_O", 0x1000555,  0x0555 },
+    { "Armenian_o", 0x1000585,  0x0585 },
+    { "Armenian_FE", 0x1000556,  0x0556 },
+    { "Armenian_fe", 0x1000586,  0x0586 },
+    { "Armenian_apostrophe", 0x100055a,  0x055a },
+    { "Georgian_an", 0x10010d0,  0x10d0 },
+    { "Georgian_ban", 0x10010d1,  0x10d1 },
+    { "Georgian_gan", 0x10010d2,  0x10d2 },
+    { "Georgian_don", 0x10010d3,  0x10d3 },
+    { "Georgian_en", 0x10010d4,  0x10d4 },
+    { "Georgian_vin", 0x10010d5,  0x10d5 },
+    { "Georgian_zen", 0x10010d6,  0x10d6 },
+    { "Georgian_tan", 0x10010d7,  0x10d7 },
+    { "Georgian_in", 0x10010d8,  0x10d8 },
+    { "Georgian_kan", 0x10010d9,  0x10d9 },
+    { "Georgian_las", 0x10010da,  0x10da },
+    { "Georgian_man", 0x10010db,  0x10db },
+    { "Georgian_nar", 0x10010dc,  0x10dc },
+    { "Georgian_on", 0x10010dd,  0x10dd },
+    { "Georgian_par", 0x10010de,  0x10de },
+    { "Georgian_zhar", 0x10010df,  0x10df },
+    { "Georgian_rae", 0x10010e0,  0x10e0 },
+    { "Georgian_san", 0x10010e1,  0x10e1 },
+    { "Georgian_tar", 0x10010e2,  0x10e2 },
+    { "Georgian_un", 0x10010e3,  0x10e3 },
+    { "Georgian_phar", 0x10010e4,  0x10e4 },
+    { "Georgian_khar", 0x10010e5,  0x10e5 },
+    { "Georgian_ghan", 0x10010e6,  0x10e6 },
+    { "Georgian_qar", 0x10010e7,  0x10e7 },
+    { "Georgian_shin", 0x10010e8,  0x10e8 },
+    { "Georgian_chin", 0x10010e9,  0x10e9 },
+    { "Georgian_can", 0x10010ea,  0x10ea },
+    { "Georgian_jil", 0x10010eb,  0x10eb },
+    { "Georgian_cil", 0x10010ec,  0x10ec },
+    { "Georgian_char", 0x10010ed,  0x10ed },
+    { "Georgian_xan", 0x10010ee,  0x10ee },
+    { "Georgian_jhan", 0x10010ef,  0x10ef },
+    { "Georgian_hae", 0x10010f0,  0x10f0 },
+    { "Georgian_he", 0x10010f1,  0x10f1 },
+    { "Georgian_hie", 0x10010f2,  0x10f2 },
+    { "Georgian_we", 0x10010f3,  0x10f3 },
+    { "Georgian_har", 0x10010f4,  0x10f4 },
+    { "Georgian_hoe", 0x10010f5,  0x10f5 },
+    { "Georgian_fi", 0x10010f6,  0x10f6 },
+    { "Xabovedot", 0x1001e8a,  0x1e8a },
+    { "Ibreve", 0x100012c,  0x012c },
+    { "Zstroke", 0x10001b5,  0x01b5 },
+    { "Gcaron", 0x10001e6,  0x01e6 },
+    { "Ocaron", 0x10001d1,  0x01d2 },
+    { "Obarred", 0x100019f,  0x019f },
+    { "xabovedot", 0x1001e8b,  0x1e8b },
+    { "ibreve", 0x100012d,  0x012d },
+    { "zstroke", 0x10001b6,  0x01b6 },
+    { "gcaron", 0x10001e7,  0x01e7 },
+    { "ocaron", 0x10001d2,  0x01d2 },
+    { "obarred", 0x1000275,  0x0275 },
+    { "SCHWA", 0x100018f,  0x018f },
+    { "schwa", 0x1000259,  0x0259 },
+    { "EZH", 0x10001b7,  0x01b7 },
+    { "ezh", 0x1000292,  0x0292 },
+    { "Lbelowdot", 0x1001e36,  0x1e36 },
+    { "lbelowdot", 0x1001e37,  0x1e37 },
+    { "Abelowdot", 0x1001ea0,  0x1ea0 },
+    { "abelowdot", 0x1001ea1,  0x1ea1 },
+    { "Ahook", 0x1001ea2,  0x1ea2 },
+    { "ahook", 0x1001ea3,  0x1ea3 },
+    { "Acircumflexacute", 0x1001ea4,  0x1ea4 },
+    { "acircumflexacute", 0x1001ea5,  0x1ea5 },
+    { "Acircumflexgrave", 0x1001ea6,  0x1ea6 },
+    { "acircumflexgrave", 0x1001ea7,  0x1ea7 },
+    { "Acircumflexhook", 0x1001ea8,  0x1ea8 },
+    { "acircumflexhook", 0x1001ea9,  0x1ea9 },
+    { "Acircumflextilde", 0x1001eaa,  0x1eaa },
+    { "acircumflextilde", 0x1001eab,  0x1eab },
+    { "Acircumflexbelowdot", 0x1001eac,  0x1eac },
+    { "acircumflexbelowdot", 0x1001ead,  0x1ead },
+    { "Abreveacute", 0x1001eae,  0x1eae },
+    { "abreveacute", 0x1001eaf,  0x1eaf },
+    { "Abrevegrave", 0x1001eb0,  0x1eb0 },
+    { "abrevegrave", 0x1001eb1,  0x1eb1 },
+    { "Abrevehook", 0x1001eb2,  0x1eb2 },
+    { "abrevehook", 0x1001eb3,  0x1eb3 },
+    { "Abrevetilde", 0x1001eb4,  0x1eb4 },
+    { "abrevetilde", 0x1001eb5,  0x1eb5 },
+    { "Abrevebelowdot", 0x1001eb6,  0x1eb6 },
+    { "abrevebelowdot", 0x1001eb7,  0x1eb7 },
+    { "Ebelowdot", 0x1001eb8,  0x1eb8 },
+    { "ebelowdot", 0x1001eb9,  0x1eb9 },
+    { "Ehook", 0x1001eba,  0x1eba },
+    { "ehook", 0x1001ebb,  0x1ebb },
+    { "Etilde", 0x1001ebc,  0x1ebc },
+    { "etilde", 0x1001ebd,  0x1ebd },
+    { "Ecircumflexacute", 0x1001ebe,  0x1ebe },
+    { "ecircumflexacute", 0x1001ebf,  0x1ebf },
+    { "Ecircumflexgrave", 0x1001ec0,  0x1ec0 },
+    { "ecircumflexgrave", 0x1001ec1,  0x1ec1 },
+    { "Ecircumflexhook", 0x1001ec2,  0x1ec2 },
+    { "ecircumflexhook", 0x1001ec3,  0x1ec3 },
+    { "Ecircumflextilde", 0x1001ec4,  0x1ec4 },
+    { "ecircumflextilde", 0x1001ec5,  0x1ec5 },
+    { "Ecircumflexbelowdot", 0x1001ec6,  0x1ec6 },
+    { "ecircumflexbelowdot", 0x1001ec7,  0x1ec7 },
+    { "Ihook", 0x1001ec8,  0x1ec8 },
+    { "ihook", 0x1001ec9,  0x1ec9 },
+    { "Ibelowdot", 0x1001eca,  0x1eca },
+    { "ibelowdot", 0x1001ecb,  0x1ecb },
+    { "Obelowdot", 0x1001ecc,  0x1ecc },
+    { "obelowdot", 0x1001ecd,  0x1ecd },
+    { "Ohook", 0x1001ece,  0x1ece },
+    { "ohook", 0x1001ecf,  0x1ecf },
+    { "Ocircumflexacute", 0x1001ed0,  0x1ed0 },
+    { "ocircumflexacute", 0x1001ed1,  0x1ed1 },
+    { "Ocircumflexgrave", 0x1001ed2,  0x1ed2 },
+    { "ocircumflexgrave", 0x1001ed3,  0x1ed3 },
+    { "Ocircumflexhook", 0x1001ed4,  0x1ed4 },
+    { "ocircumflexhook", 0x1001ed5,  0x1ed5 },
+    { "Ocircumflextilde", 0x1001ed6,  0x1ed6 },
+    { "ocircumflextilde", 0x1001ed7,  0x1ed7 },
+    { "Ocircumflexbelowdot", 0x1001ed8,  0x1ed8 },
+    { "ocircumflexbelowdot", 0x1001ed9,  0x1ed9 },
+    { "Ohornacute", 0x1001eda,  0x1eda },
+    { "ohornacute", 0x1001edb,  0x1edb },
+    { "Ohorngrave", 0x1001edc,  0x1edc },
+    { "ohorngrave", 0x1001edd,  0x1edd },
+    { "Ohornhook", 0x1001ede,  0x1ede },
+    { "ohornhook", 0x1001edf,  0x1edf },
+    { "Ohorntilde", 0x1001ee0,  0x1ee0 },
+    { "ohorntilde", 0x1001ee1,  0x1ee1 },
+    { "Ohornbelowdot", 0x1001ee2,  0x1ee2 },
+    { "ohornbelowdot", 0x1001ee3,  0x1ee3 },
+    { "Ubelowdot", 0x1001ee4,  0x1ee4 },
+    { "ubelowdot", 0x1001ee5,  0x1ee5 },
+    { "Uhook", 0x1001ee6,  0x1ee6 },
+    { "uhook", 0x1001ee7,  0x1ee7 },
+    { "Uhornacute", 0x1001ee8,  0x1ee8 },
+    { "uhornacute", 0x1001ee9,  0x1ee9 },
+    { "Uhorngrave", 0x1001eea,  0x1eea },
+    { "uhorngrave", 0x1001eeb,  0x1eeb },
+    { "Uhornhook", 0x1001eec,  0x1eec },
+    { "uhornhook", 0x1001eed,  0x1eed },
+    { "Uhorntilde", 0x1001eee,  0x1eee },
+    { "uhorntilde", 0x1001eef,  0x1eef },
+    { "Uhornbelowdot", 0x1001ef0,  0x1ef0 },
+    { "uhornbelowdot", 0x1001ef1,  0x1ef1 },
+    { "Ybelowdot", 0x1001ef4,  0x1ef4 },
+    { "ybelowdot", 0x1001ef5,  0x1ef5 },
+    { "Yhook", 0x1001ef6,  0x1ef6 },
+    { "yhook", 0x1001ef7,  0x1ef7 },
+    { "Ytilde", 0x1001ef8,  0x1ef8 },
+    { "ytilde", 0x1001ef9,  0x1ef9 },
+    { "Ohorn", 0x10001a0,  0x01a0 },
+    { "ohorn", 0x10001a1,  0x01a1 },
+    { "Uhorn", 0x10001af,  0x01af },
+    { "uhorn", 0x10001b0,  0x01b0 },
+    { "EcuSign", 0x10020a0,  0x20a0 },
+    { "ColonSign", 0x10020a1,  0x20a1 },
+    { "CruzeiroSign", 0x10020a2,  0x20a2 },
+    { "FFrancSign", 0x10020a3,  0x20a3 },
+    { "LiraSign", 0x10020a4,  0x20a4 },
+    { "MillSign", 0x10020a5,  0x20a5 },
+    { "NairaSign", 0x10020a6,  0x20a6 },
+    { "PesetaSign", 0x10020a7,  0x20a7 },
+    { "RupeeSign", 0x10020a8,  0x20a8 },
+    { "WonSign", 0x10020a9,  0x20a9 },
+    { "NewSheqelSign", 0x10020aa,  0x20aa },
+    { "DongSign", 0x10020ab,  0x20ab },
+    { "EuroSign", 0x20ac,  0x20ac },
+    { "zerosuperior", 0x1002070,  0x2070 },
+    { "foursuperior", 0x1002074,  0x2074 },
+    { "fivesuperior", 0x1002075,  0x2075 },
+    { "sixsuperior", 0x1002076,  0x2076 },
+    { "sevensuperior", 0x1002077,  0x2077 },
+    { "eightsuperior", 0x1002078,  0x2078 },
+    { "ninesuperior", 0x1002079,  0x2079 },
+    { "zerosubscript", 0x1002080,  0x2080 },
+    { "onesubscript", 0x1002081,  0x2081 },
+    { "twosubscript", 0x1002082,  0x2082 },
+    { "threesubscript", 0x1002083,  0x2083 },
+    { "foursubscript", 0x1002084,  0x2084 },
+    { "fivesubscript", 0x1002085,  0x2085 },
+    { "sixsubscript", 0x1002086,  0x2086 },
+    { "sevensubscript", 0x1002087,  0x2087 },
+    { "eightsubscript", 0x1002088,  0x2088 },
+    { "ninesubscript", 0x1002089,  0x2089 },
+    { "partdifferential", 0x1002202,  0x2202 },
+    { "emptyset", 0x1002205,  0x2205 },
+    { "elementof", 0x1002208,  0x2208 },
+    { "notelementof", 0x1002209,  0x2209 },
+    { "containsas", 0x100220b,  0x220b },
+    { "squareroot", 0x100221a,  0x221a },
+    { "cuberoot", 0x100221b,  0x221b },
+    { "fourthroot", 0x100221c,  0x221c },
+    { "dintegral", 0x100222c,  0x222c },
+    { "tintegral", 0x100222d,  0x222d },
+    { "because", 0x1002235,  0x2235 },
+    { "approxeq", 0x1002248,  0x2245 },
+    { "notapproxeq", 0x1002247,  0x2247 },
+    { "notidentical", 0x1002262,  0x2262 },
+    { "stricteq", 0x1002263,  0x2263 },
+    { "braille_dot_1", 0xfff1,  0x0000 },
+    { "braille_dot_2", 0xfff2,  0x0000 },
+    { "braille_dot_3", 0xfff3,  0x0000 },
+    { "braille_dot_4", 0xfff4,  0x0000 },
+    { "braille_dot_5", 0xfff5,  0x0000 },
+    { "braille_dot_6", 0xfff6,  0x0000 },
+    { "braille_dot_7", 0xfff7,  0x0000 },
+    { "braille_dot_8", 0xfff8,  0x0000 },
+    { "braille_dot_9", 0xfff9,  0x0000 },
+    { "braille_dot_10", 0xfffa,  0x0000 },
+    { "braille_blank", 0x1002800,  0x2800 },
+    { "braille_dots_1", 0x1002801,  0x2801 },
+    { "braille_dots_2", 0x1002802,  0x2802 },
+    { "braille_dots_12", 0x1002803,  0x2803 },
+    { "braille_dots_3", 0x1002804,  0x2804 },
+    { "braille_dots_13", 0x1002805,  0x2805 },
+    { "braille_dots_23", 0x1002806,  0x2806 },
+    { "braille_dots_123", 0x1002807,  0x2807 },
+    { "braille_dots_4", 0x1002808,  0x2808 },
+    { "braille_dots_14", 0x1002809,  0x2809 },
+    { "braille_dots_24", 0x100280a,  0x280a },
+    { "braille_dots_124", 0x100280b,  0x280b },
+    { "braille_dots_34", 0x100280c,  0x280c },
+    { "braille_dots_134", 0x100280d,  0x280d },
+    { "braille_dots_234", 0x100280e,  0x280e },
+    { "braille_dots_1234", 0x100280f,  0x280f },
+    { "braille_dots_5", 0x1002810,  0x2810 },
+    { "braille_dots_15", 0x1002811,  0x2811 },
+    { "braille_dots_25", 0x1002812,  0x2812 },
+    { "braille_dots_125", 0x1002813,  0x2813 },
+    { "braille_dots_35", 0x1002814,  0x2814 },
+    { "braille_dots_135", 0x1002815,  0x2815 },
+    { "braille_dots_235", 0x1002816,  0x2816 },
+    { "braille_dots_1235", 0x1002817,  0x2817 },
+    { "braille_dots_45", 0x1002818,  0x2818 },
+    { "braille_dots_145", 0x1002819,  0x2819 },
+    { "braille_dots_245", 0x100281a,  0x281a },
+    { "braille_dots_1245", 0x100281b,  0x281b },
+    { "braille_dots_345", 0x100281c,  0x281c },
+    { "braille_dots_1345", 0x100281d,  0x281d },
+    { "braille_dots_2345", 0x100281e,  0x281e },
+    { "braille_dots_12345", 0x100281f,  0x281f },
+    { "braille_dots_6", 0x1002820,  0x2820 },
+    { "braille_dots_16", 0x1002821,  0x2821 },
+    { "braille_dots_26", 0x1002822,  0x2822 },
+    { "braille_dots_126", 0x1002823,  0x2823 },
+    { "braille_dots_36", 0x1002824,  0x2824 },
+    { "braille_dots_136", 0x1002825,  0x2825 },
+    { "braille_dots_236", 0x1002826,  0x2826 },
+    { "braille_dots_1236", 0x1002827,  0x2827 },
+    { "braille_dots_46", 0x1002828,  0x2828 },
+    { "braille_dots_146", 0x1002829,  0x2829 },
+    { "braille_dots_246", 0x100282a,  0x282a },
+    { "braille_dots_1246", 0x100282b,  0x282b },
+    { "braille_dots_346", 0x100282c,  0x282c },
+    { "braille_dots_1346", 0x100282d,  0x282d },
+    { "braille_dots_2346", 0x100282e,  0x282e },
+    { "braille_dots_12346", 0x100282f,  0x282f },
+    { "braille_dots_56", 0x1002830,  0x2830 },
+    { "braille_dots_156", 0x1002831,  0x2831 },
+    { "braille_dots_256", 0x1002832,  0x2832 },
+    { "braille_dots_1256", 0x1002833,  0x2833 },
+    { "braille_dots_356", 0x1002834,  0x2834 },
+    { "braille_dots_1356", 0x1002835,  0x2835 },
+    { "braille_dots_2356", 0x1002836,  0x2836 },
+    { "braille_dots_12356", 0x1002837,  0x2837 },
+    { "braille_dots_456", 0x1002838,  0x2838 },
+    { "braille_dots_1456", 0x1002839,  0x2839 },
+    { "braille_dots_2456", 0x100283a,  0x283a },
+    { "braille_dots_12456", 0x100283b,  0x283b },
+    { "braille_dots_3456", 0x100283c,  0x283c },
+    { "braille_dots_13456", 0x100283d,  0x283d },
+    { "braille_dots_23456", 0x100283e,  0x283e },
+    { "braille_dots_123456", 0x100283f,  0x283f },
+    { "braille_dots_7", 0x1002840,  0x2840 },
+    { "braille_dots_17", 0x1002841,  0x2841 },
+    { "braille_dots_27", 0x1002842,  0x2842 },
+    { "braille_dots_127", 0x1002843,  0x2843 },
+    { "braille_dots_37", 0x1002844,  0x2844 },
+    { "braille_dots_137", 0x1002845,  0x2845 },
+    { "braille_dots_237", 0x1002846,  0x2846 },
+    { "braille_dots_1237", 0x1002847,  0x2847 },
+    { "braille_dots_47", 0x1002848,  0x2848 },
+    { "braille_dots_147", 0x1002849,  0x2849 },
+    { "braille_dots_247", 0x100284a,  0x284a },
+    { "braille_dots_1247", 0x100284b,  0x284b },
+    { "braille_dots_347", 0x100284c,  0x284c },
+    { "braille_dots_1347", 0x100284d,  0x284d },
+    { "braille_dots_2347", 0x100284e,  0x284e },
+    { "braille_dots_12347", 0x100284f,  0x284f },
+    { "braille_dots_57", 0x1002850,  0x2850 },
+    { "braille_dots_157", 0x1002851,  0x2851 },
+    { "braille_dots_257", 0x1002852,  0x2852 },
+    { "braille_dots_1257", 0x1002853,  0x2853 },
+    { "braille_dots_357", 0x1002854,  0x2854 },
+    { "braille_dots_1357", 0x1002855,  0x2855 },
+    { "braille_dots_2357", 0x1002856,  0x2856 },
+    { "braille_dots_12357", 0x1002857,  0x2857 },
+    { "braille_dots_457", 0x1002858,  0x2858 },
+    { "braille_dots_1457", 0x1002859,  0x2859 },
+    { "braille_dots_2457", 0x100285a,  0x285a },
+    { "braille_dots_12457", 0x100285b,  0x285b },
+    { "braille_dots_3457", 0x100285c,  0x285c },
+    { "braille_dots_13457", 0x100285d,  0x285d },
+    { "braille_dots_23457", 0x100285e,  0x285e },
+    { "braille_dots_123457", 0x100285f,  0x285f },
+    { "braille_dots_67", 0x1002860,  0x2860 },
+    { "braille_dots_167", 0x1002861,  0x2861 },
+    { "braille_dots_267", 0x1002862,  0x2862 },
+    { "braille_dots_1267", 0x1002863,  0x2863 },
+    { "braille_dots_367", 0x1002864,  0x2864 },
+    { "braille_dots_1367", 0x1002865,  0x2865 },
+    { "braille_dots_2367", 0x1002866,  0x2866 },
+    { "braille_dots_12367", 0x1002867,  0x2867 },
+    { "braille_dots_467", 0x1002868,  0x2868 },
+    { "braille_dots_1467", 0x1002869,  0x2869 },
+    { "braille_dots_2467", 0x100286a,  0x286a },
+    { "braille_dots_12467", 0x100286b,  0x286b },
+    { "braille_dots_3467", 0x100286c,  0x286c },
+    { "braille_dots_13467", 0x100286d,  0x286d },
+    { "braille_dots_23467", 0x100286e,  0x286e },
+    { "braille_dots_123467", 0x100286f,  0x286f },
+    { "braille_dots_567", 0x1002870,  0x2870 },
+    { "braille_dots_1567", 0x1002871,  0x2871 },
+    { "braille_dots_2567", 0x1002872,  0x2872 },
+    { "braille_dots_12567", 0x1002873,  0x2873 },
+    { "braille_dots_3567", 0x1002874,  0x2874 },
+    { "braille_dots_13567", 0x1002875,  0x2875 },
+    { "braille_dots_23567", 0x1002876,  0x2876 },
+    { "braille_dots_123567", 0x1002877,  0x2877 },
+    { "braille_dots_4567", 0x1002878,  0x2878 },
+    { "braille_dots_14567", 0x1002879,  0x2879 },
+    { "braille_dots_24567", 0x100287a,  0x287a },
+    { "braille_dots_124567", 0x100287b,  0x287b },
+    { "braille_dots_34567", 0x100287c,  0x287c },
+    { "braille_dots_134567", 0x100287d,  0x287d },
+    { "braille_dots_234567", 0x100287e,  0x287e },
+    { "braille_dots_1234567", 0x100287f,  0x287f },
+    { "braille_dots_8", 0x1002880,  0x2880 },
+    { "braille_dots_18", 0x1002881,  0x2881 },
+    { "braille_dots_28", 0x1002882,  0x2882 },
+    { "braille_dots_128", 0x1002883,  0x2883 },
+    { "braille_dots_38", 0x1002884,  0x2884 },
+    { "braille_dots_138", 0x1002885,  0x2885 },
+    { "braille_dots_238", 0x1002886,  0x2886 },
+    { "braille_dots_1238", 0x1002887,  0x2887 },
+    { "braille_dots_48", 0x1002888,  0x2888 },
+    { "braille_dots_148", 0x1002889,  0x2889 },
+    { "braille_dots_248", 0x100288a,  0x288a },
+    { "braille_dots_1248", 0x100288b,  0x288b },
+    { "braille_dots_348", 0x100288c,  0x288c },
+    { "braille_dots_1348", 0x100288d,  0x288d },
+    { "braille_dots_2348", 0x100288e,  0x288e },
+    { "braille_dots_12348", 0x100288f,  0x288f },
+    { "braille_dots_58", 0x1002890,  0x2890 },
+    { "braille_dots_158", 0x1002891,  0x2891 },
+    { "braille_dots_258", 0x1002892,  0x2892 },
+    { "braille_dots_1258", 0x1002893,  0x2893 },
+    { "braille_dots_358", 0x1002894,  0x2894 },
+    { "braille_dots_1358", 0x1002895,  0x2895 },
+    { "braille_dots_2358", 0x1002896,  0x2896 },
+    { "braille_dots_12358", 0x1002897,  0x2897 },
+    { "braille_dots_458", 0x1002898,  0x2898 },
+    { "braille_dots_1458", 0x1002899,  0x2899 },
+    { "braille_dots_2458", 0x100289a,  0x289a },
+    { "braille_dots_12458", 0x100289b,  0x289b },
+    { "braille_dots_3458", 0x100289c,  0x289c },
+    { "braille_dots_13458", 0x100289d,  0x289d },
+    { "braille_dots_23458", 0x100289e,  0x289e },
+    { "braille_dots_123458", 0x100289f,  0x289f },
+    { "braille_dots_68", 0x10028a0,  0x28a0 },
+    { "braille_dots_168", 0x10028a1,  0x28a1 },
+    { "braille_dots_268", 0x10028a2,  0x28a2 },
+    { "braille_dots_1268", 0x10028a3,  0x28a3 },
+    { "braille_dots_368", 0x10028a4,  0x28a4 },
+    { "braille_dots_1368", 0x10028a5,  0x28a5 },
+    { "braille_dots_2368", 0x10028a6,  0x28a6 },
+    { "braille_dots_12368", 0x10028a7,  0x28a7 },
+    { "braille_dots_468", 0x10028a8,  0x28a8 },
+    { "braille_dots_1468", 0x10028a9,  0x28a9 },
+    { "braille_dots_2468", 0x10028aa,  0x28aa },
+    { "braille_dots_12468", 0x10028ab,  0x28ab },
+    { "braille_dots_3468", 0x10028ac,  0x28ac },
+    { "braille_dots_13468", 0x10028ad,  0x28ad },
+    { "braille_dots_23468", 0x10028ae,  0x28ae },
+    { "braille_dots_123468", 0x10028af,  0x28af },
+    { "braille_dots_568", 0x10028b0,  0x28b0 },
+    { "braille_dots_1568", 0x10028b1,  0x28b1 },
+    { "braille_dots_2568", 0x10028b2,  0x28b2 },
+    { "braille_dots_12568", 0x10028b3,  0x28b3 },
+    { "braille_dots_3568", 0x10028b4,  0x28b4 },
+    { "braille_dots_13568", 0x10028b5,  0x28b5 },
+    { "braille_dots_23568", 0x10028b6,  0x28b6 },
+    { "braille_dots_123568", 0x10028b7,  0x28b7 },
+    { "braille_dots_4568", 0x10028b8,  0x28b8 },
+    { "braille_dots_14568", 0x10028b9,  0x28b9 },
+    { "braille_dots_24568", 0x10028ba,  0x28ba },
+    { "braille_dots_124568", 0x10028bb,  0x28bb },
+    { "braille_dots_34568", 0x10028bc,  0x28bc },
+    { "braille_dots_134568", 0x10028bd,  0x28bd },
+    { "braille_dots_234568", 0x10028be,  0x28be },
+    { "braille_dots_1234568", 0x10028bf,  0x28bf },
+    { "braille_dots_78", 0x10028c0,  0x28c0 },
+    { "braille_dots_178", 0x10028c1,  0x28c1 },
+    { "braille_dots_278", 0x10028c2,  0x28c2 },
+    { "braille_dots_1278", 0x10028c3,  0x28c3 },
+    { "braille_dots_378", 0x10028c4,  0x28c4 },
+    { "braille_dots_1378", 0x10028c5,  0x28c5 },
+    { "braille_dots_2378", 0x10028c6,  0x28c6 },
+    { "braille_dots_12378", 0x10028c7,  0x28c7 },
+    { "braille_dots_478", 0x10028c8,  0x28c8 },
+    { "braille_dots_1478", 0x10028c9,  0x28c9 },
+    { "braille_dots_2478", 0x10028ca,  0x28ca },
+    { "braille_dots_12478", 0x10028cb,  0x28cb },
+    { "braille_dots_3478", 0x10028cc,  0x28cc },
+    { "braille_dots_13478", 0x10028cd,  0x28cd },
+    { "braille_dots_23478", 0x10028ce,  0x28ce },
+    { "braille_dots_123478", 0x10028cf,  0x28cf },
+    { "braille_dots_578", 0x10028d0,  0x28d0 },
+    { "braille_dots_1578", 0x10028d1,  0x28d1 },
+    { "braille_dots_2578", 0x10028d2,  0x28d2 },
+    { "braille_dots_12578", 0x10028d3,  0x28d3 },
+    { "braille_dots_3578", 0x10028d4,  0x28d4 },
+    { "braille_dots_13578", 0x10028d5,  0x28d5 },
+    { "braille_dots_23578", 0x10028d6,  0x28d6 },
+    { "braille_dots_123578", 0x10028d7,  0x28d7 },
+    { "braille_dots_4578", 0x10028d8,  0x28d8 },
+    { "braille_dots_14578", 0x10028d9,  0x28d9 },
+    { "braille_dots_24578", 0x10028da,  0x28da },
+    { "braille_dots_124578", 0x10028db,  0x28db },
+    { "braille_dots_34578", 0x10028dc,  0x28dc },
+    { "braille_dots_134578", 0x10028dd,  0x28dd },
+    { "braille_dots_234578", 0x10028de,  0x28de },
+    { "braille_dots_1234578", 0x10028df,  0x28df },
+    { "braille_dots_678", 0x10028e0,  0x28e0 },
+    { "braille_dots_1678", 0x10028e1,  0x28e1 },
+    { "braille_dots_2678", 0x10028e2,  0x28e2 },
+    { "braille_dots_12678", 0x10028e3,  0x28e3 },
+    { "braille_dots_3678", 0x10028e4,  0x28e4 },
+    { "braille_dots_13678", 0x10028e5,  0x28e5 },
+    { "braille_dots_23678", 0x10028e6,  0x28e6 },
+    { "braille_dots_123678", 0x10028e7,  0x28e7 },
+    { "braille_dots_4678", 0x10028e8,  0x28e8 },
+    { "braille_dots_14678", 0x10028e9,  0x28e9 },
+    { "braille_dots_24678", 0x10028ea,  0x28ea },
+    { "braille_dots_124678", 0x10028eb,  0x28eb },
+    { "braille_dots_34678", 0x10028ec,  0x28ec },
+    { "braille_dots_134678", 0x10028ed,  0x28ed },
+    { "braille_dots_234678", 0x10028ee,  0x28ee },
+    { "braille_dots_1234678", 0x10028ef,  0x28ef },
+    { "braille_dots_5678", 0x10028f0,  0x28f0 },
+    { "braille_dots_15678", 0x10028f1,  0x28f1 },
+    { "braille_dots_25678", 0x10028f2,  0x28f2 },
+    { "braille_dots_125678", 0x10028f3,  0x28f3 },
+    { "braille_dots_35678", 0x10028f4,  0x28f4 },
+    { "braille_dots_135678", 0x10028f5,  0x28f5 },
+    { "braille_dots_235678", 0x10028f6,  0x28f6 },
+    { "braille_dots_1235678", 0x10028f7,  0x28f7 },
+    { "braille_dots_45678", 0x10028f8,  0x28f8 },
+    { "braille_dots_145678", 0x10028f9,  0x28f9 },
+    { "braille_dots_245678", 0x10028fa,  0x28fa },
+    { "braille_dots_1245678", 0x10028fb,  0x28fb },
+    { "braille_dots_345678", 0x10028fc,  0x28fc },
+    { "braille_dots_1345678", 0x10028fd,  0x28fd },
+    { "braille_dots_2345678", 0x10028fe,  0x28fe },
+    { "braille_dots_12345678", 0x10028ff,  0x28ff },
+    { "Sinh_ng", 0x1000d82,  0x0d82 },
+    { "Sinh_h2", 0x1000d83,  0x0d83 },
+    { "Sinh_a", 0x1000d85,  0x0d85 },
+    { "Sinh_aa", 0x1000d86,  0x0d86 },
+    { "Sinh_ae", 0x1000d87,  0x0d87 },
+    { "Sinh_aee", 0x1000d88,  0x0d88 },
+    { "Sinh_i", 0x1000d89,  0x0d89 },
+    { "Sinh_ii", 0x1000d8a,  0x0d8a },
+    { "Sinh_u", 0x1000d8b,  0x0d8b },
+    { "Sinh_uu", 0x1000d8c,  0x0d8c },
+    { "Sinh_ri", 0x1000d8d,  0x0d8d },
+    { "Sinh_rii", 0x1000d8e,  0x0d8e },
+    { "Sinh_lu", 0x1000d8f,  0x0d8f },
+    { "Sinh_luu", 0x1000d90,  0x0d90 },
+    { "Sinh_e", 0x1000d91,  0x0d91 },
+    { "Sinh_ee", 0x1000d92,  0x0d92 },
+    { "Sinh_ai", 0x1000d93,  0x0d93 },
+    { "Sinh_o", 0x1000d94,  0x0d94 },
+    { "Sinh_oo", 0x1000d95,  0x0d95 },
+    { "Sinh_au", 0x1000d96,  0x0d96 },
+    { "Sinh_ka", 0x1000d9a,  0x0d9a },
+    { "Sinh_kha", 0x1000d9b,  0x0d9b },
+    { "Sinh_ga", 0x1000d9c,  0x0d9c },
+    { "Sinh_gha", 0x1000d9d,  0x0d9d },
+    { "Sinh_ng2", 0x1000d9e,  0x0d9e },
+    { "Sinh_nga", 0x1000d9f,  0x0d9f },
+    { "Sinh_ca", 0x1000da0,  0x0da0 },
+    { "Sinh_cha", 0x1000da1,  0x0da1 },
+    { "Sinh_ja", 0x1000da2,  0x0da2 },
+    { "Sinh_jha", 0x1000da3,  0x0da3 },
+    { "Sinh_nya", 0x1000da4,  0x0da4 },
+    { "Sinh_jnya", 0x1000da5,  0x0da5 },
+    { "Sinh_nja", 0x1000da6,  0x0da6 },
+    { "Sinh_tta", 0x1000da7,  0x0da7 },
+    { "Sinh_ttha", 0x1000da8,  0x0da8 },
+    { "Sinh_dda", 0x1000da9,  0x0da9 },
+    { "Sinh_ddha", 0x1000daa,  0x0daa },
+    { "Sinh_nna", 0x1000dab,  0x0dab },
+    { "Sinh_ndda", 0x1000dac,  0x0dac },
+    { "Sinh_tha", 0x1000dad,  0x0dad },
+    { "Sinh_thha", 0x1000dae,  0x0dae },
+    { "Sinh_dha", 0x1000daf,  0x0daf },
+    { "Sinh_dhha", 0x1000db0,  0x0db0 },
+    { "Sinh_na", 0x1000db1,  0x0db1 },
+    { "Sinh_ndha", 0x1000db3,  0x0db3 },
+    { "Sinh_pa", 0x1000db4,  0x0db4 },
+    { "Sinh_pha", 0x1000db5,  0x0db5 },
+    { "Sinh_ba", 0x1000db6,  0x0db6 },
+    { "Sinh_bha", 0x1000db7,  0x0db7 },
+    { "Sinh_ma", 0x1000db8,  0x0db8 },
+    { "Sinh_mba", 0x1000db9,  0x0db9 },
+    { "Sinh_ya", 0x1000dba,  0x0dba },
+    { "Sinh_ra", 0x1000dbb,  0x0dbb },
+    { "Sinh_la", 0x1000dbd,  0x0dbd },
+    { "Sinh_va", 0x1000dc0,  0x0dc0 },
+    { "Sinh_sha", 0x1000dc1,  0x0dc1 },
+    { "Sinh_ssha", 0x1000dc2,  0x0dc2 },
+    { "Sinh_sa", 0x1000dc3,  0x0dc3 },
+    { "Sinh_ha", 0x1000dc4,  0x0dc4 },
+    { "Sinh_lla", 0x1000dc5,  0x0dc5 },
+    { "Sinh_fa", 0x1000dc6,  0x0dc6 },
+    { "Sinh_al", 0x1000dca,  0x0dca },
+    { "Sinh_aa2", 0x1000dcf,  0x0dcf },
+    { "Sinh_ae2", 0x1000dd0,  0x0dd0 },
+    { "Sinh_aee2", 0x1000dd1,  0x0dd1 },
+    { "Sinh_i2", 0x1000dd2,  0x0dd2 },
+    { "Sinh_ii2", 0x1000dd3,  0x0dd3 },
+    { "Sinh_u2", 0x1000dd4,  0x0dd4 },
+    { "Sinh_uu2", 0x1000dd6,  0x0dd6 },
+    { "Sinh_ru2", 0x1000dd8,  0x0dd8 },
+    { "Sinh_e2", 0x1000dd9,  0x0dd9 },
+    { "Sinh_ee2", 0x1000dda,  0x0dda },
+    { "Sinh_ai2", 0x1000ddb,  0x0ddb },
+    { "Sinh_o2", 0x1000ddc,  0x0ddc },
+    { "Sinh_oo2", 0x1000ddd,  0x0ddd },
+    { "Sinh_au2", 0x1000dde,  0x0dde },
+    { "Sinh_lu2", 0x1000ddf,  0x0ddf },
+    { "Sinh_ruu2", 0x1000df2,  0x0df2 },
+    { "Sinh_luu2", 0x1000df3,  0x0df3 },
+    { "Sinh_kunddaliya", 0x1000df4,  0x0df4 },
+    { NULL, 0x000,  0x0000 },
+};
index 5149bbf6bcda83030f94d98146791ebc18c59e0f..b27f3b2132445963739a1bf413fafb9101d72a20 100644 (file)
@@ -1613,6 +1613,7 @@ spiceterm_print_usage(const char *msg)
     fprintf(stderr, "  --addr <addr>        Bind to address <addr>\n");
     fprintf(stderr, "  --sasl               Enable SASL based authentication\n");
     fprintf(stderr, "  --noauth             Disable authentication\n");
+    fprintf(stderr, "  --keymap             Spefify keymap (uses kvm keymap files)\n");
 }
 
 int
@@ -1641,12 +1642,13 @@ main (int argc, char** argv)
         { "permissions", required_argument, 0, 'P' },
         { "port", required_argument, 0, 'p' },
         { "addr", required_argument, 0, 'a' },
+        { "keymap", required_argument, 0, 'k' },
         { "noauth", no_argument, 0, 'n' },
         { "sasl", no_argument, 0, 's' },
         { NULL, 0, 0, 0 },
     };
 
-    while ((c = getopt_long(argc, argv, "nst:a:p:P:", long_options, NULL)) != -1) {
+    while ((c = getopt_long(argc, argv, "nkst:a:p:P:", long_options, NULL)) != -1) {
         
         switch (c) {
         case 'n':
@@ -1655,6 +1657,9 @@ main (int argc, char** argv)
         case 's':
             opts.sasl = TRUE;
             break;
+        case 'k':
+            opts.keymap = optarg;
+            break;
         case 'A':
             pve_auth_set_path(optarg);
             break;
index 3df2ef8cec0449cfbfbf15a3ccc073aca23b317c..678fa050db99bd365c4ff06cc33f762e49504059 100644 (file)
@@ -28,6 +28,7 @@ typedef struct SpiceTermOptions {
     guint timeout;
     int port;
     char *addr;
+    char *keymap;
     gboolean noauth;
     gboolean sasl;
 } SpiceTermOptions;