diff --git a/src/Yi/Keymap/Vim.hs b/src/Yi/Keymap/Vim.hs
--- a/src/Yi/Keymap/Vim.hs
+++ b/src/Yi/Keymap/Vim.hs
@@ -32,7 +32,7 @@
 import Yi.Keymap                              (Keymap, KeymapM, KeymapSet, YiM, modelessKeymapSet, write)
 import Yi.Keymap.Keys                         (anyEvent)
 import Yi.Keymap.Vim.Common
-import Yi.Keymap.Vim.Digraph                  (defDigraphs)
+import Yi.Keymap.Vim.Digraph                  (defDigraphs, DigraphTbl)
 import Yi.Keymap.Vim.EventUtils               (eventToEventString, parseEvents)
 import Yi.Keymap.Vim.Ex                       (ExCommand, defExCommandParsers)
 import Yi.Keymap.Vim.ExMap                    (defExMap)
@@ -52,7 +52,7 @@
   , vimBindings         :: [VimBinding]
   , vimOperators        :: [VimOperator]
   , vimExCommandParsers :: [EventString -> Maybe ExCommand]
-  , vimDigraphs         :: [(String, Char)]
+  , vimDigraphs         :: DigraphTbl
   , vimRelayout         :: Char -> Char
   }
 
diff --git a/src/Yi/Keymap/Vim/Digraph.hs b/src/Yi/Keymap/Vim/Digraph.hs
--- a/src/Yi/Keymap/Vim/Digraph.hs
+++ b/src/Yi/Keymap/Vim/Digraph.hs
@@ -1,1312 +1,1328 @@
-module Yi.Keymap.Vim.Digraph
-    ( charFromDigraph
-    , defDigraphs
-    ) where
-
-import Control.Applicative (Alternative ((<|>)))
-
-charFromDigraph :: [(String, Char)] -> Char -> Char -> Maybe Char
-charFromDigraph digraphTable c1 c2 =
-    lookup [c1, c2] digraphTable <|> lookup [c2, c1] digraphTable
-
-defDigraphs :: [(String, Char)]
-defDigraphs =
-    [ ("SH", '\x0001') -- START OF HEADING (SOH)
-    , ("SX", '\x0002') -- START OF TEXT (STX)
-    , ("EX", '\x0003') -- END OF TEXT (ETX)
-    , ("ET", '\x0004') -- END OF TRANSMISSION (EOT)
-    , ("EQ", '\x0005') -- ENQUIRY (ENQ)
-    , ("AK", '\x0006') -- ACKNOWLEDGE (ACK)
-    , ("BL", '\x0007') -- BELL (BEL)
-    , ("BS", '\x0008') -- BACKSPACE (BS)
-    , ("HT", '\x0009') -- CHARACTER TABULATION (HT)
-    , ("VT", '\x000B') -- LINE TABULATION (VT)
-    , ("FF", '\x000C') -- FORM FEED (FF)
-    , ("SO", '\x000E') -- SHIFT OUT (SO)
-    , ("SI", '\x000F') -- SHIFT IN (SI)
-    , ("DL", '\x0010') -- DATALINK ESCAPE (DLE)
-    , ("D1", '\x0011') -- DEVICE CONTROL ONE (DC1)
-    , ("D2", '\x0012') -- DEVICE CONTROL TWO (DC2)
-    , ("D3", '\x0013') -- DEVICE CONTROL THREE (DC3)
-    , ("D4", '\x0014') -- DEVICE CONTROL FOUR (DC4)
-    , ("NK", '\x0015') -- NEGATIVE ACKNOWLEDGE (NAK)
-    , ("SY", '\x0016') -- SYNCHRONOUS IDLE (SYN)
-    , ("EB", '\x0017') -- END OF TRANSMISSION BLOCK (ETB)
-    , ("CN", '\x0018') -- CANCEL (CAN)
-    , ("EM", '\x0019') -- END OF MEDIUM (EM)
-    , ("SB", '\x001A') -- SUBSTITUTE (SUB)
-    , ("EC", '\x001B') -- ESCAPE (ESC)
-    , ("FS", '\x001C') -- FILE SEPARATOR (IS4)
-    , ("GS", '\x001D') -- GROUP SEPARATOR (IS3)
-    , ("RS", '\x001E') -- RECORD SEPARATOR (IS2)
-    , ("US", '\x001F') -- UNIT SEPARATOR (IS1)
-    , ("SP", '\x0020') -- SPACE
-    , ("Nb", '\x0023') -- NUMBER SIGN
-    , ("DO", '\x0024') -- DOLLAR SIGN
-    , ("At", '\x0040') -- COMMERCIAL AT
-    , ("<(", '\x005B') -- LEFT SQUARE BRACKET
-    , ("//", '\x005C') -- REVERSE SOLIDUS
-    , (")>", '\x005D') -- RIGHT SQUARE BRACKET
-    , ("'>", '\x005E') -- CIRCUMFLEX ACCENT
-    , ("'!", '\x0060') -- GRAVE ACCENT
-    , ("(!", '\x007B') -- LEFT CURLY BRACKET
-    , ("!!", '\x007C') -- VERTICAL LINE
-    , ("!)", '\x007D') -- RIGHT CURLY BRACKET
-    , ("'?", '\x007E') -- TILDE
-    , ("DT", '\x007F') -- DELETE (DEL)
-    , ("PA", '\x0080') -- PADDING CHARACTER (PAD)
-    , ("HO", '\x0081') -- HIGH OCTET PRESET (HOP)
-    , ("BH", '\x0082') -- BREAK PERMITTED HERE (BPH)
-    , ("NH", '\x0083') -- NO BREAK HERE (NBH)
-    , ("IN", '\x0084') -- INDEX (IND)
-    , ("NL", '\x0085') -- NEXT LINE (NEL)
-    , ("SA", '\x0086') -- START OF SELECTED AREA (SSA)
-    , ("ES", '\x0087') -- END OF SELECTED AREA (ESA)
-    , ("HS", '\x0088') -- CHARACTER TABULATION SET (HTS)
-    , ("HJ", '\x0089') -- CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
-    , ("VS", '\x008A') -- LINE TABULATION SET (VTS)
-    , ("PD", '\x008B') -- PARTIAL LINE FORWARD (PLD)
-    , ("PU", '\x008C') -- PARTIAL LINE BACKWARD (PLU)
-    , ("RI", '\x008D') -- REVERSE LINE FEED (RI)
-    , ("S2", '\x008E') -- SINGLE-SHIFT TWO (SS2)
-    , ("S3", '\x008F') -- SINGLE-SHIFT THREE (SS3)
-    , ("DC", '\x0090') -- DEVICE CONTROL STRING (DCS)
-    , ("P1", '\x0091') -- PRIVATE USE ONE (PU1)
-    , ("P2", '\x0092') -- PRIVATE USE TWO (PU2)
-    , ("TS", '\x0093') -- SET TRANSMIT STATE (STS)
-    , ("CC", '\x0094') -- CANCEL CHARACTER (CCH)
-    , ("MW", '\x0095') -- MESSAGE WAITING (MW)
-    , ("SG", '\x0096') -- START OF GUARDED AREA (SPA)
-    , ("EG", '\x0097') -- END OF GUARDED AREA (EPA)
-    , ("SS", '\x0098') -- START OF STRING (SOS)
-    , ("GC", '\x0099') -- SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
-    , ("SC", '\x009A') -- SINGLE CHARACTER INTRODUCER (SCI)
-    , ("CI", '\x009B') -- CONTROL SEQUENCE INTRODUCER (CSI)
-    , ("ST", '\x009C') -- STRING TERMINATOR (ST)
-    , ("OC", '\x009D') -- OPERATING SYSTEM COMMAND (OSC)
-    , ("PM", '\x009E') -- PRIVACY MESSAGE (PM)
-    , ("AC", '\x009F') -- APPLICATION PROGRAM COMMAND (APC)
-    , ("NS", '\x00A0') -- NO-BREAK SPACE
-    , ("!I", '\x00A1') -- INVERTED EXCLAMATION MARK
-    , ("Ct", '\x00A2') -- CENT SIGN
-    , ("Pd", '\x00A3') -- POUND SIGN
-    , ("Cu", '\x00A4') -- CURRENCY SIGN
-    , ("Ye", '\x00A5') -- YEN SIGN
-    , ("BB", '\x00A6') -- BROKEN BAR
-    , ("SE", '\x00A7') -- SECTION SIGN
-    , ("':", '\x00A8') -- DIAERESIS
-    , ("Co", '\x00A9') -- COPYRIGHT SIGN
-    , ("-a", '\x00AA') -- FEMININE ORDINAL INDICATOR
-    , ("<<", '\x00AB') -- LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-    , ("NO", '\x00AC') -- NOT SIGN
-    , ("--", '\x00AD') -- SOFT HYPHEN
-    , ("Rg", '\x00AE') -- REGISTERED SIGN
-    , ("'m", '\x00AF') -- MACRON
-    , ("DG", '\x00B0') -- DEGREE SIGN
-    , ("+-", '\x00B1') -- PLUS-MINUS SIGN
-    , ("2S", '\x00B2') -- SUPERSCRIPT TWO
-    , ("3S", '\x00B3') -- SUPERSCRIPT THREE
-    , ("''", '\x00B4') -- ACUTE ACCENT
-    , ("My", '\x00B5') -- MICRO SIGN
-    , ("PI", '\x00B6') -- PILCROW SIGN
-    , (".M", '\x00B7') -- MIDDLE DOT
-    , ("',", '\x00B8') -- CEDILLA
-    , ("1S", '\x00B9') -- SUPERSCRIPT ONE
-    , ("-o", '\x00BA') -- MASCULINE ORDINAL INDICATOR
-    , (">>", '\x00BB') -- RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-    , ("14", '\x00BC') -- VULGAR FRACTION ONE QUARTER
-    , ("12", '\x00BD') -- VULGAR FRACTION ONE HALF
-    , ("34", '\x00BE') -- VULGAR FRACTION THREE QUARTERS
-    , ("?I", '\x00BF') -- INVERTED QUESTION MARK
-    , ("A!", '\x00C0') -- LATIN CAPITAL LETTER A WITH GRAVE
-    , ("A'", '\x00C1') -- LATIN CAPITAL LETTER A WITH ACUTE
-    , ("A>", '\x00C2') -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX
-    , ("A?", '\x00C3') -- LATIN CAPITAL LETTER A WITH TILDE
-    , ("A:", '\x00C4') -- LATIN CAPITAL LETTER A WITH DIAERESIS
-    , ("AA", '\x00C5') -- LATIN CAPITAL LETTER A WITH RING ABOVE
-    , ("AE", '\x00C6') -- LATIN CAPITAL LETTER AE
-    , ("C,", '\x00C7') -- LATIN CAPITAL LETTER C WITH CEDILLA
-    , ("E!", '\x00C8') -- LATIN CAPITAL LETTER E WITH GRAVE
-    , ("E'", '\x00C9') -- LATIN CAPITAL LETTER E WITH ACUTE
-    , ("E>", '\x00CA') -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX
-    , ("E:", '\x00CB') -- LATIN CAPITAL LETTER E WITH DIAERESIS
-    , ("I!", '\x00CC') -- LATIN CAPITAL LETTER I WITH GRAVE
-    , ("I'", '\x00CD') -- LATIN CAPITAL LETTER I WITH ACUTE
-    , ("I>", '\x00CE') -- LATIN CAPITAL LETTER I WITH CIRCUMFLEX
-    , ("I:", '\x00CF') -- LATIN CAPITAL LETTER I WITH DIAERESIS
-    , ("D-", '\x00D0') -- LATIN CAPITAL LETTER ETH (Icelandic)
-    , ("N?", '\x00D1') -- LATIN CAPITAL LETTER N WITH TILDE
-    , ("O!", '\x00D2') -- LATIN CAPITAL LETTER O WITH GRAVE
-    , ("O'", '\x00D3') -- LATIN CAPITAL LETTER O WITH ACUTE
-    , ("O>", '\x00D4') -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX
-    , ("O?", '\x00D5') -- LATIN CAPITAL LETTER O WITH TILDE
-    , ("O:", '\x00D6') -- LATIN CAPITAL LETTER O WITH DIAERESIS
-    , ("*X", '\x00D7') -- MULTIPLICATION SIGN
-    , ("O/", '\x00D8') -- LATIN CAPITAL LETTER O WITH STROKE
-    , ("U!", '\x00D9') -- LATIN CAPITAL LETTER U WITH GRAVE
-    , ("U'", '\x00DA') -- LATIN CAPITAL LETTER U WITH ACUTE
-    , ("U>", '\x00DB') -- LATIN CAPITAL LETTER U WITH CIRCUMFLEX
-    , ("U:", '\x00DC') -- LATIN CAPITAL LETTER U WITH DIAERESIS
-    , ("Y'", '\x00DD') -- LATIN CAPITAL LETTER Y WITH ACUTE
-    , ("TH", '\x00DE') -- LATIN CAPITAL LETTER THORN (Icelandic)
-    , ("ss", '\x00DF') -- LATIN SMALL LETTER SHARP S (German)
-    , ("a!", '\x00E0') -- LATIN SMALL LETTER A WITH GRAVE
-    , ("a'", '\x00E1') -- LATIN SMALL LETTER A WITH ACUTE
-    , ("a>", '\x00E2') -- LATIN SMALL LETTER A WITH CIRCUMFLEX
-    , ("a?", '\x00E3') -- LATIN SMALL LETTER A WITH TILDE
-    , ("a:", '\x00E4') -- LATIN SMALL LETTER A WITH DIAERESIS
-    , ("aa", '\x00E5') -- LATIN SMALL LETTER A WITH RING ABOVE
-    , ("ae", '\x00E6') -- LATIN SMALL LETTER AE
-    , ("c,", '\x00E7') -- LATIN SMALL LETTER C WITH CEDILLA
-    , ("e!", '\x00E8') -- LATIN SMALL LETTER E WITH GRAVE
-    , ("e'", '\x00E9') -- LATIN SMALL LETTER E WITH ACUTE
-    , ("e>", '\x00EA') -- LATIN SMALL LETTER E WITH CIRCUMFLEX
-    , ("e:", '\x00EB') -- LATIN SMALL LETTER E WITH DIAERESIS
-    , ("i!", '\x00EC') -- LATIN SMALL LETTER I WITH GRAVE
-    , ("i'", '\x00ED') -- LATIN SMALL LETTER I WITH ACUTE
-    , ("i>", '\x00EE') -- LATIN SMALL LETTER I WITH CIRCUMFLEX
-    , ("i:", '\x00EF') -- LATIN SMALL LETTER I WITH DIAERESIS
-    , ("d-", '\x00F0') -- LATIN SMALL LETTER ETH (Icelandic)
-    , ("n?", '\x00F1') -- LATIN SMALL LETTER N WITH TILDE
-    , ("o!", '\x00F2') -- LATIN SMALL LETTER O WITH GRAVE
-    , ("o'", '\x00F3') -- LATIN SMALL LETTER O WITH ACUTE
-    , ("o>", '\x00F4') -- LATIN SMALL LETTER O WITH CIRCUMFLEX
-    , ("o?", '\x00F5') -- LATIN SMALL LETTER O WITH TILDE
-    , ("o:", '\x00F6') -- LATIN SMALL LETTER O WITH DIAERESIS
-    , ("-:", '\x00F7') -- DIVISION SIGN
-    , ("o/", '\x00F8') -- LATIN SMALL LETTER O WITH STROKE
-    , ("u!", '\x00F9') -- LATIN SMALL LETTER U WITH GRAVE
-    , ("u'", '\x00FA') -- LATIN SMALL LETTER U WITH ACUTE
-    , ("u>", '\x00FB') -- LATIN SMALL LETTER U WITH CIRCUMFLEX
-    , ("u:", '\x00FC') -- LATIN SMALL LETTER U WITH DIAERESIS
-    , ("y'", '\x00FD') -- LATIN SMALL LETTER Y WITH ACUTE
-    , ("th", '\x00FE') -- LATIN SMALL LETTER THORN (Icelandic)
-    , ("y:", '\x00FF') -- LATIN SMALL LETTER Y WITH DIAERESIS
-    , ("A-", '\x0100') -- LATIN CAPITAL LETTER A WITH MACRON
-    , ("a-", '\x0101') -- LATIN SMALL LETTER A WITH MACRON
-    , ("A(", '\x0102') -- LATIN CAPITAL LETTER A WITH BREVE
-    , ("a(", '\x0103') -- LATIN SMALL LETTER A WITH BREVE
-    , ("A;", '\x0104') -- LATIN CAPITAL LETTER A WITH OGONEK
-    , ("a;", '\x0105') -- LATIN SMALL LETTER A WITH OGONEK
-    , ("C'", '\x0106') -- LATIN CAPITAL LETTER C WITH ACUTE
-    , ("c'", '\x0107') -- LATIN SMALL LETTER C WITH ACUTE
-    , ("C>", '\x0108') -- LATIN CAPITAL LETTER C WITH CIRCUMFLEX
-    , ("c>", '\x0109') -- LATIN SMALL LETTER C WITH CIRCUMFLEX
-    , ("C.", '\x010A') -- LATIN CAPITAL LETTER C WITH DOT ABOVE
-    , ("c.", '\x010B') -- LATIN SMALL LETTER C WITH DOT ABOVE
-    , ("C<", '\x010C') -- LATIN CAPITAL LETTER C WITH CARON
-    , ("c<", '\x010D') -- LATIN SMALL LETTER C WITH CARON
-    , ("D<", '\x010E') -- LATIN CAPITAL LETTER D WITH CARON
-    , ("d<", '\x010F') -- LATIN SMALL LETTER D WITH CARON
-    , ("D/", '\x0110') -- LATIN CAPITAL LETTER D WITH STROKE
-    , ("d/", '\x0111') -- LATIN SMALL LETTER D WITH STROKE
-    , ("E-", '\x0112') -- LATIN CAPITAL LETTER E WITH MACRON
-    , ("e-", '\x0113') -- LATIN SMALL LETTER E WITH MACRON
-    , ("E(", '\x0114') -- LATIN CAPITAL LETTER E WITH BREVE
-    , ("e(", '\x0115') -- LATIN SMALL LETTER E WITH BREVE
-    , ("E.", '\x0116') -- LATIN CAPITAL LETTER E WITH DOT ABOVE
-    , ("e.", '\x0117') -- LATIN SMALL LETTER E WITH DOT ABOVE
-    , ("E;", '\x0118') -- LATIN CAPITAL LETTER E WITH OGONEK
-    , ("e;", '\x0119') -- LATIN SMALL LETTER E WITH OGONEK
-    , ("E<", '\x011A') -- LATIN CAPITAL LETTER E WITH CARON
-    , ("e<", '\x011B') -- LATIN SMALL LETTER E WITH CARON
-    , ("G>", '\x011C') -- LATIN CAPITAL LETTER G WITH CIRCUMFLEX
-    , ("g>", '\x011D') -- LATIN SMALL LETTER G WITH CIRCUMFLEX
-    , ("G(", '\x011E') -- LATIN CAPITAL LETTER G WITH BREVE
-    , ("g(", '\x011F') -- LATIN SMALL LETTER G WITH BREVE
-    , ("G.", '\x0120') -- LATIN CAPITAL LETTER G WITH DOT ABOVE
-    , ("g.", '\x0121') -- LATIN SMALL LETTER G WITH DOT ABOVE
-    , ("G,", '\x0122') -- LATIN CAPITAL LETTER G WITH CEDILLA
-    , ("g,", '\x0123') -- LATIN SMALL LETTER G WITH CEDILLA
-    , ("H>", '\x0124') -- LATIN CAPITAL LETTER H WITH CIRCUMFLEX
-    , ("h>", '\x0125') -- LATIN SMALL LETTER H WITH CIRCUMFLEX
-    , ("H/", '\x0126') -- LATIN CAPITAL LETTER H WITH STROKE
-    , ("h/", '\x0127') -- LATIN SMALL LETTER H WITH STROKE
-    , ("I?", '\x0128') -- LATIN CAPITAL LETTER I WITH TILDE
-    , ("i?", '\x0129') -- LATIN SMALL LETTER I WITH TILDE
-    , ("I-", '\x012A') -- LATIN CAPITAL LETTER I WITH MACRON
-    , ("i-", '\x012B') -- LATIN SMALL LETTER I WITH MACRON
-    , ("I(", '\x012C') -- LATIN CAPITAL LETTER I WITH BREVE
-    , ("i(", '\x012D') -- LATIN SMALL LETTER I WITH BREVE
-    , ("I;", '\x012E') -- LATIN CAPITAL LETTER I WITH OGONEK
-    , ("i;", '\x012F') -- LATIN SMALL LETTER I WITH OGONEK
-    , ("I.", '\x0130') -- LATIN CAPITAL LETTER I WITH DOT ABOVE
-    , ("i.", '\x0131') -- LATIN SMALL LETTER DOTLESS I
-    , ("IJ", '\x0132') -- LATIN CAPITAL LIGATURE IJ
-    , ("ij", '\x0133') -- LATIN SMALL LIGATURE IJ
-    , ("J>", '\x0134') -- LATIN CAPITAL LETTER J WITH CIRCUMFLEX
-    , ("j>", '\x0135') -- LATIN SMALL LETTER J WITH CIRCUMFLEX
-    , ("K,", '\x0136') -- LATIN CAPITAL LETTER K WITH CEDILLA
-    , ("k,", '\x0137') -- LATIN SMALL LETTER K WITH CEDILLA
-    , ("kk", '\x0138') -- LATIN SMALL LETTER KRA
-    , ("L'", '\x0139') -- LATIN CAPITAL LETTER L WITH ACUTE
-    , ("l'", '\x013A') -- LATIN SMALL LETTER L WITH ACUTE
-    , ("L,", '\x013B') -- LATIN CAPITAL LETTER L WITH CEDILLA
-    , ("l,", '\x013C') -- LATIN SMALL LETTER L WITH CEDILLA
-    , ("L<", '\x013D') -- LATIN CAPITAL LETTER L WITH CARON
-    , ("l<", '\x013E') -- LATIN SMALL LETTER L WITH CARON
-    , ("L.", '\x013F') -- LATIN CAPITAL LETTER L WITH MIDDLE DOT
-    , ("l.", '\x0140') -- LATIN SMALL LETTER L WITH MIDDLE DOT
-    , ("L/", '\x0141') -- LATIN CAPITAL LETTER L WITH STROKE
-    , ("l/", '\x0142') -- LATIN SMALL LETTER L WITH STROKE
-    , ("N'", '\x0143') -- LATIN CAPITAL LETTER N WITH ACUTE `
-    , ("n'", '\x0144') -- LATIN SMALL LETTER N WITH ACUTE `
-    , ("N,", '\x0145') -- LATIN CAPITAL LETTER N WITH CEDILLA `
-    , ("n,", '\x0146') -- LATIN SMALL LETTER N WITH CEDILLA `
-    , ("N<", '\x0147') -- LATIN CAPITAL LETTER N WITH CARON `
-    , ("n<", '\x0148') -- LATIN SMALL LETTER N WITH CARON `
-    , ("'n", '\x0149') -- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE `
-    , ("NG", '\x014A') -- LATIN CAPITAL LETTER ENG
-    , ("ng", '\x014B') -- LATIN SMALL LETTER ENG
-    , ("O-", '\x014C') -- LATIN CAPITAL LETTER O WITH MACRON
-    , ("o-", '\x014D') -- LATIN SMALL LETTER O WITH MACRON
-    , ("O(", '\x014E') -- LATIN CAPITAL LETTER O WITH BREVE
-    , ("o(", '\x014F') -- LATIN SMALL LETTER O WITH BREVE
-    , ("O\"", '\x0150') -- LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
-    , ("o\"", '\x0151') -- LATIN SMALL LETTER O WITH DOUBLE ACUTE
-    , ("OE", '\x0152') -- LATIN CAPITAL LIGATURE OE
-    , ("oe", '\x0153') -- LATIN SMALL LIGATURE OE
-    , ("R'", '\x0154') -- LATIN CAPITAL LETTER R WITH ACUTE
-    , ("r'", '\x0155') -- LATIN SMALL LETTER R WITH ACUTE
-    , ("R,", '\x0156') -- LATIN CAPITAL LETTER R WITH CEDILLA
-    , ("r,", '\x0157') -- LATIN SMALL LETTER R WITH CEDILLA
-    , ("R<", '\x0158') -- LATIN CAPITAL LETTER R WITH CARON
-    , ("r<", '\x0159') -- LATIN SMALL LETTER R WITH CARON
-    , ("S'", '\x015A') -- LATIN CAPITAL LETTER S WITH ACUTE
-    , ("s'", '\x015B') -- LATIN SMALL LETTER S WITH ACUTE
-    , ("S>", '\x015C') -- LATIN CAPITAL LETTER S WITH CIRCUMFLEX
-    , ("s>", '\x015D') -- LATIN SMALL LETTER S WITH CIRCUMFLEX
-    , ("S,", '\x015E') -- LATIN CAPITAL LETTER S WITH CEDILLA
-    , ("s,", '\x015F') -- LATIN SMALL LETTER S WITH CEDILLA
-    , ("S<", '\x0160') -- LATIN CAPITAL LETTER S WITH CARON
-    , ("s<", '\x0161') -- LATIN SMALL LETTER S WITH CARON
-    , ("T,", '\x0162') -- LATIN CAPITAL LETTER T WITH CEDILLA
-    , ("t,", '\x0163') -- LATIN SMALL LETTER T WITH CEDILLA
-    , ("T<", '\x0164') -- LATIN CAPITAL LETTER T WITH CARON
-    , ("t<", '\x0165') -- LATIN SMALL LETTER T WITH CARON
-    , ("T/", '\x0166') -- LATIN CAPITAL LETTER T WITH STROKE
-    , ("t/", '\x0167') -- LATIN SMALL LETTER T WITH STROKE
-    , ("U?", '\x0168') -- LATIN CAPITAL LETTER U WITH TILDE
-    , ("u?", '\x0169') -- LATIN SMALL LETTER U WITH TILDE
-    , ("U-", '\x016A') -- LATIN CAPITAL LETTER U WITH MACRON
-    , ("u-", '\x016B') -- LATIN SMALL LETTER U WITH MACRON
-    , ("U(", '\x016C') -- LATIN CAPITAL LETTER U WITH BREVE
-    , ("u(", '\x016D') -- LATIN SMALL LETTER U WITH BREVE
-    , ("U0", '\x016E') -- LATIN CAPITAL LETTER U WITH RING ABOVE
-    , ("u0", '\x016F') -- LATIN SMALL LETTER U WITH RING ABOVE
-    , ("U\"", '\x0170') -- LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
-    , ("u\"", '\x0171') -- LATIN SMALL LETTER U WITH DOUBLE ACUTE
-    , ("U;", '\x0172') -- LATIN CAPITAL LETTER U WITH OGONEK
-    , ("u;", '\x0173') -- LATIN SMALL LETTER U WITH OGONEK
-    , ("W>", '\x0174') -- LATIN CAPITAL LETTER W WITH CIRCUMFLEX
-    , ("w>", '\x0175') -- LATIN SMALL LETTER W WITH CIRCUMFLEX
-    , ("Y>", '\x0176') -- LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
-    , ("y>", '\x0177') -- LATIN SMALL LETTER Y WITH CIRCUMFLEX
-    , ("Y:", '\x0178') -- LATIN CAPITAL LETTER Y WITH DIAERESIS
-    , ("Z'", '\x0179') -- LATIN CAPITAL LETTER Z WITH ACUTE
-    , ("z'", '\x017A') -- LATIN SMALL LETTER Z WITH ACUTE
-    , ("Z.", '\x017B') -- LATIN CAPITAL LETTER Z WITH DOT ABOVE
-    , ("z.", '\x017C') -- LATIN SMALL LETTER Z WITH DOT ABOVE
-    , ("Z<", '\x017D') -- LATIN CAPITAL LETTER Z WITH CARON
-    , ("z<", '\x017E') -- LATIN SMALL LETTER Z WITH CARON
-    , ("O9", '\x01A0') -- LATIN CAPITAL LETTER O WITH HORN
-    , ("o9", '\x01A1') -- LATIN SMALL LETTER O WITH HORN
-    , ("OI", '\x01A2') -- LATIN CAPITAL LETTER OI
-    , ("oi", '\x01A3') -- LATIN SMALL LETTER OI
-    , ("yr", '\x01A6') -- LATIN LETTER YR
-    , ("U9", '\x01AF') -- LATIN CAPITAL LETTER U WITH HORN
-    , ("u9", '\x01B0') -- LATIN SMALL LETTER U WITH HORN
-    , ("Z/", '\x01B5') -- LATIN CAPITAL LETTER Z WITH STROKE
-    , ("z/", '\x01B6') -- LATIN SMALL LETTER Z WITH STROKE
-    , ("ED", '\x01B7') -- LATIN CAPITAL LETTER EZH
-    , ("A<", '\x01CD') -- LATIN CAPITAL LETTER A WITH CARON
-    , ("a<", '\x01CE') -- LATIN SMALL LETTER A WITH CARON
-    , ("I<", '\x01CF') -- LATIN CAPITAL LETTER I WITH CARON
-    , ("i<", '\x01D0') -- LATIN SMALL LETTER I WITH CARON
-    , ("O<", '\x01D1') -- LATIN CAPITAL LETTER O WITH CARON
-    , ("o<", '\x01D2') -- LATIN SMALL LETTER O WITH CARON
-    , ("U<", '\x01D3') -- LATIN CAPITAL LETTER U WITH CARON
-    , ("u<", '\x01D4') -- LATIN SMALL LETTER U WITH CARON
-    , ("A1", '\x01DE') -- LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
-    , ("a1", '\x01DF') -- LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
-    , ("A7", '\x01E0') -- LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
-    , ("a7", '\x01E1') -- LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
-    , ("A3", '\x01E2') -- LATIN CAPITAL LETTER AE WITH MACRON
-    , ("a3", '\x01E3') -- LATIN SMALL LETTER AE WITH MACRON
-    , ("G/", '\x01E4') -- LATIN CAPITAL LETTER G WITH STROKE
-    , ("g/", '\x01E5') -- LATIN SMALL LETTER G WITH STROKE
-    , ("G<", '\x01E6') -- LATIN CAPITAL LETTER G WITH CARON
-    , ("g<", '\x01E7') -- LATIN SMALL LETTER G WITH CARON
-    , ("K<", '\x01E8') -- LATIN CAPITAL LETTER K WITH CARON
-    , ("k<", '\x01E9') -- LATIN SMALL LETTER K WITH CARON
-    , ("O;", '\x01EA') -- LATIN CAPITAL LETTER O WITH OGONEK
-    , ("o;", '\x01EB') -- LATIN SMALL LETTER O WITH OGONEK
-    , ("O1", '\x01EC') -- LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
-    , ("o1", '\x01ED') -- LATIN SMALL LETTER O WITH OGONEK AND MACRON
-    , ("EZ", '\x01EE') -- LATIN CAPITAL LETTER EZH WITH CARON
-    , ("ez", '\x01EF') -- LATIN SMALL LETTER EZH WITH CARON
-    , ("j<", '\x01F0') -- LATIN SMALL LETTER J WITH CARON
-    , ("G'", '\x01F4') -- LATIN CAPITAL LETTER G WITH ACUTE
-    , ("g'", '\x01F5') -- LATIN SMALL LETTER G WITH ACUTE
-    , (";S", '\x02BF') -- MODIFIER LETTER LEFT HALF RING
-    , ("'<", '\x02C7') -- CARON
-    , ("'(", '\x02D8') -- BREVE
-    , ("'.", '\x02D9') -- DOT ABOVE
-    , ("'0", '\x02DA') -- RING ABOVE
-    , ("';", '\x02DB') -- OGONEK
-    , ("'\"", '\x02DD') -- DOUBLE ACUTE ACCENT
-    , ("A%", '\x0386') -- GREEK CAPITAL LETTER ALPHA WITH TONOS
-    , ("E%", '\x0388') -- GREEK CAPITAL LETTER EPSILON WITH TONOS
-    , ("Y%", '\x0389') -- GREEK CAPITAL LETTER ETA WITH TONOS
-    , ("I%", '\x038A') -- GREEK CAPITAL LETTER IOTA WITH TONOS
-    , ("O%", '\x038C') -- GREEK CAPITAL LETTER OMICRON WITH TONOS
-    , ("U%", '\x038E') -- GREEK CAPITAL LETTER UPSILON WITH TONOS
-    , ("W%", '\x038F') -- GREEK CAPITAL LETTER OMEGA WITH TONOS
-    , ("i3", '\x0390') -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
-    , ("A*", '\x0391') -- GREEK CAPITAL LETTER ALPHA
-    , ("B*", '\x0392') -- GREEK CAPITAL LETTER BETA
-    , ("G*", '\x0393') -- GREEK CAPITAL LETTER GAMMA
-    , ("D*", '\x0394') -- GREEK CAPITAL LETTER DELTA
-    , ("E*", '\x0395') -- GREEK CAPITAL LETTER EPSILON
-    , ("Z*", '\x0396') -- GREEK CAPITAL LETTER ZETA
-    , ("Y*", '\x0397') -- GREEK CAPITAL LETTER ETA
-    , ("H*", '\x0398') -- GREEK CAPITAL LETTER THETA
-    , ("I*", '\x0399') -- GREEK CAPITAL LETTER IOTA
-    , ("K*", '\x039A') -- GREEK CAPITAL LETTER KAPPA
-    , ("L*", '\x039B') -- GREEK CAPITAL LETTER LAMDA
-    , ("M*", '\x039C') -- GREEK CAPITAL LETTER MU
-    , ("N*", '\x039D') -- GREEK CAPITAL LETTER NU
-    , ("C*", '\x039E') -- GREEK CAPITAL LETTER XI
-    , ("O*", '\x039F') -- GREEK CAPITAL LETTER OMICRON
-    , ("P*", '\x03A0') -- GREEK CAPITAL LETTER PI
-    , ("R*", '\x03A1') -- GREEK CAPITAL LETTER RHO
-    , ("S*", '\x03A3') -- GREEK CAPITAL LETTER SIGMA
-    , ("T*", '\x03A4') -- GREEK CAPITAL LETTER TAU
-    , ("U*", '\x03A5') -- GREEK CAPITAL LETTER UPSILON
-    , ("F*", '\x03A6') -- GREEK CAPITAL LETTER PHI
-    , ("X*", '\x03A7') -- GREEK CAPITAL LETTER CHI
-    , ("Q*", '\x03A8') -- GREEK CAPITAL LETTER PSI
-    , ("W*", '\x03A9') -- GREEK CAPITAL LETTER OMEGA
-    , ("J*", '\x03AA') -- GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
-    , ("V*", '\x03AB') -- GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
-    , ("a%", '\x03AC') -- GREEK SMALL LETTER ALPHA WITH TONOS
-    , ("e%", '\x03AD') -- GREEK SMALL LETTER EPSILON WITH TONOS
-    , ("y%", '\x03AE') -- GREEK SMALL LETTER ETA WITH TONOS
-    , ("i%", '\x03AF') -- GREEK SMALL LETTER IOTA WITH TONOS
-    , ("u3", '\x03B0') -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
-    , ("a*", '\x03B1') -- GREEK SMALL LETTER ALPHA
-    , ("b*", '\x03B2') -- GREEK SMALL LETTER BETA
-    , ("g*", '\x03B3') -- GREEK SMALL LETTER GAMMA
-    , ("d*", '\x03B4') -- GREEK SMALL LETTER DELTA
-    , ("e*", '\x03B5') -- GREEK SMALL LETTER EPSILON
-    , ("z*", '\x03B6') -- GREEK SMALL LETTER ZETA
-    , ("y*", '\x03B7') -- GREEK SMALL LETTER ETA
-    , ("h*", '\x03B8') -- GREEK SMALL LETTER THETA
-    , ("i*", '\x03B9') -- GREEK SMALL LETTER IOTA
-    , ("k*", '\x03BA') -- GREEK SMALL LETTER KAPPA
-    , ("l*", '\x03BB') -- GREEK SMALL LETTER LAMDA
-    , ("m*", '\x03BC') -- GREEK SMALL LETTER MU
-    , ("n*", '\x03BD') -- GREEK SMALL LETTER NU
-    , ("c*", '\x03BE') -- GREEK SMALL LETTER XI
-    , ("o*", '\x03BF') -- GREEK SMALL LETTER OMICRON
-    , ("p*", '\x03C0') -- GREEK SMALL LETTER PI
-    , ("r*", '\x03C1') -- GREEK SMALL LETTER RHO
-    , ("*s", '\x03C2') -- GREEK SMALL LETTER FINAL SIGMA
-    , ("s*", '\x03C3') -- GREEK SMALL LETTER SIGMA
-    , ("t*", '\x03C4') -- GREEK SMALL LETTER TAU
-    , ("u*", '\x03C5') -- GREEK SMALL LETTER UPSILON
-    , ("f*", '\x03C6') -- GREEK SMALL LETTER PHI
-    , ("x*", '\x03C7') -- GREEK SMALL LETTER CHI
-    , ("q*", '\x03C8') -- GREEK SMALL LETTER PSI
-    , ("w*", '\x03C9') -- GREEK SMALL LETTER OMEGA
-    , ("j*", '\x03CA') -- GREEK SMALL LETTER IOTA WITH DIALYTIKA
-    , ("v*", '\x03CB') -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA
-    , ("o%", '\x03CC') -- GREEK SMALL LETTER OMICRON WITH TONOS
-    , ("u%", '\x03CD') -- GREEK SMALL LETTER UPSILON WITH TONOS
-    , ("w%", '\x03CE') -- GREEK SMALL LETTER OMEGA WITH TONOS
-    , ("'G", '\x03D8') -- GREEK LETTER ARCHAIC KOPPA
-    , (",G", '\x03D9') -- GREEK SMALL LETTER ARCHAIC KOPPA
-    , ("T3", '\x03DA') -- GREEK LETTER STIGMA
-    , ("t3", '\x03DB') -- GREEK SMALL LETTER STIGMA
-    , ("M3", '\x03DC') -- GREEK LETTER DIGAMMA
-    , ("m3", '\x03DD') -- GREEK SMALL LETTER DIGAMMA
-    , ("K3", '\x03DE') -- GREEK LETTER KOPPA
-    , ("k3", '\x03DF') -- GREEK SMALL LETTER KOPPA
-    , ("P3", '\x03E0') -- GREEK LETTER SAMPI
-    , ("p3", '\x03E1') -- GREEK SMALL LETTER SAMPI
-    , ("'%", '\x03F4') -- GREEK CAPITAL THETA SYMBOL
-    , ("j3", '\x03F5') -- GREEK LUNATE EPSILON SYMBOL
-    , ("IO", '\x0401') -- CYRILLIC CAPITAL LETTER IO
-    , ("D%", '\x0402') -- CYRILLIC CAPITAL LETTER DJE
-    , ("G%", '\x0403') -- CYRILLIC CAPITAL LETTER GJE
-    , ("IE", '\x0404') -- CYRILLIC CAPITAL LETTER UKRAINIAN IE
-    , ("DS", '\x0405') -- CYRILLIC CAPITAL LETTER DZE
-    , ("II", '\x0406') -- CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
-    , ("YI", '\x0407') -- CYRILLIC CAPITAL LETTER YI
-    , ("J%", '\x0408') -- CYRILLIC CAPITAL LETTER JE
-    , ("LJ", '\x0409') -- CYRILLIC CAPITAL LETTER LJE
-    , ("NJ", '\x040A') -- CYRILLIC CAPITAL LETTER NJE
-    , ("Ts", '\x040B') -- CYRILLIC CAPITAL LETTER TSHE
-    , ("KJ", '\x040C') -- CYRILLIC CAPITAL LETTER KJE
-    , ("V%", '\x040E') -- CYRILLIC CAPITAL LETTER SHORT U
-    , ("DZ", '\x040F') -- CYRILLIC CAPITAL LETTER DZHE
-    , ("A=", '\x0410') -- CYRILLIC CAPITAL LETTER A
-    , ("B=", '\x0411') -- CYRILLIC CAPITAL LETTER BE
-    , ("V=", '\x0412') -- CYRILLIC CAPITAL LETTER VE
-    , ("G=", '\x0413') -- CYRILLIC CAPITAL LETTER GHE
-    , ("D=", '\x0414') -- CYRILLIC CAPITAL LETTER DE
-    , ("E=", '\x0415') -- CYRILLIC CAPITAL LETTER IE
-    , ("Z%", '\x0416') -- CYRILLIC CAPITAL LETTER ZHE
-    , ("Z=", '\x0417') -- CYRILLIC CAPITAL LETTER ZE
-    , ("I=", '\x0418') -- CYRILLIC CAPITAL LETTER I
-    , ("J=", '\x0419') -- CYRILLIC CAPITAL LETTER SHORT I
-    , ("K=", '\x041A') -- CYRILLIC CAPITAL LETTER KA
-    , ("L=", '\x041B') -- CYRILLIC CAPITAL LETTER EL
-    , ("M=", '\x041C') -- CYRILLIC CAPITAL LETTER EM
-    , ("N=", '\x041D') -- CYRILLIC CAPITAL LETTER EN
-    , ("O=", '\x041E') -- CYRILLIC CAPITAL LETTER O
-    , ("P=", '\x041F') -- CYRILLIC CAPITAL LETTER PE
-    , ("R=", '\x0420') -- CYRILLIC CAPITAL LETTER ER
-    , ("S=", '\x0421') -- CYRILLIC CAPITAL LETTER ES
-    , ("T=", '\x0422') -- CYRILLIC CAPITAL LETTER TE
-    , ("U=", '\x0423') -- CYRILLIC CAPITAL LETTER U
-    , ("F=", '\x0424') -- CYRILLIC CAPITAL LETTER EF
-    , ("H=", '\x0425') -- CYRILLIC CAPITAL LETTER HA
-    , ("C=", '\x0426') -- CYRILLIC CAPITAL LETTER TSE
-    , ("C%", '\x0427') -- CYRILLIC CAPITAL LETTER CHE
-    , ("S%", '\x0428') -- CYRILLIC CAPITAL LETTER SHA
-    , ("Sc", '\x0429') -- CYRILLIC CAPITAL LETTER SHCHA
-    , ("='", '\x042A') -- CYRILLIC CAPITAL LETTER HARD SIGN
-    , ("Y=", '\x042B') -- CYRILLIC CAPITAL LETTER YERU
-    , ("%'", '\x042C') -- CYRILLIC CAPITAL LETTER SOFT SIGN
-    , ("JE", '\x042D') -- CYRILLIC CAPITAL LETTER E
-    , ("JU", '\x042E') -- CYRILLIC CAPITAL LETTER YU
-    , ("JA", '\x042F') -- CYRILLIC CAPITAL LETTER YA
-    , ("a=", '\x0430') -- CYRILLIC SMALL LETTER A
-    , ("b=", '\x0431') -- CYRILLIC SMALL LETTER BE
-    , ("v=", '\x0432') -- CYRILLIC SMALL LETTER VE
-    , ("g=", '\x0433') -- CYRILLIC SMALL LETTER GHE
-    , ("d=", '\x0434') -- CYRILLIC SMALL LETTER DE
-    , ("e=", '\x0435') -- CYRILLIC SMALL LETTER IE
-    , ("z%", '\x0436') -- CYRILLIC SMALL LETTER ZHE
-    , ("z=", '\x0437') -- CYRILLIC SMALL LETTER ZE
-    , ("i=", '\x0438') -- CYRILLIC SMALL LETTER I
-    , ("j=", '\x0439') -- CYRILLIC SMALL LETTER SHORT I
-    , ("k=", '\x043A') -- CYRILLIC SMALL LETTER KA
-    , ("l=", '\x043B') -- CYRILLIC SMALL LETTER EL
-    , ("m=", '\x043C') -- CYRILLIC SMALL LETTER EM
-    , ("n=", '\x043D') -- CYRILLIC SMALL LETTER EN
-    , ("o=", '\x043E') -- CYRILLIC SMALL LETTER O
-    , ("p=", '\x043F') -- CYRILLIC SMALL LETTER PE
-    , ("r=", '\x0440') -- CYRILLIC SMALL LETTER ER
-    , ("s=", '\x0441') -- CYRILLIC SMALL LETTER ES
-    , ("t=", '\x0442') -- CYRILLIC SMALL LETTER TE
-    , ("u=", '\x0443') -- CYRILLIC SMALL LETTER U
-    , ("f=", '\x0444') -- CYRILLIC SMALL LETTER EF
-    , ("h=", '\x0445') -- CYRILLIC SMALL LETTER HA
-    , ("c=", '\x0446') -- CYRILLIC SMALL LETTER TSE
-    , ("c%", '\x0447') -- CYRILLIC SMALL LETTER CHE
-    , ("s%", '\x0448') -- CYRILLIC SMALL LETTER SHA
-    , ("sc", '\x0449') -- CYRILLIC SMALL LETTER SHCHA
-    , ("='", '\x044A') -- CYRILLIC SMALL LETTER HARD SIGN
-    , ("y=", '\x044B') -- CYRILLIC SMALL LETTER YERU
-    , ("%'", '\x044C') -- CYRILLIC SMALL LETTER SOFT SIGN
-    , ("je", '\x044D') -- CYRILLIC SMALL LETTER E
-    , ("ju", '\x044E') -- CYRILLIC SMALL LETTER YU
-    , ("ja", '\x044F') -- CYRILLIC SMALL LETTER YA
-    , ("io", '\x0451') -- CYRILLIC SMALL LETTER IO
-    , ("d%", '\x0452') -- CYRILLIC SMALL LETTER DJE
-    , ("g%", '\x0453') -- CYRILLIC SMALL LETTER GJE
-    , ("ie", '\x0454') -- CYRILLIC SMALL LETTER UKRAINIAN IE
-    , ("ds", '\x0455') -- CYRILLIC SMALL LETTER DZE
-    , ("ii", '\x0456') -- CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
-    , ("yi", '\x0457') -- CYRILLIC SMALL LETTER YI
-    , ("j%", '\x0458') -- CYRILLIC SMALL LETTER JE
-    , ("lj", '\x0459') -- CYRILLIC SMALL LETTER LJE
-    , ("nj", '\x045A') -- CYRILLIC SMALL LETTER NJE
-    , ("ts", '\x045B') -- CYRILLIC SMALL LETTER TSHE
-    , ("kj", '\x045C') -- CYRILLIC SMALL LETTER KJE
-    , ("v%", '\x045E') -- CYRILLIC SMALL LETTER SHORT U
-    , ("dz", '\x045F') -- CYRILLIC SMALL LETTER DZHE
-    , ("Y3", '\x0462') -- CYRILLIC CAPITAL LETTER YAT
-    , ("y3", '\x0463') -- CYRILLIC SMALL LETTER YAT
-    , ("O3", '\x046A') -- CYRILLIC CAPITAL LETTER BIG YUS
-    , ("o3", '\x046B') -- CYRILLIC SMALL LETTER BIG YUS
-    , ("F3", '\x0472') -- CYRILLIC CAPITAL LETTER FITA
-    , ("f3", '\x0473') -- CYRILLIC SMALL LETTER FITA
-    , ("V3", '\x0474') -- CYRILLIC CAPITAL LETTER IZHITSA
-    , ("v3", '\x0475') -- CYRILLIC SMALL LETTER IZHITSA
-    , ("C3", '\x0480') -- CYRILLIC CAPITAL LETTER KOPPA
-    , ("c3", '\x0481') -- CYRILLIC SMALL LETTER KOPPA
-    , ("G3", '\x0490') -- CYRILLIC CAPITAL LETTER GHE WITH UPTURN
-    , ("g3", '\x0491') -- CYRILLIC SMALL LETTER GHE WITH UPTURN
-    , ("A+", '\x05D0') -- HEBREW LETTER ALEF
-    , ("B+", '\x05D1') -- HEBREW LETTER BET
-    , ("G+", '\x05D2') -- HEBREW LETTER GIMEL
-    , ("D+", '\x05D3') -- HEBREW LETTER DALET
-    , ("H+", '\x05D4') -- HEBREW LETTER HE
-    , ("W+", '\x05D5') -- HEBREW LETTER VAV
-    , ("Z+", '\x05D6') -- HEBREW LETTER ZAYIN
-    , ("X+", '\x05D7') -- HEBREW LETTER HET
-    , ("Tj", '\x05D8') -- HEBREW LETTER TET
-    , ("J+", '\x05D9') -- HEBREW LETTER YOD
-    , ("K%", '\x05DA') -- HEBREW LETTER FINAL KAF
-    , ("K+", '\x05DB') -- HEBREW LETTER KAF
-    , ("L+", '\x05DC') -- HEBREW LETTER LAMED
-    , ("M%", '\x05DD') -- HEBREW LETTER FINAL MEM
-    , ("M+", '\x05DE') -- HEBREW LETTER MEM
-    , ("N%", '\x05DF') -- HEBREW LETTER FINAL NUN `
-    , ("N+", '\x05E0') -- HEBREW LETTER NUN `
-    , ("S+", '\x05E1') -- HEBREW LETTER SAMEKH
-    , ("E+", '\x05E2') -- HEBREW LETTER AYIN
-    , ("P%", '\x05E3') -- HEBREW LETTER FINAL PE
-    , ("P+", '\x05E4') -- HEBREW LETTER PE
-    , ("Zj", '\x05E5') -- HEBREW LETTER FINAL TSADI
-    , ("ZJ", '\x05E6') -- HEBREW LETTER TSADI
-    , ("Q+", '\x05E7') -- HEBREW LETTER QOF
-    , ("R+", '\x05E8') -- HEBREW LETTER RESH
-    , ("Sh", '\x05E9') -- HEBREW LETTER SHIN
-    , ("T+", '\x05EA') -- HEBREW LETTER TAV
-    , (",+", '\x060C') -- ARABIC COMMA
-    , (";+", '\x061B') -- ARABIC SEMICOLON
-    , ("?+", '\x061F') -- ARABIC QUESTION MARK
-    , ("H'", '\x0621') -- ARABIC LETTER HAMZA
-    , ("aM", '\x0622') -- ARABIC LETTER ALEF WITH MADDA ABOVE
-    , ("aH", '\x0623') -- ARABIC LETTER ALEF WITH HAMZA ABOVE
-    , ("wH", '\x0624') -- ARABIC LETTER WAW WITH HAMZA ABOVE
-    , ("ah", '\x0625') -- ARABIC LETTER ALEF WITH HAMZA BELOW
-    , ("yH", '\x0626') -- ARABIC LETTER YEH WITH HAMZA ABOVE
-    , ("a+", '\x0627') -- ARABIC LETTER ALEF
-    , ("b+", '\x0628') -- ARABIC LETTER BEH
-    , ("tm", '\x0629') -- ARABIC LETTER TEH MARBUTA
-    , ("t+", '\x062A') -- ARABIC LETTER TEH
-    , ("tk", '\x062B') -- ARABIC LETTER THEH
-    , ("g+", '\x062C') -- ARABIC LETTER JEEM
-    , ("hk", '\x062D') -- ARABIC LETTER HAH
-    , ("x+", '\x062E') -- ARABIC LETTER KHAH
-    , ("d+", '\x062F') -- ARABIC LETTER DAL
-    , ("dk", '\x0630') -- ARABIC LETTER THAL
-    , ("r+", '\x0631') -- ARABIC LETTER REH
-    , ("z+", '\x0632') -- ARABIC LETTER ZAIN
-    , ("s+", '\x0633') -- ARABIC LETTER SEEN
-    , ("sn", '\x0634') -- ARABIC LETTER SHEEN
-    , ("c+", '\x0635') -- ARABIC LETTER SAD
-    , ("dd", '\x0636') -- ARABIC LETTER DAD
-    , ("tj", '\x0637') -- ARABIC LETTER TAH
-    , ("zH", '\x0638') -- ARABIC LETTER ZAH
-    , ("e+", '\x0639') -- ARABIC LETTER AIN
-    , ("i+", '\x063A') -- ARABIC LETTER GHAIN
-    , ("++", '\x0640') -- ARABIC TATWEEL
-    , ("f+", '\x0641') -- ARABIC LETTER FEH
-    , ("q+", '\x0642') -- ARABIC LETTER QAF
-    , ("k+", '\x0643') -- ARABIC LETTER KAF
-    , ("l+", '\x0644') -- ARABIC LETTER LAM
-    , ("m+", '\x0645') -- ARABIC LETTER MEEM
-    , ("n+", '\x0646') -- ARABIC LETTER NOON
-    , ("h+", '\x0647') -- ARABIC LETTER HEH
-    , ("w+", '\x0648') -- ARABIC LETTER WAW
-    , ("j+", '\x0649') -- ARABIC LETTER ALEF MAKSURA
-    , ("y+", '\x064A') -- ARABIC LETTER YEH
-    , (":+", '\x064B') -- ARABIC FATHATAN
-    , ("\"+", '\x064C') -- ARABIC DAMMATAN
-    , ("=+", '\x064D') -- ARABIC KASRATAN
-    , ("/+", '\x064E') -- ARABIC FATHA
-    , ("'+", '\x064F') -- ARABIC DAMMA
-    , ("1+", '\x0650') -- ARABIC KASRA
-    , ("3+", '\x0651') -- ARABIC SHADDA
-    , ("0+", '\x0652') -- ARABIC SUKUN
-    , ("aS", '\x0670') -- ARABIC LETTER SUPERSCRIPT ALEF
-    , ("p+", '\x067E') -- ARABIC LETTER PEH
-    , ("v+", '\x06A4') -- ARABIC LETTER VEH
-    , ("gf", '\x06AF') -- ARABIC LETTER GAF
-    , ("0a", '\x06F0') -- EXTENDED ARABIC-INDIC DIGIT ZERO
-    , ("1a", '\x06F1') -- EXTENDED ARABIC-INDIC DIGIT ONE
-    , ("2a", '\x06F2') -- EXTENDED ARABIC-INDIC DIGIT TWO
-    , ("3a", '\x06F3') -- EXTENDED ARABIC-INDIC DIGIT THREE
-    , ("4a", '\x06F4') -- EXTENDED ARABIC-INDIC DIGIT FOUR
-    , ("5a", '\x06F5') -- EXTENDED ARABIC-INDIC DIGIT FIVE
-    , ("6a", '\x06F6') -- EXTENDED ARABIC-INDIC DIGIT SIX
-    , ("7a", '\x06F7') -- EXTENDED ARABIC-INDIC DIGIT SEVEN
-    , ("8a", '\x06F8') -- EXTENDED ARABIC-INDIC DIGIT EIGHT
-    , ("9a", '\x06F9') -- EXTENDED ARABIC-INDIC DIGIT NINE
-    , ("B.", '\x1E02') -- LATIN CAPITAL LETTER B WITH DOT ABOVE
-    , ("b.", '\x1E03') -- LATIN SMALL LETTER B WITH DOT ABOVE
-    , ("B_", '\x1E06') -- LATIN CAPITAL LETTER B WITH LINE BELOW
-    , ("b_", '\x1E07') -- LATIN SMALL LETTER B WITH LINE BELOW
-    , ("D.", '\x1E0A') -- LATIN CAPITAL LETTER D WITH DOT ABOVE
-    , ("d.", '\x1E0B') -- LATIN SMALL LETTER D WITH DOT ABOVE
-    , ("D_", '\x1E0E') -- LATIN CAPITAL LETTER D WITH LINE BELOW
-    , ("d_", '\x1E0F') -- LATIN SMALL LETTER D WITH LINE BELOW
-    , ("D,", '\x1E10') -- LATIN CAPITAL LETTER D WITH CEDILLA
-    , ("d,", '\x1E11') -- LATIN SMALL LETTER D WITH CEDILLA
-    , ("F.", '\x1E1E') -- LATIN CAPITAL LETTER F WITH DOT ABOVE
-    , ("f.", '\x1E1F') -- LATIN SMALL LETTER F WITH DOT ABOVE
-    , ("G-", '\x1E20') -- LATIN CAPITAL LETTER G WITH MACRON
-    , ("g-", '\x1E21') -- LATIN SMALL LETTER G WITH MACRON
-    , ("H.", '\x1E22') -- LATIN CAPITAL LETTER H WITH DOT ABOVE
-    , ("h.", '\x1E23') -- LATIN SMALL LETTER H WITH DOT ABOVE
-    , ("H:", '\x1E26') -- LATIN CAPITAL LETTER H WITH DIAERESIS
-    , ("h:", '\x1E27') -- LATIN SMALL LETTER H WITH DIAERESIS
-    , ("H,", '\x1E28') -- LATIN CAPITAL LETTER H WITH CEDILLA
-    , ("h,", '\x1E29') -- LATIN SMALL LETTER H WITH CEDILLA
-    , ("K'", '\x1E30') -- LATIN CAPITAL LETTER K WITH ACUTE
-    , ("k'", '\x1E31') -- LATIN SMALL LETTER K WITH ACUTE
-    , ("K_", '\x1E34') -- LATIN CAPITAL LETTER K WITH LINE BELOW
-    , ("k_", '\x1E35') -- LATIN SMALL LETTER K WITH LINE BELOW
-    , ("L_", '\x1E3A') -- LATIN CAPITAL LETTER L WITH LINE BELOW
-    , ("l_", '\x1E3B') -- LATIN SMALL LETTER L WITH LINE BELOW
-    , ("M'", '\x1E3E') -- LATIN CAPITAL LETTER M WITH ACUTE
-    , ("m'", '\x1E3F') -- LATIN SMALL LETTER M WITH ACUTE
-    , ("M.", '\x1E40') -- LATIN CAPITAL LETTER M WITH DOT ABOVE
-    , ("m.", '\x1E41') -- LATIN SMALL LETTER M WITH DOT ABOVE
-    , ("N.", '\x1E44') -- LATIN CAPITAL LETTER N WITH DOT ABOVE `
-    , ("n.", '\x1E45') -- LATIN SMALL LETTER N WITH DOT ABOVE `
-    , ("N_", '\x1E48') -- LATIN CAPITAL LETTER N WITH LINE BELOW `
-    , ("n_", '\x1E49') -- LATIN SMALL LETTER N WITH LINE BELOW `
-    , ("P'", '\x1E54') -- LATIN CAPITAL LETTER P WITH ACUTE
-    , ("p'", '\x1E55') -- LATIN SMALL LETTER P WITH ACUTE
-    , ("P.", '\x1E56') -- LATIN CAPITAL LETTER P WITH DOT ABOVE
-    , ("p.", '\x1E57') -- LATIN SMALL LETTER P WITH DOT ABOVE
-    , ("R.", '\x1E58') -- LATIN CAPITAL LETTER R WITH DOT ABOVE
-    , ("r.", '\x1E59') -- LATIN SMALL LETTER R WITH DOT ABOVE
-    , ("R_", '\x1E5E') -- LATIN CAPITAL LETTER R WITH LINE BELOW
-    , ("r_", '\x1E5F') -- LATIN SMALL LETTER R WITH LINE BELOW
-    , ("S.", '\x1E60') -- LATIN CAPITAL LETTER S WITH DOT ABOVE
-    , ("s.", '\x1E61') -- LATIN SMALL LETTER S WITH DOT ABOVE
-    , ("T.", '\x1E6A') -- LATIN CAPITAL LETTER T WITH DOT ABOVE
-    , ("t.", '\x1E6B') -- LATIN SMALL LETTER T WITH DOT ABOVE
-    , ("T_", '\x1E6E') -- LATIN CAPITAL LETTER T WITH LINE BELOW
-    , ("t_", '\x1E6F') -- LATIN SMALL LETTER T WITH LINE BELOW
-    , ("V?", '\x1E7C') -- LATIN CAPITAL LETTER V WITH TILDE
-    , ("v?", '\x1E7D') -- LATIN SMALL LETTER V WITH TILDE
-    , ("W!", '\x1E80') -- LATIN CAPITAL LETTER W WITH GRAVE
-    , ("w!", '\x1E81') -- LATIN SMALL LETTER W WITH GRAVE
-    , ("W'", '\x1E82') -- LATIN CAPITAL LETTER W WITH ACUTE
-    , ("w'", '\x1E83') -- LATIN SMALL LETTER W WITH ACUTE
-    , ("W:", '\x1E84') -- LATIN CAPITAL LETTER W WITH DIAERESIS
-    , ("w:", '\x1E85') -- LATIN SMALL LETTER W WITH DIAERESIS
-    , ("W.", '\x1E86') -- LATIN CAPITAL LETTER W WITH DOT ABOVE
-    , ("w.", '\x1E87') -- LATIN SMALL LETTER W WITH DOT ABOVE
-    , ("X.", '\x1E8A') -- LATIN CAPITAL LETTER X WITH DOT ABOVE
-    , ("x.", '\x1E8B') -- LATIN SMALL LETTER X WITH DOT ABOVE
-    , ("X:", '\x1E8C') -- LATIN CAPITAL LETTER X WITH DIAERESIS
-    , ("x:", '\x1E8D') -- LATIN SMALL LETTER X WITH DIAERESIS
-    , ("Y.", '\x1E8E') -- LATIN CAPITAL LETTER Y WITH DOT ABOVE
-    , ("y.", '\x1E8F') -- LATIN SMALL LETTER Y WITH DOT ABOVE
-    , ("Z>", '\x1E90') -- LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
-    , ("z>", '\x1E91') -- LATIN SMALL LETTER Z WITH CIRCUMFLEX
-    , ("Z_", '\x1E94') -- LATIN CAPITAL LETTER Z WITH LINE BELOW
-    , ("z_", '\x1E95') -- LATIN SMALL LETTER Z WITH LINE BELOW
-    , ("h_", '\x1E96') -- LATIN SMALL LETTER H WITH LINE BELOW
-    , ("t:", '\x1E97') -- LATIN SMALL LETTER T WITH DIAERESIS
-    , ("w0", '\x1E98') -- LATIN SMALL LETTER W WITH RING ABOVE
-    , ("y0", '\x1E99') -- LATIN SMALL LETTER Y WITH RING ABOVE
-    , ("A2", '\x1EA2') -- LATIN CAPITAL LETTER A WITH HOOK ABOVE
-    , ("a2", '\x1EA3') -- LATIN SMALL LETTER A WITH HOOK ABOVE
-    , ("E2", '\x1EBA') -- LATIN CAPITAL LETTER E WITH HOOK ABOVE
-    , ("e2", '\x1EBB') -- LATIN SMALL LETTER E WITH HOOK ABOVE
-    , ("E?", '\x1EBC') -- LATIN CAPITAL LETTER E WITH TILDE
-    , ("e?", '\x1EBD') -- LATIN SMALL LETTER E WITH TILDE
-    , ("I2", '\x1EC8') -- LATIN CAPITAL LETTER I WITH HOOK ABOVE
-    , ("i2", '\x1EC9') -- LATIN SMALL LETTER I WITH HOOK ABOVE
-    , ("O2", '\x1ECE') -- LATIN CAPITAL LETTER O WITH HOOK ABOVE
-    , ("o2", '\x1ECF') -- LATIN SMALL LETTER O WITH HOOK ABOVE
-    , ("U2", '\x1EE6') -- LATIN CAPITAL LETTER U WITH HOOK ABOVE
-    , ("u2", '\x1EE7') -- LATIN SMALL LETTER U WITH HOOK ABOVE
-    , ("Y!", '\x1EF2') -- LATIN CAPITAL LETTER Y WITH GRAVE
-    , ("y!", '\x1EF3') -- LATIN SMALL LETTER Y WITH GRAVE
-    , ("Y2", '\x1EF6') -- LATIN CAPITAL LETTER Y WITH HOOK ABOVE
-    , ("y2", '\x1EF7') -- LATIN SMALL LETTER Y WITH HOOK ABOVE
-    , ("Y?", '\x1EF8') -- LATIN CAPITAL LETTER Y WITH TILDE
-    , ("y?", '\x1EF9') -- LATIN SMALL LETTER Y WITH TILDE
-    , (";'", '\x1F00') -- GREEK SMALL LETTER ALPHA WITH PSILI
-    , (",'", '\x1F01') -- GREEK SMALL LETTER ALPHA WITH DASIA
-    , (";!", '\x1F02') -- GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
-    , (",!", '\x1F03') -- GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
-    , ("?;", '\x1F04') -- GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
-    , ("?,", '\x1F05') -- GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
-    , ("!:", '\x1F06') -- GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
-    , ("?:", '\x1F07') -- GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
-    , ("1N", '\x2002') -- EN SPACE
-    , ("1M", '\x2003') -- EM SPACE
-    , ("3M", '\x2004') -- THREE-PER-EM SPACE
-    , ("4M", '\x2005') -- FOUR-PER-EM SPACE
-    , ("6M", '\x2006') -- SIX-PER-EM SPACE
-    , ("1T", '\x2009') -- THIN SPACE
-    , ("1H", '\x200A') -- HAIR SPACE
-    , ("-1", '\x2010') -- HYPHEN
-    , ("-N", '\x2013') -- EN DASH `
-    , ("-M", '\x2014') -- EM DASH
-    , ("-3", '\x2015') -- HORIZONTAL BAR
-    , ("!2", '\x2016') -- DOUBLE VERTICAL LINE
-    , ("=2", '\x2017') -- DOUBLE LOW LINE
-    , ("'6", '\x2018') -- LEFT SINGLE QUOTATION MARK
-    , ("'9", '\x2019') -- RIGHT SINGLE QUOTATION MARK
-    , (".9", '\x201A') -- SINGLE LOW-9 QUOTATION MARK
-    , ("9'", '\x201B') -- SINGLE HIGH-REVERSED-9 QUOTATION MARK
-    , ("\"6", '\x201C') -- LEFT DOUBLE QUOTATION MARK
-    , ("\"9", '\x201D') -- RIGHT DOUBLE QUOTATION MARK
-    , (":9", '\x201E') -- DOUBLE LOW-9 QUOTATION MARK
-    , ("9\"", '\x201F') -- DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-    , ("/-", '\x2020') -- DAGGER
-    , ("/=", '\x2021') -- DOUBLE DAGGER
-    , ("..", '\x2025') -- TWO DOT LEADER
-    , ("%0", '\x2030') -- PER MILLE SIGN
-    , ("1'", '\x2032') -- PRIME
-    , ("2'", '\x2033') -- DOUBLE PRIME
-    , ("3'", '\x2034') -- TRIPLE PRIME
-    , ("1\"", '\x2035') -- REVERSED PRIME
-    , ("2\"", '\x2036') -- REVERSED DOUBLE PRIME
-    , ("3\"", '\x2037') -- REVERSED TRIPLE PRIME
-    , ("Ca", '\x2038') -- CARET
-    , ("<1", '\x2039') -- SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-    , (">1", '\x203A') -- SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-    , (":X", '\x203B') -- REFERENCE MARK
-    , ("'-", '\x203E') -- OVERLINE
-    , ("/f", '\x2044') -- FRACTION SLASH
-    , ("0S", '\x2070') -- SUPERSCRIPT ZERO
-    , ("4S", '\x2074') -- SUPERSCRIPT FOUR
-    , ("5S", '\x2075') -- SUPERSCRIPT FIVE
-    , ("6S", '\x2076') -- SUPERSCRIPT SIX
-    , ("7S", '\x2077') -- SUPERSCRIPT SEVEN
-    , ("8S", '\x2078') -- SUPERSCRIPT EIGHT
-    , ("9S", '\x2079') -- SUPERSCRIPT NINE
-    , ("+S", '\x207A') -- SUPERSCRIPT PLUS SIGN
-    , ("-S", '\x207B') -- SUPERSCRIPT MINUS
-    , ("=S", '\x207C') -- SUPERSCRIPT EQUALS SIGN
-    , ("(S", '\x207D') -- SUPERSCRIPT LEFT PARENTHESIS
-    , (")S", '\x207E') -- SUPERSCRIPT RIGHT PARENTHESIS
-    , ("nS", '\x207F') -- SUPERSCRIPT LATIN SMALL LETTER N `
-    , ("0s", '\x2080') -- SUBSCRIPT ZERO
-    , ("1s", '\x2081') -- SUBSCRIPT ONE
-    , ("2s", '\x2082') -- SUBSCRIPT TWO
-    , ("3s", '\x2083') -- SUBSCRIPT THREE
-    , ("4s", '\x2084') -- SUBSCRIPT FOUR
-    , ("5s", '\x2085') -- SUBSCRIPT FIVE
-    , ("6s", '\x2086') -- SUBSCRIPT SIX
-    , ("7s", '\x2087') -- SUBSCRIPT SEVEN
-    , ("8s", '\x2088') -- SUBSCRIPT EIGHT
-    , ("9s", '\x2089') -- SUBSCRIPT NINE
-    , ("+s", '\x208A') -- SUBSCRIPT PLUS SIGN
-    , ("-s", '\x208B') -- SUBSCRIPT MINUS
-    , ("=s", '\x208C') -- SUBSCRIPT EQUALS SIGN
-    , ("(s", '\x208D') -- SUBSCRIPT LEFT PARENTHESIS
-    , (")s", '\x208E') -- SUBSCRIPT RIGHT PARENTHESIS
-    , ("Li", '\x20A4') -- LIRA SIGN
-    , ("Pt", '\x20A7') -- PESETA SIGN
-    , ("W=", '\x20A9') -- WON SIGN
-    , ("Eu", '\x20AC') -- EURO SIGN
-    , ("oC", '\x2103') -- DEGREE CELSIUS
-    , ("co", '\x2105') -- CARE OF
-    , ("oF", '\x2109') -- DEGREE FAHRENHEIT
-    , ("N0", '\x2116') -- NUMERO SIGN
-    , ("PO", '\x2117') -- SOUND RECORDING COPYRIGHT
-    , ("Rx", '\x211E') -- PRESCRIPTION TAKE
-    , ("SM", '\x2120') -- SERVICE MARK
-    , ("TM", '\x2122') -- TRADE MARK SIGN
-    , ("Om", '\x2126') -- OHM SIGN
-    , ("AO", '\x212B') -- ANGSTROM SIGN
-    , ("13", '\x2153') -- VULGAR FRACTION ONE THIRD
-    , ("23", '\x2154') -- VULGAR FRACTION TWO THIRDS
-    , ("15", '\x2155') -- VULGAR FRACTION ONE FIFTH
-    , ("25", '\x2156') -- VULGAR FRACTION TWO FIFTHS
-    , ("35", '\x2157') -- VULGAR FRACTION THREE FIFTHS
-    , ("45", '\x2158') -- VULGAR FRACTION FOUR FIFTHS
-    , ("16", '\x2159') -- VULGAR FRACTION ONE SIXTH
-    , ("56", '\x215A') -- VULGAR FRACTION FIVE SIXTHS
-    , ("18", '\x215B') -- VULGAR FRACTION ONE EIGHTH
-    , ("38", '\x215C') -- VULGAR FRACTION THREE EIGHTHS
-    , ("58", '\x215D') -- VULGAR FRACTION FIVE EIGHTHS
-    , ("78", '\x215E') -- VULGAR FRACTION SEVEN EIGHTHS
-    , ("1R", '\x2160') -- ROMAN NUMERAL ONE
-    , ("2R", '\x2161') -- ROMAN NUMERAL TWO
-    , ("3R", '\x2162') -- ROMAN NUMERAL THREE
-    , ("4R", '\x2163') -- ROMAN NUMERAL FOUR
-    , ("5R", '\x2164') -- ROMAN NUMERAL FIVE
-    , ("6R", '\x2165') -- ROMAN NUMERAL SIX
-    , ("7R", '\x2166') -- ROMAN NUMERAL SEVEN
-    , ("8R", '\x2167') -- ROMAN NUMERAL EIGHT
-    , ("9R", '\x2168') -- ROMAN NUMERAL NINE
-    , ("aR", '\x2169') -- ROMAN NUMERAL TEN
-    , ("bR", '\x216A') -- ROMAN NUMERAL ELEVEN
-    , ("cR", '\x216B') -- ROMAN NUMERAL TWELVE
-    , ("1r", '\x2170') -- SMALL ROMAN NUMERAL ONE
-    , ("2r", '\x2171') -- SMALL ROMAN NUMERAL TWO
-    , ("3r", '\x2172') -- SMALL ROMAN NUMERAL THREE
-    , ("4r", '\x2173') -- SMALL ROMAN NUMERAL FOUR
-    , ("5r", '\x2174') -- SMALL ROMAN NUMERAL FIVE
-    , ("6r", '\x2175') -- SMALL ROMAN NUMERAL SIX
-    , ("7r", '\x2176') -- SMALL ROMAN NUMERAL SEVEN
-    , ("8r", '\x2177') -- SMALL ROMAN NUMERAL EIGHT
-    , ("9r", '\x2178') -- SMALL ROMAN NUMERAL NINE
-    , ("ar", '\x2179') -- SMALL ROMAN NUMERAL TEN
-    , ("br", '\x217A') -- SMALL ROMAN NUMERAL ELEVEN
-    , ("cr", '\x217B') -- SMALL ROMAN NUMERAL TWELVE
-    , ("<-", '\x2190') -- LEFTWARDS ARROW
-    , ("-!", '\x2191') -- UPWARDS ARROW
-    , ("->", '\x2192') -- RIGHTWARDS ARROW
-    , ("-v", '\x2193') -- DOWNWARDS ARROW
-    , ("<>", '\x2194') -- LEFT RIGHT ARROW
-    , ("UD", '\x2195') -- UP DOWN ARROW
-    , ("<=", '\x21D0') -- LEFTWARDS DOUBLE ARROW
-    , ("=>", '\x21D2') -- RIGHTWARDS DOUBLE ARROW
-    , ("==", '\x21D4') -- LEFT RIGHT DOUBLE ARROW
-    , ("FA", '\x2200') -- FOR ALL
-    , ("dP", '\x2202') -- PARTIAL DIFFERENTIAL
-    , ("TE", '\x2203') -- THERE EXISTS
-    , ("/0", '\x2205') -- EMPTY SET
-    , ("DE", '\x2206') -- INCREMENT
-    , ("NB", '\x2207') -- NABLA
-    , ("(-", '\x2208') -- ELEMENT OF
-    , ("-)", '\x220B') -- CONTAINS AS MEMBER
-    , ("*P", '\x220F') -- N-ARY PRODUCT `
-    , ("+Z", '\x2211') -- N-ARY SUMMATION `
-    , ("-2", '\x2212') -- MINUS SIGN
-    , ("-+", '\x2213') -- MINUS-OR-PLUS SIGN
-    , ("*-", '\x2217') -- ASTERISK OPERATOR
-    , ("Ob", '\x2218') -- RING OPERATOR
-    , ("Sb", '\x2219') -- BULLET OPERATOR
-    , ("RT", '\x221A') -- SQUARE ROOT
-    , ("0(", '\x221D') -- PROPORTIONAL TO
-    , ("00", '\x221E') -- INFINITY
-    , ("-L", '\x221F') -- RIGHT ANGLE
-    , ("-V", '\x2220') -- ANGLE
-    , ("PP", '\x2225') -- PARALLEL TO
-    , ("AN", '\x2227') -- LOGICAL AND
-    , ("OR", '\x2228') -- LOGICAL OR
-    , ("(U", '\x2229') -- INTERSECTION
-    , (")U", '\x222A') -- UNION
-    , ("In", '\x222B') -- INTEGRAL
-    , ("DI", '\x222C') -- DOUBLE INTEGRAL
-    , ("Io", '\x222E') -- CONTOUR INTEGRAL
-    , (".:", '\x2234') -- THEREFORE
-    , (":.", '\x2235') -- BECAUSE
-    , (":R", '\x2236') -- RATIO
-    , ("::", '\x2237') -- PROPORTION
-    , ("?1", '\x223C') -- TILDE OPERATOR
-    , ("CG", '\x223E') -- INVERTED LAZY S
-    , ("?-", '\x2243') -- ASYMPTOTICALLY EQUAL TO
-    , ("?=", '\x2245') -- APPROXIMATELY EQUAL TO
-    , ("?2", '\x2248') -- ALMOST EQUAL TO
-    , ("=?", '\x224C') -- ALL EQUAL TO
-    , ("HI", '\x2253') -- IMAGE OF OR APPROXIMATELY EQUAL TO
-    , ("!=", '\x2260') -- NOT EQUAL TO
-    , ("=3", '\x2261') -- IDENTICAL TO
-    , ("=<", '\x2264') -- LESS-THAN OR EQUAL TO
-    , (">=", '\x2265') -- GREATER-THAN OR EQUAL TO
-    , ("<*", '\x226A') -- MUCH LESS-THAN
-    , ("*>", '\x226B') -- MUCH GREATER-THAN
-    , ("!<", '\x226E') -- NOT LESS-THAN
-    , ("!>", '\x226F') -- NOT GREATER-THAN
-    , ("(C", '\x2282') -- SUBSET OF
-    , (")C", '\x2283') -- SUPERSET OF
-    , ("(_", '\x2286') -- SUBSET OF OR EQUAL TO
-    , (")_", '\x2287') -- SUPERSET OF OR EQUAL TO
-    , ("0.", '\x2299') -- CIRCLED DOT OPERATOR
-    , ("02", '\x229A') -- CIRCLED RING OPERATOR
-    , ("-T", '\x22A5') -- UP TACK
-    , (".P", '\x22C5') -- DOT OPERATOR
-    , (":3", '\x22EE') -- VERTICAL ELLIPSIS
-    , (".3", '\x22EF') -- MIDLINE HORIZONTAL ELLIPSIS
-    , ("Eh", '\x2302') -- HOUSE
-    , ("<7", '\x2308') -- LEFT CEILING
-    , (">7", '\x2309') -- RIGHT CEILING
-    , ("7<", '\x230A') -- LEFT FLOOR
-    , ("7>", '\x230B') -- RIGHT FLOOR
-    , ("NI", '\x2310') -- REVERSED NOT SIGN
-    , ("(A", '\x2312') -- ARC
-    , ("TR", '\x2315') -- TELEPHONE RECORDER
-    , ("Iu", '\x2320') -- TOP HALF INTEGRAL
-    , ("Il", '\x2321') -- BOTTOM HALF INTEGRAL
-    , ("</", '\x2329') -- LEFT-POINTING ANGLE BRACKET
-    , ("/>", '\x232A') -- RIGHT-POINTING ANGLE BRACKET
-    , ("Vs", '\x2423') -- OPEN BOX
-    , ("1h", '\x2440') -- OCR HOOK
-    , ("3h", '\x2441') -- OCR CHAIR
-    , ("2h", '\x2442') -- OCR FORK
-    , ("4h", '\x2443') -- OCR INVERTED FORK
-    , ("1j", '\x2446') -- OCR BRANCH BANK IDENTIFICATION
-    , ("2j", '\x2447') -- OCR AMOUNT OF CHECK
-    , ("3j", '\x2448') -- OCR DASH
-    , ("4j", '\x2449') -- OCR CUSTOMER ACCOUNT NUMBER
-    , ("1.", '\x2488') -- DIGIT ONE FULL STOP
-    , ("2.", '\x2489') -- DIGIT TWO FULL STOP
-    , ("3.", '\x248A') -- DIGIT THREE FULL STOP
-    , ("4.", '\x248B') -- DIGIT FOUR FULL STOP
-    , ("5.", '\x248C') -- DIGIT FIVE FULL STOP
-    , ("6.", '\x248D') -- DIGIT SIX FULL STOP
-    , ("7.", '\x248E') -- DIGIT SEVEN FULL STOP
-    , ("8.", '\x248F') -- DIGIT EIGHT FULL STOP
-    , ("9.", '\x2490') -- DIGIT NINE FULL STOP
-    , ("hh", '\x2500') -- BOX DRAWINGS LIGHT HORIZONTAL
-    , ("HH", '\x2501') -- BOX DRAWINGS HEAVY HORIZONTAL
-    , ("vv", '\x2502') -- BOX DRAWINGS LIGHT VERTICAL
-    , ("VV", '\x2503') -- BOX DRAWINGS HEAVY VERTICAL
-    , ("3-", '\x2504') -- BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
-    , ("3_", '\x2505') -- BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
-    , ("3!", '\x2506') -- BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
-    , ("3/", '\x2507') -- BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
-    , ("4-", '\x2508') -- BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
-    , ("4_", '\x2509') -- BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
-    , ("4!", '\x250A') -- BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
-    , ("4/", '\x250B') -- BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
-    , ("dr", '\x250C') -- BOX DRAWINGS LIGHT DOWN AND RIGHT
-    , ("dR", '\x250D') -- BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
-    , ("Dr", '\x250E') -- BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
-    , ("DR", '\x250F') -- BOX DRAWINGS HEAVY DOWN AND RIGHT
-    , ("dl", '\x2510') -- BOX DRAWINGS LIGHT DOWN AND LEFT
-    , ("dL", '\x2511') -- BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
-    , ("Dl", '\x2512') -- BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
-    , ("LD", '\x2513') -- BOX DRAWINGS HEAVY DOWN AND LEFT
-    , ("ur", '\x2514') -- BOX DRAWINGS LIGHT UP AND RIGHT
-    , ("uR", '\x2515') -- BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
-    , ("Ur", '\x2516') -- BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
-    , ("UR", '\x2517') -- BOX DRAWINGS HEAVY UP AND RIGHT
-    , ("ul", '\x2518') -- BOX VOICED SOUND MARKDRAWINGS LIGHT UP AND LEFT
-    , ("uL", '\x2519') -- BOX DRAWINGS UP LIGHT AND LEFT HEAVY
-    , ("Ul", '\x251A') -- BOX DRAWINGS UP HEAVY AND LEFT LIGHT
-    , ("UL", '\x251B') -- BOX DRAWINGS HEAVY UP AND LEFT
-    , ("vr", '\x251C') -- BOX DRAWINGS LIGHT VERTICAL AND RIGHT
-    , ("vR", '\x251D') -- BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
-    , ("Vr", '\x2520') -- BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
-    , ("VR", '\x2523') -- BOX DRAWINGS HEAVY VERTICAL AND RIGHT
-    , ("vl", '\x2524') -- BOX DRAWINGS LIGHT VERTICAL AND LEFT
-    , ("vL", '\x2525') -- BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
-    , ("Vl", '\x2528') -- BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
-    , ("VL", '\x252B') -- BOX DRAWINGS HEAVY VERTICAL AND LEFT
-    , ("dh", '\x252C') -- BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
-    , ("dH", '\x252F') -- BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
-    , ("Dh", '\x2530') -- BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
-    , ("DH", '\x2533') -- BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
-    , ("uh", '\x2534') -- BOX DRAWINGS LIGHT UP AND HORIZONTAL
-    , ("uH", '\x2537') -- BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
-    , ("Uh", '\x2538') -- BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
-    , ("UH", '\x253B') -- BOX DRAWINGS HEAVY UP AND HORIZONTAL
-    , ("vh", '\x253C') -- BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
-    , ("vH", '\x253F') -- BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
-    , ("Vh", '\x2542') -- BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
-    , ("VH", '\x254B') -- BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
-    , ("FD", '\x2571') -- BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
-    , ("BD", '\x2572') -- BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
-    , ("TB", '\x2580') -- UPPER HALF BLOCK
-    , ("LB", '\x2584') -- LOWER HALF BLOCK
-    , ("FB", '\x2588') -- FULL BLOCK
-    , ("lB", '\x258C') -- LEFT HALF BLOCK
-    , ("RB", '\x2590') -- RIGHT HALF BLOCK
-    , (".S", '\x2591') -- LIGHT SHADE
-    , (":S", '\x2592') -- MEDIUM SHADE
-    , ("?S", '\x2593') -- DARK SHADE
-    , ("fS", '\x25A0') -- BLACK SQUARE
-    , ("OS", '\x25A1') -- WHITE SQUARE
-    , ("RO", '\x25A2') -- WHITE SQUARE WITH ROUNDED CORNERS
-    , ("Rr", '\x25A3') -- WHITE SQUARE CONTAINING BLACK SMALL SQUARE
-    , ("RF", '\x25A4') -- SQUARE WITH HORIZONTAL FILL
-    , ("RY", '\x25A5') -- SQUARE WITH VERTICAL FILL
-    , ("RH", '\x25A6') -- SQUARE WITH ORTHOGONAL CROSSHATCH FILL
-    , ("RZ", '\x25A7') -- SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
-    , ("RK", '\x25A8') -- SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
-    , ("RX", '\x25A9') -- SQUARE WITH DIAGONAL CROSSHATCH FILL
-    , ("sB", '\x25AA') -- BLACK SMALL SQUARE
-    , ("SR", '\x25AC') -- BLACK RECTANGLE
-    , ("Or", '\x25AD') -- WHITE RECTANGLE
-    , ("UT", '\x25B2') -- BLACK UP-POINTING TRIANGLE
-    , ("uT", '\x25B3') -- WHITE UP-POINTING TRIANGLE
-    , ("PR", '\x25B6') -- BLACK RIGHT-POINTING TRIANGLE
-    , ("Tr", '\x25B7') -- WHITE RIGHT-POINTING TRIANGLE
-    , ("Dt", '\x25BC') -- BLACK DOWN-POINTING TRIANGLE
-    , ("dT", '\x25BD') -- WHITE DOWN-POINTING TRIANGLE
-    , ("PL", '\x25C0') -- BLACK LEFT-POINTING TRIANGLE
-    , ("Tl", '\x25C1') -- WHITE LEFT-POINTING TRIANGLE
-    , ("Db", '\x25C6') -- BLACK DIAMOND
-    , ("Dw", '\x25C7') -- WHITE DIAMOND
-    , ("LZ", '\x25CA') -- LOZENGE
-    , ("0m", '\x25CB') -- WHITE CIRCLE
-    , ("0o", '\x25CE') -- BULLSEYE
-    , ("0M", '\x25CF') -- BLACK CIRCLE
-    , ("0L", '\x25D0') -- CIRCLE WITH LEFT HALF BLACK
-    , ("0R", '\x25D1') -- CIRCLE WITH RIGHT HALF BLACK
-    , ("Sn", '\x25D8') -- INVERSE BULLET
-    , ("Ic", '\x25D9') -- INVERSE WHITE CIRCLE
-    , ("Fd", '\x25E2') -- BLACK LOWER RIGHT TRIANGLE
-    , ("Bd", '\x25E3') -- BLACK LOWER LEFT TRIANGLE
-    , ("*2", '\x2605') -- BLACK STAR
-    , ("*1", '\x2606') -- WHITE STAR
-    , ("<H", '\x261C') -- WHITE LEFT POINTING INDEX
-    , (">H", '\x261E') -- WHITE RIGHT POINTING INDEX
-    , ("0u", '\x263A') -- WHITE SMILING FACE
-    , ("0U", '\x263B') -- BLACK SMILING FACE
-    , ("SU", '\x263C') -- WHITE SUN WITH RAYS
-    , ("Fm", '\x2640') -- FEMALE SIGN
-    , ("Ml", '\x2642') -- MALE SIGN
-    , ("cS", '\x2660') -- BLACK SPADE SUIT
-    , ("cH", '\x2661') -- WHITE HEART SUIT
-    , ("cD", '\x2662') -- WHITE DIAMOND SUIT
-    , ("cC", '\x2663') -- BLACK CLUB SUIT
-    , ("Md", '\x2669') -- QUARTER NOTE `
-    , ("M8", '\x266A') -- EIGHTH NOTE `
-    , ("M2", '\x266B') -- BEAMED EIGHTH NOTES
-    , ("Mb", '\x266D') -- MUSIC FLAT SIGN
-    , ("Mx", '\x266E') -- MUSIC NATURAL SIGN
-    , ("MX", '\x266F') -- MUSIC SHARP SIGN
-    , ("OK", '\x2713') -- CHECK MARK
-    , ("XX", '\x2717') -- BALLOT X
-    , ("-X", '\x2720') -- MALTESE CROSS
-    , ("IS", '\x3000') -- IDEOGRAPHIC SPACE
-    , (",_", '\x3001') -- IDEOGRAPHIC COMMA
-    , ("._", '\x3002') -- IDEOGRAPHIC FULL STOP
-    , ("+\"", '\x3003') -- DITTO MARK
-    , ("+_", '\x3004') -- JAPANESE INDUSTRIAL STANDARD SYMBOL
-    , ("*_", '\x3005') -- IDEOGRAPHIC ITERATION MARK
-    , (";_", '\x3006') -- IDEOGRAPHIC CLOSING MARK
-    , ("0_", '\x3007') -- IDEOGRAPHIC NUMBER ZERO
-    , ("<+", '\x300A') -- LEFT DOUBLE ANGLE BRACKET
-    , (">+", '\x300B') -- RIGHT DOUBLE ANGLE BRACKET
-    , ("<'", '\x300C') -- LEFT CORNER BRACKET
-    , (">'", '\x300D') -- RIGHT CORNER BRACKET
-    , ("<\"", '\x300E') -- LEFT WHITE CORNER BRACKET
-    , (">\"", '\x300F') -- RIGHT WHITE CORNER BRACKET
-    , ("(\"", '\x3010') -- LEFT BLACK LENTICULAR BRACKET
-    , (")\"", '\x3011') -- RIGHT BLACK LENTICULAR BRACKET
-    , ("=T", '\x3012') -- POSTAL MARK
-    , ("=_", '\x3013') -- GETA MARK
-    , ("('", '\x3014') -- LEFT TORTOISE SHELL BRACKET
-    , (")'", '\x3015') -- RIGHT TORTOISE SHELL BRACKET
-    , ("(I", '\x3016') -- LEFT WHITE LENTICULAR BRACKET
-    , (")I", '\x3017') -- RIGHT WHITE LENTICULAR BRACKET
-    , ("-?", '\x301C') -- WAVE DASH
-    , ("A5", '\x3041') -- HIRAGANA LETTER SMALL A
-    , ("a5", '\x3042') -- HIRAGANA LETTER A
-    , ("I5", '\x3043') -- HIRAGANA LETTER SMALL I
-    , ("i5", '\x3044') -- HIRAGANA LETTER I
-    , ("U5", '\x3045') -- HIRAGANA LETTER SMALL U
-    , ("u5", '\x3046') -- HIRAGANA LETTER U
-    , ("E5", '\x3047') -- HIRAGANA LETTER SMALL E
-    , ("e5", '\x3048') -- HIRAGANA LETTER E
-    , ("O5", '\x3049') -- HIRAGANA LETTER SMALL O
-    , ("o5", '\x304A') -- HIRAGANA LETTER O
-    , ("ka", '\x304B') -- HIRAGANA LETTER KA
-    , ("ga", '\x304C') -- HIRAGANA LETTER GA
-    , ("ki", '\x304D') -- HIRAGANA LETTER KI
-    , ("gi", '\x304E') -- HIRAGANA LETTER GI
-    , ("ku", '\x304F') -- HIRAGANA LETTER KU
-    , ("gu", '\x3050') -- HIRAGANA LETTER GU
-    , ("ke", '\x3051') -- HIRAGANA LETTER KE
-    , ("ge", '\x3052') -- HIRAGANA LETTER GE
-    , ("ko", '\x3053') -- HIRAGANA LETTER KO
-    , ("go", '\x3054') -- HIRAGANA LETTER GO
-    , ("sa", '\x3055') -- HIRAGANA LETTER SA
-    , ("za", '\x3056') -- HIRAGANA LETTER ZA
-    , ("si", '\x3057') -- HIRAGANA LETTER SI
-    , ("zi", '\x3058') -- HIRAGANA LETTER ZI
-    , ("su", '\x3059') -- HIRAGANA LETTER SU
-    , ("zu", '\x305A') -- HIRAGANA LETTER ZU
-    , ("se", '\x305B') -- HIRAGANA LETTER SE
-    , ("ze", '\x305C') -- HIRAGANA LETTER ZE
-    , ("so", '\x305D') -- HIRAGANA LETTER SO
-    , ("zo", '\x305E') -- HIRAGANA LETTER ZO
-    , ("ta", '\x305F') -- HIRAGANA LETTER TA
-    , ("da", '\x3060') -- HIRAGANA LETTER DA
-    , ("ti", '\x3061') -- HIRAGANA LETTER TI
-    , ("di", '\x3062') -- HIRAGANA LETTER DI
-    , ("tU", '\x3063') -- HIRAGANA LETTER SMALL TU
-    , ("tu", '\x3064') -- HIRAGANA LETTER TU
-    , ("du", '\x3065') -- HIRAGANA LETTER DU
-    , ("te", '\x3066') -- HIRAGANA LETTER TE
-    , ("de", '\x3067') -- HIRAGANA LETTER DE
-    , ("to", '\x3068') -- HIRAGANA LETTER TO
-    , ("do", '\x3069') -- HIRAGANA LETTER DO
-    , ("na", '\x306A') -- HIRAGANA LETTER NA
-    , ("ni", '\x306B') -- HIRAGANA LETTER NI
-    , ("nu", '\x306C') -- HIRAGANA LETTER NU
-    , ("ne", '\x306D') -- HIRAGANA LETTER NE
-    , ("no", '\x306E') -- HIRAGANA LETTER NO
-    , ("ha", '\x306F') -- HIRAGANA LETTER HA
-    , ("ba", '\x3070') -- HIRAGANA LETTER BA
-    , ("pa", '\x3071') -- HIRAGANA LETTER PA
-    , ("hi", '\x3072') -- HIRAGANA LETTER HI
-    , ("bi", '\x3073') -- HIRAGANA LETTER BI
-    , ("pi", '\x3074') -- HIRAGANA LETTER PI
-    , ("hu", '\x3075') -- HIRAGANA LETTER HU
-    , ("bu", '\x3076') -- HIRAGANA LETTER BU
-    , ("pu", '\x3077') -- HIRAGANA LETTER PU
-    , ("he", '\x3078') -- HIRAGANA LETTER HE
-    , ("be", '\x3079') -- HIRAGANA LETTER BE
-    , ("pe", '\x307A') -- HIRAGANA LETTER PE
-    , ("ho", '\x307B') -- HIRAGANA LETTER HO
-    , ("bo", '\x307C') -- HIRAGANA LETTER BO
-    , ("po", '\x307D') -- HIRAGANA LETTER PO
-    , ("ma", '\x307E') -- HIRAGANA LETTER MA
-    , ("mi", '\x307F') -- HIRAGANA LETTER MI
-    , ("mu", '\x3080') -- HIRAGANA LETTER MU
-    , ("me", '\x3081') -- HIRAGANA LETTER ME
-    , ("mo", '\x3082') -- HIRAGANA LETTER MO
-    , ("yA", '\x3083') -- HIRAGANA LETTER SMALL YA
-    , ("ya", '\x3084') -- HIRAGANA LETTER YA
-    , ("yU", '\x3085') -- HIRAGANA LETTER SMALL YU
-    , ("yu", '\x3086') -- HIRAGANA LETTER YU
-    , ("yO", '\x3087') -- HIRAGANA LETTER SMALL YO
-    , ("yo", '\x3088') -- HIRAGANA LETTER YO
-    , ("ra", '\x3089') -- HIRAGANA LETTER RA
-    , ("ri", '\x308A') -- HIRAGANA LETTER RI
-    , ("ru", '\x308B') -- HIRAGANA LETTER RU
-    , ("re", '\x308C') -- HIRAGANA LETTER RE
-    , ("ro", '\x308D') -- HIRAGANA LETTER RO
-    , ("wA", '\x308E') -- HIRAGANA LETTER SMALL WA
-    , ("wa", '\x308F') -- HIRAGANA LETTER WA
-    , ("wi", '\x3090') -- HIRAGANA LETTER WI
-    , ("we", '\x3091') -- HIRAGANA LETTER WE
-    , ("wo", '\x3092') -- HIRAGANA LETTER WO
-    , ("n5", '\x3093') -- HIRAGANA LETTER N `
-    , ("vu", '\x3094') -- HIRAGANA LETTER VU
-    , ("\"5", '\x309B') -- KATAKANA-HIRAGANA VOICED SOUND MARK
-    , ("05", '\x309C') -- KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
-    , ("*5", '\x309D') -- HIRAGANA ITERATION MARK
-    , ("+5", '\x309E') -- HIRAGANA VOICED ITERATION MARK
-    , ("a6", '\x30A1') -- KATAKANA LETTER SMALL A
-    , ("A6", '\x30A2') -- KATAKANA LETTER A
-    , ("i6", '\x30A3') -- KATAKANA LETTER SMALL I
-    , ("I6", '\x30A4') -- KATAKANA LETTER I
-    , ("u6", '\x30A5') -- KATAKANA LETTER SMALL U
-    , ("U6", '\x30A6') -- KATAKANA LETTER U
-    , ("e6", '\x30A7') -- KATAKANA LETTER SMALL E
-    , ("E6", '\x30A8') -- KATAKANA LETTER E
-    , ("o6", '\x30A9') -- KATAKANA LETTER SMALL O
-    , ("O6", '\x30AA') -- KATAKANA LETTER O
-    , ("Ka", '\x30AB') -- KATAKANA LETTER KA
-    , ("Ga", '\x30AC') -- KATAKANA LETTER GA
-    , ("Ki", '\x30AD') -- KATAKANA LETTER KI
-    , ("Gi", '\x30AE') -- KATAKANA LETTER GI
-    , ("Ku", '\x30AF') -- KATAKANA LETTER KU
-    , ("Gu", '\x30B0') -- KATAKANA LETTER GU
-    , ("Ke", '\x30B1') -- KATAKANA LETTER KE
-    , ("Ge", '\x30B2') -- KATAKANA LETTER GE
-    , ("Ko", '\x30B3') -- KATAKANA LETTER KO
-    , ("Go", '\x30B4') -- KATAKANA LETTER GO
-    , ("Sa", '\x30B5') -- KATAKANA LETTER SA
-    , ("Za", '\x30B6') -- KATAKANA LETTER ZA
-    , ("Si", '\x30B7') -- KATAKANA LETTER SI
-    , ("Zi", '\x30B8') -- KATAKANA LETTER ZI
-    , ("Su", '\x30B9') -- KATAKANA LETTER SU
-    , ("Zu", '\x30BA') -- KATAKANA LETTER ZU
-    , ("Se", '\x30BB') -- KATAKANA LETTER SE
-    , ("Ze", '\x30BC') -- KATAKANA LETTER ZE
-    , ("So", '\x30BD') -- KATAKANA LETTER SO
-    , ("Zo", '\x30BE') -- KATAKANA LETTER ZO
-    , ("Ta", '\x30BF') -- KATAKANA LETTER TA
-    , ("Da", '\x30C0') -- KATAKANA LETTER DA
-    , ("Ti", '\x30C1') -- KATAKANA LETTER TI
-    , ("Di", '\x30C2') -- KATAKANA LETTER DI
-    , ("TU", '\x30C3') -- KATAKANA LETTER SMALL TU
-    , ("Tu", '\x30C4') -- KATAKANA LETTER TU
-    , ("Du", '\x30C5') -- KATAKANA LETTER DU
-    , ("Te", '\x30C6') -- KATAKANA LETTER TE
-    , ("De", '\x30C7') -- KATAKANA LETTER DE
-    , ("To", '\x30C8') -- KATAKANA LETTER TO
-    , ("Do", '\x30C9') -- KATAKANA LETTER DO
-    , ("Na", '\x30CA') -- KATAKANA LETTER NA
-    , ("Ni", '\x30CB') -- KATAKANA LETTER NI
-    , ("Nu", '\x30CC') -- KATAKANA LETTER NU
-    , ("Ne", '\x30CD') -- KATAKANA LETTER NE
-    , ("No", '\x30CE') -- KATAKANA LETTER NO
-    , ("Ha", '\x30CF') -- KATAKANA LETTER HA
-    , ("Ba", '\x30D0') -- KATAKANA LETTER BA
-    , ("Pa", '\x30D1') -- KATAKANA LETTER PA
-    , ("Hi", '\x30D2') -- KATAKANA LETTER HI
-    , ("Bi", '\x30D3') -- KATAKANA LETTER BI
-    , ("Pi", '\x30D4') -- KATAKANA LETTER PI
-    , ("Hu", '\x30D5') -- KATAKANA LETTER HU
-    , ("Bu", '\x30D6') -- KATAKANA LETTER BU
-    , ("Pu", '\x30D7') -- KATAKANA LETTER PU
-    , ("He", '\x30D8') -- KATAKANA LETTER HE
-    , ("Be", '\x30D9') -- KATAKANA LETTER BE
-    , ("Pe", '\x30DA') -- KATAKANA LETTER PE
-    , ("Ho", '\x30DB') -- KATAKANA LETTER HO
-    , ("Bo", '\x30DC') -- KATAKANA LETTER BO
-    , ("Po", '\x30DD') -- KATAKANA LETTER PO
-    , ("Ma", '\x30DE') -- KATAKANA LETTER MA
-    , ("Mi", '\x30DF') -- KATAKANA LETTER MI
-    , ("Mu", '\x30E0') -- KATAKANA LETTER MU
-    , ("Me", '\x30E1') -- KATAKANA LETTER ME
-    , ("Mo", '\x30E2') -- KATAKANA LETTER MO
-    , ("YA", '\x30E3') -- KATAKANA LETTER SMALL YA
-    , ("Ya", '\x30E4') -- KATAKANA LETTER YA
-    , ("YU", '\x30E5') -- KATAKANA LETTER SMALL YU
-    , ("Yu", '\x30E6') -- KATAKANA LETTER YU
-    , ("YO", '\x30E7') -- KATAKANA LETTER SMALL YO
-    , ("Yo", '\x30E8') -- KATAKANA LETTER YO
-    , ("Ra", '\x30E9') -- KATAKANA LETTER RA
-    , ("Ri", '\x30EA') -- KATAKANA LETTER RI
-    , ("Ru", '\x30EB') -- KATAKANA LETTER RU
-    , ("Re", '\x30EC') -- KATAKANA LETTER RE
-    , ("Ro", '\x30ED') -- KATAKANA LETTER RO
-    , ("WA", '\x30EE') -- KATAKANA LETTER SMALL WA
-    , ("Wa", '\x30EF') -- KATAKANA LETTER WA
-    , ("Wi", '\x30F0') -- KATAKANA LETTER WI
-    , ("We", '\x30F1') -- KATAKANA LETTER WE
-    , ("Wo", '\x30F2') -- KATAKANA LETTER WO
-    , ("N6", '\x30F3') -- KATAKANA LETTER N `
-    , ("Vu", '\x30F4') -- KATAKANA LETTER VU
-    , ("KA", '\x30F5') -- KATAKANA LETTER SMALL KA
-    , ("KE", '\x30F6') -- KATAKANA LETTER SMALL KE
-    , ("Va", '\x30F7') -- KATAKANA LETTER VA
-    , ("Vi", '\x30F8') -- KATAKANA LETTER VI
-    , ("Ve", '\x30F9') -- KATAKANA LETTER VE
-    , ("Vo", '\x30FA') -- KATAKANA LETTER VO
-    , (".6", '\x30FB') -- KATAKANA MIDDLE DOT
-    , ("-6", '\x30FC') -- KATAKANA-HIRAGANA PROLONGED SOUND MARK
-    , ("*6", '\x30FD') -- KATAKANA ITERATION MARK
-    , ("+6", '\x30FE') -- KATAKANA VOICED ITERATION MARK
-    , ("b4", '\x3105') -- BOPOMOFO LETTER B
-    , ("p4", '\x3106') -- BOPOMOFO LETTER P
-    , ("m4", '\x3107') -- BOPOMOFO LETTER M
-    , ("f4", '\x3108') -- BOPOMOFO LETTER F
-    , ("d4", '\x3109') -- BOPOMOFO LETTER D
-    , ("t4", '\x310A') -- BOPOMOFO LETTER T
-    , ("n4", '\x310B') -- BOPOMOFO LETTER N `
-    , ("l4", '\x310C') -- BOPOMOFO LETTER L
-    , ("g4", '\x310D') -- BOPOMOFO LETTER G
-    , ("k4", '\x310E') -- BOPOMOFO LETTER K
-    , ("h4", '\x310F') -- BOPOMOFO LETTER H
-    , ("j4", '\x3110') -- BOPOMOFO LETTER J
-    , ("q4", '\x3111') -- BOPOMOFO LETTER Q
-    , ("x4", '\x3112') -- BOPOMOFO LETTER X
-    , ("zh", '\x3113') -- BOPOMOFO LETTER ZH
-    , ("ch", '\x3114') -- BOPOMOFO LETTER CH
-    , ("sh", '\x3115') -- BOPOMOFO LETTER SH
-    , ("r4", '\x3116') -- BOPOMOFO LETTER R
-    , ("z4", '\x3117') -- BOPOMOFO LETTER Z
-    , ("c4", '\x3118') -- BOPOMOFO LETTER C
-    , ("s4", '\x3119') -- BOPOMOFO LETTER S
-    , ("a4", '\x311A') -- BOPOMOFO LETTER A
-    , ("o4", '\x311B') -- BOPOMOFO LETTER O
-    , ("e4", '\x311C') -- BOPOMOFO LETTER E
-    , ("ai", '\x311E') -- BOPOMOFO LETTER AI
-    , ("ei", '\x311F') -- BOPOMOFO LETTER EI
-    , ("au", '\x3120') -- BOPOMOFO LETTER AU
-    , ("ou", '\x3121') -- BOPOMOFO LETTER OU
-    , ("an", '\x3122') -- BOPOMOFO LETTER AN
-    , ("en", '\x3123') -- BOPOMOFO LETTER EN
-    , ("aN", '\x3124') -- BOPOMOFO LETTER ANG
-    , ("eN", '\x3125') -- BOPOMOFO LETTER ENG
-    , ("er", '\x3126') -- BOPOMOFO LETTER ER
-    , ("i4", '\x3127') -- BOPOMOFO LETTER I
-    , ("u4", '\x3128') -- BOPOMOFO LETTER U
-    , ("iu", '\x3129') -- BOPOMOFO LETTER IU
-    , ("v4", '\x312A') -- BOPOMOFO LETTER V
-    , ("nG", '\x312B') -- BOPOMOFO LETTER NG
-    , ("gn", '\x312C') -- BOPOMOFO LETTER GN
-    , ("1c", '\x3220') -- PARENTHESIZED IDEOGRAPH ONE
-    , ("2c", '\x3221') -- PARENTHESIZED IDEOGRAPH TWO
-    , ("3c", '\x3222') -- PARENTHESIZED IDEOGRAPH THREE
-    , ("4c", '\x3223') -- PARENTHESIZED IDEOGRAPH FOUR
-    , ("5c", '\x3224') -- PARENTHESIZED IDEOGRAPH FIVE
-    , ("6c", '\x3225') -- PARENTHESIZED IDEOGRAPH SIX
-    , ("7c", '\x3226') -- PARENTHESIZED IDEOGRAPH SEVEN
-    , ("8c", '\x3227') -- PARENTHESIZED IDEOGRAPH EIGHT
-    , ("9c", '\x3228') -- PARENTHESIZED IDEOGRAPH NINE
-    , ("ff", '\xFB00') -- LATIN SMALL LIGATURE FF
-    , ("fi", '\xFB01') -- LATIN SMALL LIGATURE FI
-    , ("fl", '\xFB02') -- LATIN SMALL LIGATURE FL
-    , ("ft", '\xFB05') -- LATIN SMALL LIGATURE LONG S T
-    , ("st", '\xFB06') -- LATIN SMALL LIGATURE ST
-    ]
+{-# OPTIONS_GHC -O2 #-}
+{-# LANGUAGE BangPatterns #-}
+
+module Yi.Keymap.Vim.Digraph
+    ( charFromDigraph
+    , defDigraphs
+    , DigraphTbl
+    ) where
+
+import Control.Applicative (Alternative ((<|>)))
+
+newtype DigraphTbl = DigraphTbl (Char -> Char -> Maybe Char)
+
+charFromDigraph :: DigraphTbl -> Char -> Char -> Maybe Char
+charFromDigraph (DigraphTbl tbl) x y = tbl x y <|> tbl y x
+
+defDigraphs :: DigraphTbl
+defDigraphs = DigraphTbl lookupDigraph
+
+lookupDigraph :: Char -> Char -> Maybe Char
+lookupDigraph !x !y =
+  case switch x y of
+    '\xFFFF' -> Nothing
+    c        -> Just c
+
+switch :: Char -> Char -> Char
+switch 'N' 'U' = '\x0000' -- NULL (NUL)
+switch 'S' 'H' = '\x0001' -- START OF HEADING (SOH)
+switch 'S' 'X' = '\x0002' -- START OF TEXT (STX)
+switch 'E' 'X' = '\x0003' -- END OF TEXT (ETX)
+switch 'E' 'T' = '\x0004' -- END OF TRANSMISSION (EOT)
+switch 'E' 'Q' = '\x0005' -- ENQUIRY (ENQ)
+switch 'A' 'K' = '\x0006' -- ACKNOWLEDGE (ACK)
+switch 'B' 'L' = '\x0007' -- BELL (BEL)
+switch 'B' 'S' = '\x0008' -- BACKSPACE (BS)
+switch 'H' 'T' = '\x0009' -- CHARACTER TABULATION (HT)
+switch 'L' 'F' = '\x000A' -- LINE FEED (LF)
+switch 'V' 'T' = '\x000B' -- LINE TABULATION (VT)
+switch 'F' 'F' = '\x000C' -- FORM FEED (FF)
+switch 'C' 'R' = '\x000D' -- CARRIAGE RETURN (CR)
+switch 'S' 'O' = '\x000E' -- SHIFT OUT (SO)
+switch 'S' 'I' = '\x000F' -- SHIFT IN (SI)
+switch 'D' 'L' = '\x0010' -- DATALINK ESCAPE (DLE)
+switch 'D' '1' = '\x0011' -- DEVICE CONTROL ONE (DC1)
+switch 'D' '2' = '\x0012' -- DEVICE CONTROL TWO (DC2)
+switch 'D' '3' = '\x0013' -- DEVICE CONTROL THREE (DC3)
+switch 'D' '4' = '\x0014' -- DEVICE CONTROL FOUR (DC4)
+switch 'N' 'K' = '\x0015' -- NEGATIVE ACKNOWLEDGE (NAK)
+switch 'S' 'Y' = '\x0016' -- SYNCHRONOUS IDLE (SYN)
+switch 'E' 'B' = '\x0017' -- END OF TRANSMISSION BLOCK (ETB)
+switch 'C' 'N' = '\x0018' -- CANCEL (CAN)
+switch 'E' 'M' = '\x0019' -- END OF MEDIUM (EM)
+switch 'S' 'B' = '\x001A' -- SUBSTITUTE (SUB)
+switch 'E' 'C' = '\x001B' -- ESCAPE (ESC)
+switch 'F' 'S' = '\x001C' -- FILE SEPARATOR (IS4)
+switch 'G' 'S' = '\x001D' -- GROUP SEPARATOR (IS3)
+switch 'R' 'S' = '\x001E' -- RECORD SEPARATOR (IS2)
+switch 'U' 'S' = '\x001F' -- UNIT SEPARATOR (IS1)
+switch 'S' 'P' = '\x0020' -- SPACE
+switch 'N' 'b' = '\x0023' -- NUMBER SIGN
+switch 'D' 'O' = '\x0024' -- DOLLAR SIGN
+switch 'A' 't' = '\x0040' -- COMMERCIAL AT
+switch '<' '(' = '\x005B' -- LEFT SQUARE BRACKET
+switch '/' '/' = '\x005C' -- REVERSE SOLIDUS
+switch ')' '>' = '\x005D' -- RIGHT SQUARE BRACKET
+switch '\'' '>' = '\x005E' -- CIRCUMFLEX ACCENT
+switch '\'' '!' = '\x0060' -- GRAVE ACCENT
+switch '(' '!' = '\x007B' -- LEFT CURLY BRACKET
+switch '!' '!' = '\x007C' -- VERTICAL LINE
+switch '!' ')' = '\x007D' -- RIGHT CURLY BRACKET
+switch '\'' '?' = '\x007E' -- TILDE
+switch 'D' 'T' = '\x007F' -- DELETE (DEL)
+switch 'P' 'A' = '\x0080' -- PADDING CHARACTER (PAD)
+switch 'H' 'O' = '\x0081' -- HIGH OCTET PRESET (HOP)
+switch 'B' 'H' = '\x0082' -- BREAK PERMITTED HERE (BPH)
+switch 'N' 'H' = '\x0083' -- NO BREAK HERE (NBH)
+switch 'I' 'N' = '\x0084' -- INDEX (IND)
+switch 'N' 'L' = '\x0085' -- NEXT LINE (NEL)
+switch 'S' 'A' = '\x0086' -- START OF SELECTED AREA (SSA)
+switch 'E' 'S' = '\x0087' -- END OF SELECTED AREA (ESA)
+switch 'H' 'S' = '\x0088' -- CHARACTER TABULATION SET (HTS)
+switch 'H' 'J' = '\x0089' -- CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
+switch 'V' 'S' = '\x008A' -- LINE TABULATION SET (VTS)
+switch 'P' 'D' = '\x008B' -- PARTIAL LINE FORWARD (PLD)
+switch 'P' 'U' = '\x008C' -- PARTIAL LINE BACKWARD (PLU)
+switch 'R' 'I' = '\x008D' -- REVERSE LINE FEED (RI)
+switch 'S' '2' = '\x008E' -- SINGLE-SHIFT TWO (SS2)
+switch 'S' '3' = '\x008F' -- SINGLE-SHIFT THREE (SS3)
+switch 'D' 'C' = '\x0090' -- DEVICE CONTROL STRING (DCS)
+switch 'P' '1' = '\x0091' -- PRIVATE USE ONE (PU1)
+switch 'P' '2' = '\x0092' -- PRIVATE USE TWO (PU2)
+switch 'T' 'S' = '\x0093' -- SET TRANSMIT STATE (STS)
+switch 'C' 'C' = '\x0094' -- CANCEL CHARACTER (CCH)
+switch 'M' 'W' = '\x0095' -- MESSAGE WAITING (MW)
+switch 'S' 'G' = '\x0096' -- START OF GUARDED AREA (SPA)
+switch 'E' 'G' = '\x0097' -- END OF GUARDED AREA (EPA)
+switch 'S' 'S' = '\x0098' -- START OF STRING (SOS)
+switch 'G' 'C' = '\x0099' -- SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
+switch 'S' 'C' = '\x009A' -- SINGLE CHARACTER INTRODUCER (SCI)
+switch 'C' 'I' = '\x009B' -- CONTROL SEQUENCE INTRODUCER (CSI)
+switch 'S' 'T' = '\x009C' -- STRING TERMINATOR (ST)
+switch 'O' 'C' = '\x009D' -- OPERATING SYSTEM COMMAND (OSC)
+switch 'P' 'M' = '\x009E' -- PRIVACY MESSAGE (PM)
+switch 'A' 'C' = '\x009F' -- APPLICATION PROGRAM COMMAND (APC)
+switch 'N' 'S' = '\x00A0' -- NO-BREAK SPACE
+switch '!' 'I' = '\x00A1' -- INVERTED EXCLAMATION MARK
+switch 'C' 't' = '\x00A2' -- CENT SIGN
+switch 'P' 'd' = '\x00A3' -- POUND SIGN
+switch 'C' 'u' = '\x00A4' -- CURRENCY SIGN
+switch 'Y' 'e' = '\x00A5' -- YEN SIGN
+switch 'B' 'B' = '\x00A6' -- BROKEN BAR
+switch 'S' 'E' = '\x00A7' -- SECTION SIGN
+switch '\'' ':' = '\x00A8' -- DIAERESIS
+switch 'C' 'o' = '\x00A9' -- COPYRIGHT SIGN
+switch '-' 'a' = '\x00AA' -- FEMININE ORDINAL INDICATOR
+switch '<' '<' = '\x00AB' -- LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+switch 'N' 'O' = '\x00AC' -- NOT SIGN
+switch '-' '-' = '\x00AD' -- SOFT HYPHEN
+switch 'R' 'g' = '\x00AE' -- REGISTERED SIGN
+switch '\'' 'm' = '\x00AF' -- MACRON
+switch 'D' 'G' = '\x00B0' -- DEGREE SIGN
+switch '+' '-' = '\x00B1' -- PLUS-MINUS SIGN
+switch '2' 'S' = '\x00B2' -- SUPERSCRIPT TWO
+switch '3' 'S' = '\x00B3' -- SUPERSCRIPT THREE
+switch '\'' '\'' = '\x00B4' -- ACUTE ACCENT
+switch 'M' 'y' = '\x00B5' -- MICRO SIGN
+switch 'P' 'I' = '\x00B6' -- PILCROW SIGN
+switch '.' 'M' = '\x00B7' -- MIDDLE DOT
+switch '\'' ',' = '\x00B8' -- CEDILLA
+switch '1' 'S' = '\x00B9' -- SUPERSCRIPT ONE
+switch '-' 'o' = '\x00BA' -- MASCULINE ORDINAL INDICATOR
+switch '>' '>' = '\x00BB' -- RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+switch '1' '4' = '\x00BC' -- VULGAR FRACTION ONE QUARTER
+switch '1' '2' = '\x00BD' -- VULGAR FRACTION ONE HALF
+switch '3' '4' = '\x00BE' -- VULGAR FRACTION THREE QUARTERS
+switch '?' 'I' = '\x00BF' -- INVERTED QUESTION MARK
+switch 'A' '!' = '\x00C0' -- LATIN CAPITAL LETTER A WITH GRAVE
+switch 'A' '\'' = '\x00C1' -- LATIN CAPITAL LETTER A WITH ACUTE
+switch 'A' '>' = '\x00C2' -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+switch 'A' '?' = '\x00C3' -- LATIN CAPITAL LETTER A WITH TILDE
+switch 'A' ':' = '\x00C4' -- LATIN CAPITAL LETTER A WITH DIAERESIS
+switch 'A' 'A' = '\x00C5' -- LATIN CAPITAL LETTER A WITH RING ABOVE
+switch 'A' 'E' = '\x00C6' -- LATIN CAPITAL LETTER AE
+switch 'C' ',' = '\x00C7' -- LATIN CAPITAL LETTER C WITH CEDILLA
+switch 'E' '!' = '\x00C8' -- LATIN CAPITAL LETTER E WITH GRAVE
+switch 'E' '\'' = '\x00C9' -- LATIN CAPITAL LETTER E WITH ACUTE
+switch 'E' '>' = '\x00CA' -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+switch 'E' ':' = '\x00CB' -- LATIN CAPITAL LETTER E WITH DIAERESIS
+switch 'I' '!' = '\x00CC' -- LATIN CAPITAL LETTER I WITH GRAVE
+switch 'I' '\'' = '\x00CD' -- LATIN CAPITAL LETTER I WITH ACUTE
+switch 'I' '>' = '\x00CE' -- LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+switch 'I' ':' = '\x00CF' -- LATIN CAPITAL LETTER I WITH DIAERESIS
+switch 'D' '-' = '\x00D0' -- LATIN CAPITAL LETTER ETH (Icelandic)
+switch 'N' '?' = '\x00D1' -- LATIN CAPITAL LETTER N WITH TILDE
+switch 'O' '!' = '\x00D2' -- LATIN CAPITAL LETTER O WITH GRAVE
+switch 'O' '\'' = '\x00D3' -- LATIN CAPITAL LETTER O WITH ACUTE
+switch 'O' '>' = '\x00D4' -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+switch 'O' '?' = '\x00D5' -- LATIN CAPITAL LETTER O WITH TILDE
+switch 'O' ':' = '\x00D6' -- LATIN CAPITAL LETTER O WITH DIAERESIS
+switch '*' 'X' = '\x00D7' -- MULTIPLICATION SIGN
+switch 'O' '/' = '\x00D8' -- LATIN CAPITAL LETTER O WITH STROKE
+switch 'U' '!' = '\x00D9' -- LATIN CAPITAL LETTER U WITH GRAVE
+switch 'U' '\'' = '\x00DA' -- LATIN CAPITAL LETTER U WITH ACUTE
+switch 'U' '>' = '\x00DB' -- LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+switch 'U' ':' = '\x00DC' -- LATIN CAPITAL LETTER U WITH DIAERESIS
+switch 'Y' '\'' = '\x00DD' -- LATIN CAPITAL LETTER Y WITH ACUTE
+switch 'T' 'H' = '\x00DE' -- LATIN CAPITAL LETTER THORN (Icelandic)
+switch 's' 's' = '\x00DF' -- LATIN SMALL LETTER SHARP S (German)
+switch 'a' '!' = '\x00E0' -- LATIN SMALL LETTER A WITH GRAVE
+switch 'a' '\'' = '\x00E1' -- LATIN SMALL LETTER A WITH ACUTE
+switch 'a' '>' = '\x00E2' -- LATIN SMALL LETTER A WITH CIRCUMFLEX
+switch 'a' '?' = '\x00E3' -- LATIN SMALL LETTER A WITH TILDE
+switch 'a' ':' = '\x00E4' -- LATIN SMALL LETTER A WITH DIAERESIS
+switch 'a' 'a' = '\x00E5' -- LATIN SMALL LETTER A WITH RING ABOVE
+switch 'a' 'e' = '\x00E6' -- LATIN SMALL LETTER AE
+switch 'c' ',' = '\x00E7' -- LATIN SMALL LETTER C WITH CEDILLA
+switch 'e' '!' = '\x00E8' -- LATIN SMALL LETTER E WITH GRAVE
+switch 'e' '\'' = '\x00E9' -- LATIN SMALL LETTER E WITH ACUTE
+switch 'e' '>' = '\x00EA' -- LATIN SMALL LETTER E WITH CIRCUMFLEX
+switch 'e' ':' = '\x00EB' -- LATIN SMALL LETTER E WITH DIAERESIS
+switch 'i' '!' = '\x00EC' -- LATIN SMALL LETTER I WITH GRAVE
+switch 'i' '\'' = '\x00ED' -- LATIN SMALL LETTER I WITH ACUTE
+switch 'i' '>' = '\x00EE' -- LATIN SMALL LETTER I WITH CIRCUMFLEX
+switch 'i' ':' = '\x00EF' -- LATIN SMALL LETTER I WITH DIAERESIS
+switch 'd' '-' = '\x00F0' -- LATIN SMALL LETTER ETH (Icelandic)
+switch 'n' '?' = '\x00F1' -- LATIN SMALL LETTER N WITH TILDE
+switch 'o' '!' = '\x00F2' -- LATIN SMALL LETTER O WITH GRAVE
+switch 'o' '\'' = '\x00F3' -- LATIN SMALL LETTER O WITH ACUTE
+switch 'o' '>' = '\x00F4' -- LATIN SMALL LETTER O WITH CIRCUMFLEX
+switch 'o' '?' = '\x00F5' -- LATIN SMALL LETTER O WITH TILDE
+switch 'o' ':' = '\x00F6' -- LATIN SMALL LETTER O WITH DIAERESIS
+switch '-' ':' = '\x00F7' -- DIVISION SIGN
+switch 'o' '/' = '\x00F8' -- LATIN SMALL LETTER O WITH STROKE
+switch 'u' '!' = '\x00F9' -- LATIN SMALL LETTER U WITH GRAVE
+switch 'u' '\'' = '\x00FA' -- LATIN SMALL LETTER U WITH ACUTE
+switch 'u' '>' = '\x00FB' -- LATIN SMALL LETTER U WITH CIRCUMFLEX
+switch 'u' ':' = '\x00FC' -- LATIN SMALL LETTER U WITH DIAERESIS
+switch 'y' '\'' = '\x00FD' -- LATIN SMALL LETTER Y WITH ACUTE
+switch 't' 'h' = '\x00FE' -- LATIN SMALL LETTER THORN (Icelandic)
+switch 'y' ':' = '\x00FF' -- LATIN SMALL LETTER Y WITH DIAERESIS
+switch 'A' '-' = '\x0100' -- LATIN CAPITAL LETTER A WITH MACRON
+switch 'a' '-' = '\x0101' -- LATIN SMALL LETTER A WITH MACRON
+switch 'A' '(' = '\x0102' -- LATIN CAPITAL LETTER A WITH BREVE
+switch 'a' '(' = '\x0103' -- LATIN SMALL LETTER A WITH BREVE
+switch 'A' ';' = '\x0104' -- LATIN CAPITAL LETTER A WITH OGONEK
+switch 'a' ';' = '\x0105' -- LATIN SMALL LETTER A WITH OGONEK
+switch 'C' '\'' = '\x0106' -- LATIN CAPITAL LETTER C WITH ACUTE
+switch 'c' '\'' = '\x0107' -- LATIN SMALL LETTER C WITH ACUTE
+switch 'C' '>' = '\x0108' -- LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+switch 'c' '>' = '\x0109' -- LATIN SMALL LETTER C WITH CIRCUMFLEX
+switch 'C' '.' = '\x010A' -- LATIN CAPITAL LETTER C WITH DOT ABOVE
+switch 'c' '.' = '\x010B' -- LATIN SMALL LETTER C WITH DOT ABOVE
+switch 'C' '<' = '\x010C' -- LATIN CAPITAL LETTER C WITH CARON
+switch 'c' '<' = '\x010D' -- LATIN SMALL LETTER C WITH CARON
+switch 'D' '<' = '\x010E' -- LATIN CAPITAL LETTER D WITH CARON
+switch 'd' '<' = '\x010F' -- LATIN SMALL LETTER D WITH CARON
+switch 'D' '/' = '\x0110' -- LATIN CAPITAL LETTER D WITH STROKE
+switch 'd' '/' = '\x0111' -- LATIN SMALL LETTER D WITH STROKE
+switch 'E' '-' = '\x0112' -- LATIN CAPITAL LETTER E WITH MACRON
+switch 'e' '-' = '\x0113' -- LATIN SMALL LETTER E WITH MACRON
+switch 'E' '(' = '\x0114' -- LATIN CAPITAL LETTER E WITH BREVE
+switch 'e' '(' = '\x0115' -- LATIN SMALL LETTER E WITH BREVE
+switch 'E' '.' = '\x0116' -- LATIN CAPITAL LETTER E WITH DOT ABOVE
+switch 'e' '.' = '\x0117' -- LATIN SMALL LETTER E WITH DOT ABOVE
+switch 'E' ';' = '\x0118' -- LATIN CAPITAL LETTER E WITH OGONEK
+switch 'e' ';' = '\x0119' -- LATIN SMALL LETTER E WITH OGONEK
+switch 'E' '<' = '\x011A' -- LATIN CAPITAL LETTER E WITH CARON
+switch 'e' '<' = '\x011B' -- LATIN SMALL LETTER E WITH CARON
+switch 'G' '>' = '\x011C' -- LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+switch 'g' '>' = '\x011D' -- LATIN SMALL LETTER G WITH CIRCUMFLEX
+switch 'G' '(' = '\x011E' -- LATIN CAPITAL LETTER G WITH BREVE
+switch 'g' '(' = '\x011F' -- LATIN SMALL LETTER G WITH BREVE
+switch 'G' '.' = '\x0120' -- LATIN CAPITAL LETTER G WITH DOT ABOVE
+switch 'g' '.' = '\x0121' -- LATIN SMALL LETTER G WITH DOT ABOVE
+switch 'G' ',' = '\x0122' -- LATIN CAPITAL LETTER G WITH CEDILLA
+switch 'g' ',' = '\x0123' -- LATIN SMALL LETTER G WITH CEDILLA
+switch 'H' '>' = '\x0124' -- LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+switch 'h' '>' = '\x0125' -- LATIN SMALL LETTER H WITH CIRCUMFLEX
+switch 'H' '/' = '\x0126' -- LATIN CAPITAL LETTER H WITH STROKE
+switch 'h' '/' = '\x0127' -- LATIN SMALL LETTER H WITH STROKE
+switch 'I' '?' = '\x0128' -- LATIN CAPITAL LETTER I WITH TILDE
+switch 'i' '?' = '\x0129' -- LATIN SMALL LETTER I WITH TILDE
+switch 'I' '-' = '\x012A' -- LATIN CAPITAL LETTER I WITH MACRON
+switch 'i' '-' = '\x012B' -- LATIN SMALL LETTER I WITH MACRON
+switch 'I' '(' = '\x012C' -- LATIN CAPITAL LETTER I WITH BREVE
+switch 'i' '(' = '\x012D' -- LATIN SMALL LETTER I WITH BREVE
+switch 'I' ';' = '\x012E' -- LATIN CAPITAL LETTER I WITH OGONEK
+switch 'i' ';' = '\x012F' -- LATIN SMALL LETTER I WITH OGONEK
+switch 'I' '.' = '\x0130' -- LATIN CAPITAL LETTER I WITH DOT ABOVE
+switch 'i' '.' = '\x0131' -- LATIN SMALL LETTER DOTLESS I
+switch 'I' 'J' = '\x0132' -- LATIN CAPITAL LIGATURE IJ
+switch 'i' 'j' = '\x0133' -- LATIN SMALL LIGATURE IJ
+switch 'J' '>' = '\x0134' -- LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+switch 'j' '>' = '\x0135' -- LATIN SMALL LETTER J WITH CIRCUMFLEX
+switch 'K' ',' = '\x0136' -- LATIN CAPITAL LETTER K WITH CEDILLA
+switch 'k' ',' = '\x0137' -- LATIN SMALL LETTER K WITH CEDILLA
+switch 'k' 'k' = '\x0138' -- LATIN SMALL LETTER KRA
+switch 'L' '\'' = '\x0139' -- LATIN CAPITAL LETTER L WITH ACUTE
+switch 'l' '\'' = '\x013A' -- LATIN SMALL LETTER L WITH ACUTE
+switch 'L' ',' = '\x013B' -- LATIN CAPITAL LETTER L WITH CEDILLA
+switch 'l' ',' = '\x013C' -- LATIN SMALL LETTER L WITH CEDILLA
+switch 'L' '<' = '\x013D' -- LATIN CAPITAL LETTER L WITH CARON
+switch 'l' '<' = '\x013E' -- LATIN SMALL LETTER L WITH CARON
+switch 'L' '.' = '\x013F' -- LATIN CAPITAL LETTER L WITH MIDDLE DOT
+switch 'l' '.' = '\x0140' -- LATIN SMALL LETTER L WITH MIDDLE DOT
+switch 'L' '/' = '\x0141' -- LATIN CAPITAL LETTER L WITH STROKE
+switch 'l' '/' = '\x0142' -- LATIN SMALL LETTER L WITH STROKE
+switch 'N' '\'' = '\x0143' -- LATIN CAPITAL LETTER N WITH ACUTE `
+switch 'n' '\'' = '\x0144' -- LATIN SMALL LETTER N WITH ACUTE `
+switch 'N' ',' = '\x0145' -- LATIN CAPITAL LETTER N WITH CEDILLA `
+switch 'n' ',' = '\x0146' -- LATIN SMALL LETTER N WITH CEDILLA `
+switch 'N' '<' = '\x0147' -- LATIN CAPITAL LETTER N WITH CARON `
+switch 'n' '<' = '\x0148' -- LATIN SMALL LETTER N WITH CARON `
+switch '\'' 'n' = '\x0149' -- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE `
+switch 'N' 'G' = '\x014A' -- LATIN CAPITAL LETTER ENG
+switch 'n' 'g' = '\x014B' -- LATIN SMALL LETTER ENG
+switch 'O' '-' = '\x014C' -- LATIN CAPITAL LETTER O WITH MACRON
+switch 'o' '-' = '\x014D' -- LATIN SMALL LETTER O WITH MACRON
+switch 'O' '(' = '\x014E' -- LATIN CAPITAL LETTER O WITH BREVE
+switch 'o' '(' = '\x014F' -- LATIN SMALL LETTER O WITH BREVE
+switch 'O' '"' = '\x0150' -- LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+switch 'o' '"' = '\x0151' -- LATIN SMALL LETTER O WITH DOUBLE ACUTE
+switch 'O' 'E' = '\x0152' -- LATIN CAPITAL LIGATURE OE
+switch 'o' 'e' = '\x0153' -- LATIN SMALL LIGATURE OE
+switch 'R' '\'' = '\x0154' -- LATIN CAPITAL LETTER R WITH ACUTE
+switch 'r' '\'' = '\x0155' -- LATIN SMALL LETTER R WITH ACUTE
+switch 'R' ',' = '\x0156' -- LATIN CAPITAL LETTER R WITH CEDILLA
+switch 'r' ',' = '\x0157' -- LATIN SMALL LETTER R WITH CEDILLA
+switch 'R' '<' = '\x0158' -- LATIN CAPITAL LETTER R WITH CARON
+switch 'r' '<' = '\x0159' -- LATIN SMALL LETTER R WITH CARON
+switch 'S' '\'' = '\x015A' -- LATIN CAPITAL LETTER S WITH ACUTE
+switch 's' '\'' = '\x015B' -- LATIN SMALL LETTER S WITH ACUTE
+switch 'S' '>' = '\x015C' -- LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+switch 's' '>' = '\x015D' -- LATIN SMALL LETTER S WITH CIRCUMFLEX
+switch 'S' ',' = '\x015E' -- LATIN CAPITAL LETTER S WITH CEDILLA
+switch 's' ',' = '\x015F' -- LATIN SMALL LETTER S WITH CEDILLA
+switch 'S' '<' = '\x0160' -- LATIN CAPITAL LETTER S WITH CARON
+switch 's' '<' = '\x0161' -- LATIN SMALL LETTER S WITH CARON
+switch 'T' ',' = '\x0162' -- LATIN CAPITAL LETTER T WITH CEDILLA
+switch 't' ',' = '\x0163' -- LATIN SMALL LETTER T WITH CEDILLA
+switch 'T' '<' = '\x0164' -- LATIN CAPITAL LETTER T WITH CARON
+switch 't' '<' = '\x0165' -- LATIN SMALL LETTER T WITH CARON
+switch 'T' '/' = '\x0166' -- LATIN CAPITAL LETTER T WITH STROKE
+switch 't' '/' = '\x0167' -- LATIN SMALL LETTER T WITH STROKE
+switch 'U' '?' = '\x0168' -- LATIN CAPITAL LETTER U WITH TILDE
+switch 'u' '?' = '\x0169' -- LATIN SMALL LETTER U WITH TILDE
+switch 'U' '-' = '\x016A' -- LATIN CAPITAL LETTER U WITH MACRON
+switch 'u' '-' = '\x016B' -- LATIN SMALL LETTER U WITH MACRON
+switch 'U' '(' = '\x016C' -- LATIN CAPITAL LETTER U WITH BREVE
+switch 'u' '(' = '\x016D' -- LATIN SMALL LETTER U WITH BREVE
+switch 'U' '0' = '\x016E' -- LATIN CAPITAL LETTER U WITH RING ABOVE
+switch 'u' '0' = '\x016F' -- LATIN SMALL LETTER U WITH RING ABOVE
+switch 'U' '"' = '\x0170' -- LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+switch 'u' '"' = '\x0171' -- LATIN SMALL LETTER U WITH DOUBLE ACUTE
+switch 'U' ';' = '\x0172' -- LATIN CAPITAL LETTER U WITH OGONEK
+switch 'u' ';' = '\x0173' -- LATIN SMALL LETTER U WITH OGONEK
+switch 'W' '>' = '\x0174' -- LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+switch 'w' '>' = '\x0175' -- LATIN SMALL LETTER W WITH CIRCUMFLEX
+switch 'Y' '>' = '\x0176' -- LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+switch 'y' '>' = '\x0177' -- LATIN SMALL LETTER Y WITH CIRCUMFLEX
+switch 'Y' ':' = '\x0178' -- LATIN CAPITAL LETTER Y WITH DIAERESIS
+switch 'Z' '\'' = '\x0179' -- LATIN CAPITAL LETTER Z WITH ACUTE
+switch 'z' '\'' = '\x017A' -- LATIN SMALL LETTER Z WITH ACUTE
+switch 'Z' '.' = '\x017B' -- LATIN CAPITAL LETTER Z WITH DOT ABOVE
+switch 'z' '.' = '\x017C' -- LATIN SMALL LETTER Z WITH DOT ABOVE
+switch 'Z' '<' = '\x017D' -- LATIN CAPITAL LETTER Z WITH CARON
+switch 'z' '<' = '\x017E' -- LATIN SMALL LETTER Z WITH CARON
+switch 'O' '9' = '\x01A0' -- LATIN CAPITAL LETTER O WITH HORN
+switch 'o' '9' = '\x01A1' -- LATIN SMALL LETTER O WITH HORN
+switch 'O' 'I' = '\x01A2' -- LATIN CAPITAL LETTER OI
+switch 'o' 'i' = '\x01A3' -- LATIN SMALL LETTER OI
+switch 'y' 'r' = '\x01A6' -- LATIN LETTER YR
+switch 'U' '9' = '\x01AF' -- LATIN CAPITAL LETTER U WITH HORN
+switch 'u' '9' = '\x01B0' -- LATIN SMALL LETTER U WITH HORN
+switch 'Z' '/' = '\x01B5' -- LATIN CAPITAL LETTER Z WITH STROKE
+switch 'z' '/' = '\x01B6' -- LATIN SMALL LETTER Z WITH STROKE
+switch 'E' 'D' = '\x01B7' -- LATIN CAPITAL LETTER EZH
+switch 'A' '<' = '\x01CD' -- LATIN CAPITAL LETTER A WITH CARON
+switch 'a' '<' = '\x01CE' -- LATIN SMALL LETTER A WITH CARON
+switch 'I' '<' = '\x01CF' -- LATIN CAPITAL LETTER I WITH CARON
+switch 'i' '<' = '\x01D0' -- LATIN SMALL LETTER I WITH CARON
+switch 'O' '<' = '\x01D1' -- LATIN CAPITAL LETTER O WITH CARON
+switch 'o' '<' = '\x01D2' -- LATIN SMALL LETTER O WITH CARON
+switch 'U' '<' = '\x01D3' -- LATIN CAPITAL LETTER U WITH CARON
+switch 'u' '<' = '\x01D4' -- LATIN SMALL LETTER U WITH CARON
+switch 'A' '1' = '\x01DE' -- LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+switch 'a' '1' = '\x01DF' -- LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+switch 'A' '7' = '\x01E0' -- LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+switch 'a' '7' = '\x01E1' -- LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+switch 'A' '3' = '\x01E2' -- LATIN CAPITAL LETTER AE WITH MACRON
+switch 'a' '3' = '\x01E3' -- LATIN SMALL LETTER AE WITH MACRON
+switch 'G' '/' = '\x01E4' -- LATIN CAPITAL LETTER G WITH STROKE
+switch 'g' '/' = '\x01E5' -- LATIN SMALL LETTER G WITH STROKE
+switch 'G' '<' = '\x01E6' -- LATIN CAPITAL LETTER G WITH CARON
+switch 'g' '<' = '\x01E7' -- LATIN SMALL LETTER G WITH CARON
+switch 'K' '<' = '\x01E8' -- LATIN CAPITAL LETTER K WITH CARON
+switch 'k' '<' = '\x01E9' -- LATIN SMALL LETTER K WITH CARON
+switch 'O' ';' = '\x01EA' -- LATIN CAPITAL LETTER O WITH OGONEK
+switch 'o' ';' = '\x01EB' -- LATIN SMALL LETTER O WITH OGONEK
+switch 'O' '1' = '\x01EC' -- LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+switch 'o' '1' = '\x01ED' -- LATIN SMALL LETTER O WITH OGONEK AND MACRON
+switch 'E' 'Z' = '\x01EE' -- LATIN CAPITAL LETTER EZH WITH CARON
+switch 'e' 'z' = '\x01EF' -- LATIN SMALL LETTER EZH WITH CARON
+switch 'j' '<' = '\x01F0' -- LATIN SMALL LETTER J WITH CARON
+switch 'G' '\'' = '\x01F4' -- LATIN CAPITAL LETTER G WITH ACUTE
+switch 'g' '\'' = '\x01F5' -- LATIN SMALL LETTER G WITH ACUTE
+switch ';' 'S' = '\x02BF' -- MODIFIER LETTER LEFT HALF RING
+switch '\'' '<' = '\x02C7' -- CARON
+switch '\'' '(' = '\x02D8' -- BREVE
+switch '\'' '.' = '\x02D9' -- DOT ABOVE
+switch '\'' '0' = '\x02DA' -- RING ABOVE
+switch '\'' ';' = '\x02DB' -- OGONEK
+switch '\'' '"' = '\x02DD' -- DOUBLE ACUTE ACCENT
+switch 'A' '%' = '\x0386' -- GREEK CAPITAL LETTER ALPHA WITH TONOS
+switch 'E' '%' = '\x0388' -- GREEK CAPITAL LETTER EPSILON WITH TONOS
+switch 'Y' '%' = '\x0389' -- GREEK CAPITAL LETTER ETA WITH TONOS
+switch 'I' '%' = '\x038A' -- GREEK CAPITAL LETTER IOTA WITH TONOS
+switch 'O' '%' = '\x038C' -- GREEK CAPITAL LETTER OMICRON WITH TONOS
+switch 'U' '%' = '\x038E' -- GREEK CAPITAL LETTER UPSILON WITH TONOS
+switch 'W' '%' = '\x038F' -- GREEK CAPITAL LETTER OMEGA WITH TONOS
+switch 'i' '3' = '\x0390' -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+switch 'A' '*' = '\x0391' -- GREEK CAPITAL LETTER ALPHA
+switch 'B' '*' = '\x0392' -- GREEK CAPITAL LETTER BETA
+switch 'G' '*' = '\x0393' -- GREEK CAPITAL LETTER GAMMA
+switch 'D' '*' = '\x0394' -- GREEK CAPITAL LETTER DELTA
+switch 'E' '*' = '\x0395' -- GREEK CAPITAL LETTER EPSILON
+switch 'Z' '*' = '\x0396' -- GREEK CAPITAL LETTER ZETA
+switch 'Y' '*' = '\x0397' -- GREEK CAPITAL LETTER ETA
+switch 'H' '*' = '\x0398' -- GREEK CAPITAL LETTER THETA
+switch 'I' '*' = '\x0399' -- GREEK CAPITAL LETTER IOTA
+switch 'K' '*' = '\x039A' -- GREEK CAPITAL LETTER KAPPA
+switch 'L' '*' = '\x039B' -- GREEK CAPITAL LETTER LAMDA
+switch 'M' '*' = '\x039C' -- GREEK CAPITAL LETTER MU
+switch 'N' '*' = '\x039D' -- GREEK CAPITAL LETTER NU
+switch 'C' '*' = '\x039E' -- GREEK CAPITAL LETTER XI
+switch 'O' '*' = '\x039F' -- GREEK CAPITAL LETTER OMICRON
+switch 'P' '*' = '\x03A0' -- GREEK CAPITAL LETTER PI
+switch 'R' '*' = '\x03A1' -- GREEK CAPITAL LETTER RHO
+switch 'S' '*' = '\x03A3' -- GREEK CAPITAL LETTER SIGMA
+switch 'T' '*' = '\x03A4' -- GREEK CAPITAL LETTER TAU
+switch 'U' '*' = '\x03A5' -- GREEK CAPITAL LETTER UPSILON
+switch 'F' '*' = '\x03A6' -- GREEK CAPITAL LETTER PHI
+switch 'X' '*' = '\x03A7' -- GREEK CAPITAL LETTER CHI
+switch 'Q' '*' = '\x03A8' -- GREEK CAPITAL LETTER PSI
+switch 'W' '*' = '\x03A9' -- GREEK CAPITAL LETTER OMEGA
+switch 'J' '*' = '\x03AA' -- GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+switch 'V' '*' = '\x03AB' -- GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+switch 'a' '%' = '\x03AC' -- GREEK SMALL LETTER ALPHA WITH TONOS
+switch 'e' '%' = '\x03AD' -- GREEK SMALL LETTER EPSILON WITH TONOS
+switch 'y' '%' = '\x03AE' -- GREEK SMALL LETTER ETA WITH TONOS
+switch 'i' '%' = '\x03AF' -- GREEK SMALL LETTER IOTA WITH TONOS
+switch 'u' '3' = '\x03B0' -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+switch 'a' '*' = '\x03B1' -- GREEK SMALL LETTER ALPHA
+switch 'b' '*' = '\x03B2' -- GREEK SMALL LETTER BETA
+switch 'g' '*' = '\x03B3' -- GREEK SMALL LETTER GAMMA
+switch 'd' '*' = '\x03B4' -- GREEK SMALL LETTER DELTA
+switch 'e' '*' = '\x03B5' -- GREEK SMALL LETTER EPSILON
+switch 'z' '*' = '\x03B6' -- GREEK SMALL LETTER ZETA
+switch 'y' '*' = '\x03B7' -- GREEK SMALL LETTER ETA
+switch 'h' '*' = '\x03B8' -- GREEK SMALL LETTER THETA
+switch 'i' '*' = '\x03B9' -- GREEK SMALL LETTER IOTA
+switch 'k' '*' = '\x03BA' -- GREEK SMALL LETTER KAPPA
+switch 'l' '*' = '\x03BB' -- GREEK SMALL LETTER LAMDA
+switch 'm' '*' = '\x03BC' -- GREEK SMALL LETTER MU
+switch 'n' '*' = '\x03BD' -- GREEK SMALL LETTER NU
+switch 'c' '*' = '\x03BE' -- GREEK SMALL LETTER XI
+switch 'o' '*' = '\x03BF' -- GREEK SMALL LETTER OMICRON
+switch 'p' '*' = '\x03C0' -- GREEK SMALL LETTER PI
+switch 'r' '*' = '\x03C1' -- GREEK SMALL LETTER RHO
+switch '*' 's' = '\x03C2' -- GREEK SMALL LETTER FINAL SIGMA
+switch 's' '*' = '\x03C3' -- GREEK SMALL LETTER SIGMA
+switch 't' '*' = '\x03C4' -- GREEK SMALL LETTER TAU
+switch 'u' '*' = '\x03C5' -- GREEK SMALL LETTER UPSILON
+switch 'f' '*' = '\x03C6' -- GREEK SMALL LETTER PHI
+switch 'x' '*' = '\x03C7' -- GREEK SMALL LETTER CHI
+switch 'q' '*' = '\x03C8' -- GREEK SMALL LETTER PSI
+switch 'w' '*' = '\x03C9' -- GREEK SMALL LETTER OMEGA
+switch 'j' '*' = '\x03CA' -- GREEK SMALL LETTER IOTA WITH DIALYTIKA
+switch 'v' '*' = '\x03CB' -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+switch 'o' '%' = '\x03CC' -- GREEK SMALL LETTER OMICRON WITH TONOS
+switch 'u' '%' = '\x03CD' -- GREEK SMALL LETTER UPSILON WITH TONOS
+switch 'w' '%' = '\x03CE' -- GREEK SMALL LETTER OMEGA WITH TONOS
+switch '\'' 'G' = '\x03D8' -- GREEK LETTER ARCHAIC KOPPA
+switch ',' 'G' = '\x03D9' -- GREEK SMALL LETTER ARCHAIC KOPPA
+switch 'T' '3' = '\x03DA' -- GREEK LETTER STIGMA
+switch 't' '3' = '\x03DB' -- GREEK SMALL LETTER STIGMA
+switch 'M' '3' = '\x03DC' -- GREEK LETTER DIGAMMA
+switch 'm' '3' = '\x03DD' -- GREEK SMALL LETTER DIGAMMA
+switch 'K' '3' = '\x03DE' -- GREEK LETTER KOPPA
+switch 'k' '3' = '\x03DF' -- GREEK SMALL LETTER KOPPA
+switch 'P' '3' = '\x03E0' -- GREEK LETTER SAMPI
+switch 'p' '3' = '\x03E1' -- GREEK SMALL LETTER SAMPI
+switch '\'' '%' = '\x03F4' -- GREEK CAPITAL THETA SYMBOL
+switch 'j' '3' = '\x03F5' -- GREEK LUNATE EPSILON SYMBOL
+switch 'I' 'O' = '\x0401' -- CYRILLIC CAPITAL LETTER IO
+switch 'D' '%' = '\x0402' -- CYRILLIC CAPITAL LETTER DJE
+switch 'G' '%' = '\x0403' -- CYRILLIC CAPITAL LETTER GJE
+switch 'I' 'E' = '\x0404' -- CYRILLIC CAPITAL LETTER UKRAINIAN IE
+switch 'D' 'S' = '\x0405' -- CYRILLIC CAPITAL LETTER DZE
+switch 'I' 'I' = '\x0406' -- CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+switch 'Y' 'I' = '\x0407' -- CYRILLIC CAPITAL LETTER YI
+switch 'J' '%' = '\x0408' -- CYRILLIC CAPITAL LETTER JE
+switch 'L' 'J' = '\x0409' -- CYRILLIC CAPITAL LETTER LJE
+switch 'N' 'J' = '\x040A' -- CYRILLIC CAPITAL LETTER NJE
+switch 'T' 's' = '\x040B' -- CYRILLIC CAPITAL LETTER TSHE
+switch 'K' 'J' = '\x040C' -- CYRILLIC CAPITAL LETTER KJE
+switch 'V' '%' = '\x040E' -- CYRILLIC CAPITAL LETTER SHORT U
+switch 'D' 'Z' = '\x040F' -- CYRILLIC CAPITAL LETTER DZHE
+switch 'A' '=' = '\x0410' -- CYRILLIC CAPITAL LETTER A
+switch 'B' '=' = '\x0411' -- CYRILLIC CAPITAL LETTER BE
+switch 'V' '=' = '\x0412' -- CYRILLIC CAPITAL LETTER VE
+switch 'G' '=' = '\x0413' -- CYRILLIC CAPITAL LETTER GHE
+switch 'D' '=' = '\x0414' -- CYRILLIC CAPITAL LETTER DE
+switch 'E' '=' = '\x0415' -- CYRILLIC CAPITAL LETTER IE
+switch 'Z' '%' = '\x0416' -- CYRILLIC CAPITAL LETTER ZHE
+switch 'Z' '=' = '\x0417' -- CYRILLIC CAPITAL LETTER ZE
+switch 'I' '=' = '\x0418' -- CYRILLIC CAPITAL LETTER I
+switch 'J' '=' = '\x0419' -- CYRILLIC CAPITAL LETTER SHORT I
+switch 'K' '=' = '\x041A' -- CYRILLIC CAPITAL LETTER KA
+switch 'L' '=' = '\x041B' -- CYRILLIC CAPITAL LETTER EL
+switch 'M' '=' = '\x041C' -- CYRILLIC CAPITAL LETTER EM
+switch 'N' '=' = '\x041D' -- CYRILLIC CAPITAL LETTER EN
+switch 'O' '=' = '\x041E' -- CYRILLIC CAPITAL LETTER O
+switch 'P' '=' = '\x041F' -- CYRILLIC CAPITAL LETTER PE
+switch 'R' '=' = '\x0420' -- CYRILLIC CAPITAL LETTER ER
+switch 'S' '=' = '\x0421' -- CYRILLIC CAPITAL LETTER ES
+switch 'T' '=' = '\x0422' -- CYRILLIC CAPITAL LETTER TE
+switch 'U' '=' = '\x0423' -- CYRILLIC CAPITAL LETTER U
+switch 'F' '=' = '\x0424' -- CYRILLIC CAPITAL LETTER EF
+switch 'H' '=' = '\x0425' -- CYRILLIC CAPITAL LETTER HA
+switch 'C' '=' = '\x0426' -- CYRILLIC CAPITAL LETTER TSE
+switch 'C' '%' = '\x0427' -- CYRILLIC CAPITAL LETTER CHE
+switch 'S' '%' = '\x0428' -- CYRILLIC CAPITAL LETTER SHA
+switch 'S' 'c' = '\x0429' -- CYRILLIC CAPITAL LETTER SHCHA
+switch '=' '"' = '\x042A' -- CYRILLIC CAPITAL LETTER HARD SIGN
+switch 'Y' '=' = '\x042B' -- CYRILLIC CAPITAL LETTER YERU
+switch '%' '"' = '\x042C' -- CYRILLIC CAPITAL LETTER SOFT SIGN
+switch 'J' 'E' = '\x042D' -- CYRILLIC CAPITAL LETTER E
+switch 'J' 'U' = '\x042E' -- CYRILLIC CAPITAL LETTER YU
+switch 'J' 'A' = '\x042F' -- CYRILLIC CAPITAL LETTER YA
+switch 'a' '=' = '\x0430' -- CYRILLIC SMALL LETTER A
+switch 'b' '=' = '\x0431' -- CYRILLIC SMALL LETTER BE
+switch 'v' '=' = '\x0432' -- CYRILLIC SMALL LETTER VE
+switch 'g' '=' = '\x0433' -- CYRILLIC SMALL LETTER GHE
+switch 'd' '=' = '\x0434' -- CYRILLIC SMALL LETTER DE
+switch 'e' '=' = '\x0435' -- CYRILLIC SMALL LETTER IE
+switch 'z' '%' = '\x0436' -- CYRILLIC SMALL LETTER ZHE
+switch 'z' '=' = '\x0437' -- CYRILLIC SMALL LETTER ZE
+switch 'i' '=' = '\x0438' -- CYRILLIC SMALL LETTER I
+switch 'j' '=' = '\x0439' -- CYRILLIC SMALL LETTER SHORT I
+switch 'k' '=' = '\x043A' -- CYRILLIC SMALL LETTER KA
+switch 'l' '=' = '\x043B' -- CYRILLIC SMALL LETTER EL
+switch 'm' '=' = '\x043C' -- CYRILLIC SMALL LETTER EM
+switch 'n' '=' = '\x043D' -- CYRILLIC SMALL LETTER EN
+switch 'o' '=' = '\x043E' -- CYRILLIC SMALL LETTER O
+switch 'p' '=' = '\x043F' -- CYRILLIC SMALL LETTER PE
+switch 'r' '=' = '\x0440' -- CYRILLIC SMALL LETTER ER
+switch 's' '=' = '\x0441' -- CYRILLIC SMALL LETTER ES
+switch 't' '=' = '\x0442' -- CYRILLIC SMALL LETTER TE
+switch 'u' '=' = '\x0443' -- CYRILLIC SMALL LETTER U
+switch 'f' '=' = '\x0444' -- CYRILLIC SMALL LETTER EF
+switch 'h' '=' = '\x0445' -- CYRILLIC SMALL LETTER HA
+switch 'c' '=' = '\x0446' -- CYRILLIC SMALL LETTER TSE
+switch 'c' '%' = '\x0447' -- CYRILLIC SMALL LETTER CHE
+switch 's' '%' = '\x0448' -- CYRILLIC SMALL LETTER SHA
+switch 's' 'c' = '\x0449' -- CYRILLIC SMALL LETTER SHCHA
+switch '=' '\'' = '\x044A' -- CYRILLIC SMALL LETTER HARD SIGN
+switch 'y' '=' = '\x044B' -- CYRILLIC SMALL LETTER YERU
+switch '%' '\'' = '\x044C' -- CYRILLIC SMALL LETTER SOFT SIGN
+switch 'j' 'e' = '\x044D' -- CYRILLIC SMALL LETTER E
+switch 'j' 'u' = '\x044E' -- CYRILLIC SMALL LETTER YU
+switch 'j' 'a' = '\x044F' -- CYRILLIC SMALL LETTER YA
+switch 'i' 'o' = '\x0451' -- CYRILLIC SMALL LETTER IO
+switch 'd' '%' = '\x0452' -- CYRILLIC SMALL LETTER DJE
+switch 'g' '%' = '\x0453' -- CYRILLIC SMALL LETTER GJE
+switch 'i' 'e' = '\x0454' -- CYRILLIC SMALL LETTER UKRAINIAN IE
+switch 'd' 's' = '\x0455' -- CYRILLIC SMALL LETTER DZE
+switch 'i' 'i' = '\x0456' -- CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+switch 'y' 'i' = '\x0457' -- CYRILLIC SMALL LETTER YI
+switch 'j' '%' = '\x0458' -- CYRILLIC SMALL LETTER JE
+switch 'l' 'j' = '\x0459' -- CYRILLIC SMALL LETTER LJE
+switch 'n' 'j' = '\x045A' -- CYRILLIC SMALL LETTER NJE
+switch 't' 's' = '\x045B' -- CYRILLIC SMALL LETTER TSHE
+switch 'k' 'j' = '\x045C' -- CYRILLIC SMALL LETTER KJE
+switch 'v' '%' = '\x045E' -- CYRILLIC SMALL LETTER SHORT U
+switch 'd' 'z' = '\x045F' -- CYRILLIC SMALL LETTER DZHE
+switch 'Y' '3' = '\x0462' -- CYRILLIC CAPITAL LETTER YAT
+switch 'y' '3' = '\x0463' -- CYRILLIC SMALL LETTER YAT
+switch 'O' '3' = '\x046A' -- CYRILLIC CAPITAL LETTER BIG YUS
+switch 'o' '3' = '\x046B' -- CYRILLIC SMALL LETTER BIG YUS
+switch 'F' '3' = '\x0472' -- CYRILLIC CAPITAL LETTER FITA
+switch 'f' '3' = '\x0473' -- CYRILLIC SMALL LETTER FITA
+switch 'V' '3' = '\x0474' -- CYRILLIC CAPITAL LETTER IZHITSA
+switch 'v' '3' = '\x0475' -- CYRILLIC SMALL LETTER IZHITSA
+switch 'C' '3' = '\x0480' -- CYRILLIC CAPITAL LETTER KOPPA
+switch 'c' '3' = '\x0481' -- CYRILLIC SMALL LETTER KOPPA
+switch 'G' '3' = '\x0490' -- CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+switch 'g' '3' = '\x0491' -- CYRILLIC SMALL LETTER GHE WITH UPTURN
+switch 'A' '+' = '\x05D0' -- HEBREW LETTER ALEF
+switch 'B' '+' = '\x05D1' -- HEBREW LETTER BET
+switch 'G' '+' = '\x05D2' -- HEBREW LETTER GIMEL
+switch 'D' '+' = '\x05D3' -- HEBREW LETTER DALET
+switch 'H' '+' = '\x05D4' -- HEBREW LETTER HE
+switch 'W' '+' = '\x05D5' -- HEBREW LETTER VAV
+switch 'Z' '+' = '\x05D6' -- HEBREW LETTER ZAYIN
+switch 'X' '+' = '\x05D7' -- HEBREW LETTER HET
+switch 'T' 'j' = '\x05D8' -- HEBREW LETTER TET
+switch 'J' '+' = '\x05D9' -- HEBREW LETTER YOD
+switch 'K' '%' = '\x05DA' -- HEBREW LETTER FINAL KAF
+switch 'K' '+' = '\x05DB' -- HEBREW LETTER KAF
+switch 'L' '+' = '\x05DC' -- HEBREW LETTER LAMED
+switch 'M' '%' = '\x05DD' -- HEBREW LETTER FINAL MEM
+switch 'M' '+' = '\x05DE' -- HEBREW LETTER MEM
+switch 'N' '%' = '\x05DF' -- HEBREW LETTER FINAL NUN `
+switch 'N' '+' = '\x05E0' -- HEBREW LETTER NUN `
+switch 'S' '+' = '\x05E1' -- HEBREW LETTER SAMEKH
+switch 'E' '+' = '\x05E2' -- HEBREW LETTER AYIN
+switch 'P' '%' = '\x05E3' -- HEBREW LETTER FINAL PE
+switch 'P' '+' = '\x05E4' -- HEBREW LETTER PE
+switch 'Z' 'j' = '\x05E5' -- HEBREW LETTER FINAL TSADI
+switch 'Z' 'J' = '\x05E6' -- HEBREW LETTER TSADI
+switch 'Q' '+' = '\x05E7' -- HEBREW LETTER QOF
+switch 'R' '+' = '\x05E8' -- HEBREW LETTER RESH
+switch 'S' 'h' = '\x05E9' -- HEBREW LETTER SHIN
+switch 'T' '+' = '\x05EA' -- HEBREW LETTER TAV
+switch ',' '+' = '\x060C' -- ARABIC COMMA
+switch ';' '+' = '\x061B' -- ARABIC SEMICOLON
+switch '?' '+' = '\x061F' -- ARABIC QUESTION MARK
+switch 'H' '\'' = '\x0621' -- ARABIC LETTER HAMZA
+switch 'a' 'M' = '\x0622' -- ARABIC LETTER ALEF WITH MADDA ABOVE
+switch 'a' 'H' = '\x0623' -- ARABIC LETTER ALEF WITH HAMZA ABOVE
+switch 'w' 'H' = '\x0624' -- ARABIC LETTER WAW WITH HAMZA ABOVE
+switch 'a' 'h' = '\x0625' -- ARABIC LETTER ALEF WITH HAMZA BELOW
+switch 'y' 'H' = '\x0626' -- ARABIC LETTER YEH WITH HAMZA ABOVE
+switch 'a' '+' = '\x0627' -- ARABIC LETTER ALEF
+switch 'b' '+' = '\x0628' -- ARABIC LETTER BEH
+switch 't' 'm' = '\x0629' -- ARABIC LETTER TEH MARBUTA
+switch 't' '+' = '\x062A' -- ARABIC LETTER TEH
+switch 't' 'k' = '\x062B' -- ARABIC LETTER THEH
+switch 'g' '+' = '\x062C' -- ARABIC LETTER JEEM
+switch 'h' 'k' = '\x062D' -- ARABIC LETTER HAH
+switch 'x' '+' = '\x062E' -- ARABIC LETTER KHAH
+switch 'd' '+' = '\x062F' -- ARABIC LETTER DAL
+switch 'd' 'k' = '\x0630' -- ARABIC LETTER THAL
+switch 'r' '+' = '\x0631' -- ARABIC LETTER REH
+switch 'z' '+' = '\x0632' -- ARABIC LETTER ZAIN
+switch 's' '+' = '\x0633' -- ARABIC LETTER SEEN
+switch 's' 'n' = '\x0634' -- ARABIC LETTER SHEEN
+switch 'c' '+' = '\x0635' -- ARABIC LETTER SAD
+switch 'd' 'd' = '\x0636' -- ARABIC LETTER DAD
+switch 't' 'j' = '\x0637' -- ARABIC LETTER TAH
+switch 'z' 'H' = '\x0638' -- ARABIC LETTER ZAH
+switch 'e' '+' = '\x0639' -- ARABIC LETTER AIN
+switch 'i' '+' = '\x063A' -- ARABIC LETTER GHAIN
+switch '+' '+' = '\x0640' -- ARABIC TATWEEL
+switch 'f' '+' = '\x0641' -- ARABIC LETTER FEH
+switch 'q' '+' = '\x0642' -- ARABIC LETTER QAF
+switch 'k' '+' = '\x0643' -- ARABIC LETTER KAF
+switch 'l' '+' = '\x0644' -- ARABIC LETTER LAM
+switch 'm' '+' = '\x0645' -- ARABIC LETTER MEEM
+switch 'n' '+' = '\x0646' -- ARABIC LETTER NOON
+switch 'h' '+' = '\x0647' -- ARABIC LETTER HEH
+switch 'w' '+' = '\x0648' -- ARABIC LETTER WAW
+switch 'j' '+' = '\x0649' -- ARABIC LETTER ALEF MAKSURA
+switch 'y' '+' = '\x064A' -- ARABIC LETTER YEH
+switch ':' '+' = '\x064B' -- ARABIC FATHATAN
+switch '"' '+' = '\x064C' -- ARABIC DAMMATAN
+switch '=' '+' = '\x064D' -- ARABIC KASRATAN
+switch '/' '+' = '\x064E' -- ARABIC FATHA
+switch '\'' '+' = '\x064F' -- ARABIC DAMMA
+switch '1' '+' = '\x0650' -- ARABIC KASRA
+switch '3' '+' = '\x0651' -- ARABIC SHADDA
+switch '0' '+' = '\x0652' -- ARABIC SUKUN
+switch 'a' 'S' = '\x0670' -- ARABIC LETTER SUPERSCRIPT ALEF
+switch 'p' '+' = '\x067E' -- ARABIC LETTER PEH
+switch 'v' '+' = '\x06A4' -- ARABIC LETTER VEH
+switch 'g' 'f' = '\x06AF' -- ARABIC LETTER GAF
+switch '0' 'a' = '\x06F0' -- EXTENDED ARABIC-INDIC DIGIT ZERO
+switch '1' 'a' = '\x06F1' -- EXTENDED ARABIC-INDIC DIGIT ONE
+switch '2' 'a' = '\x06F2' -- EXTENDED ARABIC-INDIC DIGIT TWO
+switch '3' 'a' = '\x06F3' -- EXTENDED ARABIC-INDIC DIGIT THREE
+switch '4' 'a' = '\x06F4' -- EXTENDED ARABIC-INDIC DIGIT FOUR
+switch '5' 'a' = '\x06F5' -- EXTENDED ARABIC-INDIC DIGIT FIVE
+switch '6' 'a' = '\x06F6' -- EXTENDED ARABIC-INDIC DIGIT SIX
+switch '7' 'a' = '\x06F7' -- EXTENDED ARABIC-INDIC DIGIT SEVEN
+switch '8' 'a' = '\x06F8' -- EXTENDED ARABIC-INDIC DIGIT EIGHT
+switch '9' 'a' = '\x06F9' -- EXTENDED ARABIC-INDIC DIGIT NINE
+switch 'B' '.' = '\x1E02' -- LATIN CAPITAL LETTER B WITH DOT ABOVE
+switch 'b' '.' = '\x1E03' -- LATIN SMALL LETTER B WITH DOT ABOVE
+switch 'B' '_' = '\x1E06' -- LATIN CAPITAL LETTER B WITH LINE BELOW
+switch 'b' '_' = '\x1E07' -- LATIN SMALL LETTER B WITH LINE BELOW
+switch 'D' '.' = '\x1E0A' -- LATIN CAPITAL LETTER D WITH DOT ABOVE
+switch 'd' '.' = '\x1E0B' -- LATIN SMALL LETTER D WITH DOT ABOVE
+switch 'D' '_' = '\x1E0E' -- LATIN CAPITAL LETTER D WITH LINE BELOW
+switch 'd' '_' = '\x1E0F' -- LATIN SMALL LETTER D WITH LINE BELOW
+switch 'D' ',' = '\x1E10' -- LATIN CAPITAL LETTER D WITH CEDILLA
+switch 'd' ',' = '\x1E11' -- LATIN SMALL LETTER D WITH CEDILLA
+switch 'F' '.' = '\x1E1E' -- LATIN CAPITAL LETTER F WITH DOT ABOVE
+switch 'f' '.' = '\x1E1F' -- LATIN SMALL LETTER F WITH DOT ABOVE
+switch 'G' '-' = '\x1E20' -- LATIN CAPITAL LETTER G WITH MACRON
+switch 'g' '-' = '\x1E21' -- LATIN SMALL LETTER G WITH MACRON
+switch 'H' '.' = '\x1E22' -- LATIN CAPITAL LETTER H WITH DOT ABOVE
+switch 'h' '.' = '\x1E23' -- LATIN SMALL LETTER H WITH DOT ABOVE
+switch 'H' ':' = '\x1E26' -- LATIN CAPITAL LETTER H WITH DIAERESIS
+switch 'h' ':' = '\x1E27' -- LATIN SMALL LETTER H WITH DIAERESIS
+switch 'H' ',' = '\x1E28' -- LATIN CAPITAL LETTER H WITH CEDILLA
+switch 'h' ',' = '\x1E29' -- LATIN SMALL LETTER H WITH CEDILLA
+switch 'K' '\'' = '\x1E30' -- LATIN CAPITAL LETTER K WITH ACUTE
+switch 'k' '\'' = '\x1E31' -- LATIN SMALL LETTER K WITH ACUTE
+switch 'K' '_' = '\x1E34' -- LATIN CAPITAL LETTER K WITH LINE BELOW
+switch 'k' '_' = '\x1E35' -- LATIN SMALL LETTER K WITH LINE BELOW
+switch 'L' '_' = '\x1E3A' -- LATIN CAPITAL LETTER L WITH LINE BELOW
+switch 'l' '_' = '\x1E3B' -- LATIN SMALL LETTER L WITH LINE BELOW
+switch 'M' '\'' = '\x1E3E' -- LATIN CAPITAL LETTER M WITH ACUTE
+switch 'm' '\'' = '\x1E3F' -- LATIN SMALL LETTER M WITH ACUTE
+switch 'M' '.' = '\x1E40' -- LATIN CAPITAL LETTER M WITH DOT ABOVE
+switch 'm' '.' = '\x1E41' -- LATIN SMALL LETTER M WITH DOT ABOVE
+switch 'N' '.' = '\x1E44' -- LATIN CAPITAL LETTER N WITH DOT ABOVE `
+switch 'n' '.' = '\x1E45' -- LATIN SMALL LETTER N WITH DOT ABOVE `
+switch 'N' '_' = '\x1E48' -- LATIN CAPITAL LETTER N WITH LINE BELOW `
+switch 'n' '_' = '\x1E49' -- LATIN SMALL LETTER N WITH LINE BELOW `
+switch 'P' '\'' = '\x1E54' -- LATIN CAPITAL LETTER P WITH ACUTE
+switch 'p' '\'' = '\x1E55' -- LATIN SMALL LETTER P WITH ACUTE
+switch 'P' '.' = '\x1E56' -- LATIN CAPITAL LETTER P WITH DOT ABOVE
+switch 'p' '.' = '\x1E57' -- LATIN SMALL LETTER P WITH DOT ABOVE
+switch 'R' '.' = '\x1E58' -- LATIN CAPITAL LETTER R WITH DOT ABOVE
+switch 'r' '.' = '\x1E59' -- LATIN SMALL LETTER R WITH DOT ABOVE
+switch 'R' '_' = '\x1E5E' -- LATIN CAPITAL LETTER R WITH LINE BELOW
+switch 'r' '_' = '\x1E5F' -- LATIN SMALL LETTER R WITH LINE BELOW
+switch 'S' '.' = '\x1E60' -- LATIN CAPITAL LETTER S WITH DOT ABOVE
+switch 's' '.' = '\x1E61' -- LATIN SMALL LETTER S WITH DOT ABOVE
+switch 'T' '.' = '\x1E6A' -- LATIN CAPITAL LETTER T WITH DOT ABOVE
+switch 't' '.' = '\x1E6B' -- LATIN SMALL LETTER T WITH DOT ABOVE
+switch 'T' '_' = '\x1E6E' -- LATIN CAPITAL LETTER T WITH LINE BELOW
+switch 't' '_' = '\x1E6F' -- LATIN SMALL LETTER T WITH LINE BELOW
+switch 'V' '?' = '\x1E7C' -- LATIN CAPITAL LETTER V WITH TILDE
+switch 'v' '?' = '\x1E7D' -- LATIN SMALL LETTER V WITH TILDE
+switch 'W' '!' = '\x1E80' -- LATIN CAPITAL LETTER W WITH GRAVE
+switch 'w' '!' = '\x1E81' -- LATIN SMALL LETTER W WITH GRAVE
+switch 'W' '\'' = '\x1E82' -- LATIN CAPITAL LETTER W WITH ACUTE
+switch 'w' '\'' = '\x1E83' -- LATIN SMALL LETTER W WITH ACUTE
+switch 'W' ':' = '\x1E84' -- LATIN CAPITAL LETTER W WITH DIAERESIS
+switch 'w' ':' = '\x1E85' -- LATIN SMALL LETTER W WITH DIAERESIS
+switch 'W' '.' = '\x1E86' -- LATIN CAPITAL LETTER W WITH DOT ABOVE
+switch 'w' '.' = '\x1E87' -- LATIN SMALL LETTER W WITH DOT ABOVE
+switch 'X' '.' = '\x1E8A' -- LATIN CAPITAL LETTER X WITH DOT ABOVE
+switch 'x' '.' = '\x1E8B' -- LATIN SMALL LETTER X WITH DOT ABOVE
+switch 'X' ':' = '\x1E8C' -- LATIN CAPITAL LETTER X WITH DIAERESIS
+switch 'x' ':' = '\x1E8D' -- LATIN SMALL LETTER X WITH DIAERESIS
+switch 'Y' '.' = '\x1E8E' -- LATIN CAPITAL LETTER Y WITH DOT ABOVE
+switch 'y' '.' = '\x1E8F' -- LATIN SMALL LETTER Y WITH DOT ABOVE
+switch 'Z' '>' = '\x1E90' -- LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+switch 'z' '>' = '\x1E91' -- LATIN SMALL LETTER Z WITH CIRCUMFLEX
+switch 'Z' '_' = '\x1E94' -- LATIN CAPITAL LETTER Z WITH LINE BELOW
+switch 'z' '_' = '\x1E95' -- LATIN SMALL LETTER Z WITH LINE BELOW
+switch 'h' '_' = '\x1E96' -- LATIN SMALL LETTER H WITH LINE BELOW
+switch 't' ':' = '\x1E97' -- LATIN SMALL LETTER T WITH DIAERESIS
+switch 'w' '0' = '\x1E98' -- LATIN SMALL LETTER W WITH RING ABOVE
+switch 'y' '0' = '\x1E99' -- LATIN SMALL LETTER Y WITH RING ABOVE
+switch 'A' '2' = '\x1EA2' -- LATIN CAPITAL LETTER A WITH HOOK ABOVE
+switch 'a' '2' = '\x1EA3' -- LATIN SMALL LETTER A WITH HOOK ABOVE
+switch 'E' '2' = '\x1EBA' -- LATIN CAPITAL LETTER E WITH HOOK ABOVE
+switch 'e' '2' = '\x1EBB' -- LATIN SMALL LETTER E WITH HOOK ABOVE
+switch 'E' '?' = '\x1EBC' -- LATIN CAPITAL LETTER E WITH TILDE
+switch 'e' '?' = '\x1EBD' -- LATIN SMALL LETTER E WITH TILDE
+switch 'I' '2' = '\x1EC8' -- LATIN CAPITAL LETTER I WITH HOOK ABOVE
+switch 'i' '2' = '\x1EC9' -- LATIN SMALL LETTER I WITH HOOK ABOVE
+switch 'O' '2' = '\x1ECE' -- LATIN CAPITAL LETTER O WITH HOOK ABOVE
+switch 'o' '2' = '\x1ECF' -- LATIN SMALL LETTER O WITH HOOK ABOVE
+switch 'U' '2' = '\x1EE6' -- LATIN CAPITAL LETTER U WITH HOOK ABOVE
+switch 'u' '2' = '\x1EE7' -- LATIN SMALL LETTER U WITH HOOK ABOVE
+switch 'Y' '!' = '\x1EF2' -- LATIN CAPITAL LETTER Y WITH GRAVE
+switch 'y' '!' = '\x1EF3' -- LATIN SMALL LETTER Y WITH GRAVE
+switch 'Y' '2' = '\x1EF6' -- LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+switch 'y' '2' = '\x1EF7' -- LATIN SMALL LETTER Y WITH HOOK ABOVE
+switch 'Y' '?' = '\x1EF8' -- LATIN CAPITAL LETTER Y WITH TILDE
+switch 'y' '?' = '\x1EF9' -- LATIN SMALL LETTER Y WITH TILDE
+switch ';' '\'' = '\x1F00' -- GREEK SMALL LETTER ALPHA WITH PSILI
+switch ',' '\'' = '\x1F01' -- GREEK SMALL LETTER ALPHA WITH DASIA
+switch ';' '!' = '\x1F02' -- GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+switch ',' '!' = '\x1F03' -- GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+switch '?' ';' = '\x1F04' -- GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+switch '?' ',' = '\x1F05' -- GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+switch '!' ':' = '\x1F06' -- GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+switch '?' ':' = '\x1F07' -- GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+switch '1' 'N' = '\x2002' -- EN SPACE
+switch '1' 'M' = '\x2003' -- EM SPACE
+switch '3' 'M' = '\x2004' -- THREE-PER-EM SPACE
+switch '4' 'M' = '\x2005' -- FOUR-PER-EM SPACE
+switch '6' 'M' = '\x2006' -- SIX-PER-EM SPACE
+switch '1' 'T' = '\x2009' -- THIN SPACE
+switch '1' 'H' = '\x200A' -- HAIR SPACE
+switch '-' '1' = '\x2010' -- HYPHEN
+switch '-' 'N' = '\x2013' -- EN DASH `
+switch '-' 'M' = '\x2014' -- EM DASH
+switch '-' '3' = '\x2015' -- HORIZONTAL BAR
+switch '!' '2' = '\x2016' -- DOUBLE VERTICAL LINE
+switch '=' '2' = '\x2017' -- DOUBLE LOW LINE
+switch '\'' '6' = '\x2018' -- LEFT SINGLE QUOTATION MARK
+switch '\'' '9' = '\x2019' -- RIGHT SINGLE QUOTATION MARK
+switch '.' '9' = '\x201A' -- SINGLE LOW-9 QUOTATION MARK
+switch '9' '\'' = '\x201B' -- SINGLE HIGH-REVERSED-9 QUOTATION MARK
+switch '"' '6' = '\x201C' -- LEFT DOUBLE QUOTATION MARK
+switch '"' '9' = '\x201D' -- RIGHT DOUBLE QUOTATION MARK
+switch ':' '9' = '\x201E' -- DOUBLE LOW-9 QUOTATION MARK
+switch '9' '"' = '\x201F' -- DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+switch '/' '-' = '\x2020' -- DAGGER
+switch '/' '=' = '\x2021' -- DOUBLE DAGGER
+switch '.' '.' = '\x2025' -- TWO DOT LEADER
+switch '%' '0' = '\x2030' -- PER MILLE SIGN
+switch '1' '\'' = '\x2032' -- PRIME
+switch '2' '\'' = '\x2033' -- DOUBLE PRIME
+switch '3' '\'' = '\x2034' -- TRIPLE PRIME
+switch '1' '"' = '\x2035' -- REVERSED PRIME
+switch '2' '"' = '\x2036' -- REVERSED DOUBLE PRIME
+switch '3' '"' = '\x2037' -- REVERSED TRIPLE PRIME
+switch 'C' 'a' = '\x2038' -- CARET
+switch '<' '1' = '\x2039' -- SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+switch '>' '1' = '\x203A' -- SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+switch ':' 'X' = '\x203B' -- REFERENCE MARK
+switch '\'' '-' = '\x203E' -- OVERLINE
+switch '/' 'f' = '\x2044' -- FRACTION SLASH
+switch '0' 'S' = '\x2070' -- SUPERSCRIPT ZERO
+switch '4' 'S' = '\x2074' -- SUPERSCRIPT FOUR
+switch '5' 'S' = '\x2075' -- SUPERSCRIPT FIVE
+switch '6' 'S' = '\x2076' -- SUPERSCRIPT SIX
+switch '7' 'S' = '\x2077' -- SUPERSCRIPT SEVEN
+switch '8' 'S' = '\x2078' -- SUPERSCRIPT EIGHT
+switch '9' 'S' = '\x2079' -- SUPERSCRIPT NINE
+switch '+' 'S' = '\x207A' -- SUPERSCRIPT PLUS SIGN
+switch '-' 'S' = '\x207B' -- SUPERSCRIPT MINUS
+switch '=' 'S' = '\x207C' -- SUPERSCRIPT EQUALS SIGN
+switch '(' 'S' = '\x207D' -- SUPERSCRIPT LEFT PARENTHESIS
+switch ')' 'S' = '\x207E' -- SUPERSCRIPT RIGHT PARENTHESIS
+switch 'n' 'S' = '\x207F' -- SUPERSCRIPT LATIN SMALL LETTER N `
+switch '0' 's' = '\x2080' -- SUBSCRIPT ZERO
+switch '1' 's' = '\x2081' -- SUBSCRIPT ONE
+switch '2' 's' = '\x2082' -- SUBSCRIPT TWO
+switch '3' 's' = '\x2083' -- SUBSCRIPT THREE
+switch '4' 's' = '\x2084' -- SUBSCRIPT FOUR
+switch '5' 's' = '\x2085' -- SUBSCRIPT FIVE
+switch '6' 's' = '\x2086' -- SUBSCRIPT SIX
+switch '7' 's' = '\x2087' -- SUBSCRIPT SEVEN
+switch '8' 's' = '\x2088' -- SUBSCRIPT EIGHT
+switch '9' 's' = '\x2089' -- SUBSCRIPT NINE
+switch '+' 's' = '\x208A' -- SUBSCRIPT PLUS SIGN
+switch '-' 's' = '\x208B' -- SUBSCRIPT MINUS
+switch '=' 's' = '\x208C' -- SUBSCRIPT EQUALS SIGN
+switch '(' 's' = '\x208D' -- SUBSCRIPT LEFT PARENTHESIS
+switch ')' 's' = '\x208E' -- SUBSCRIPT RIGHT PARENTHESIS
+switch 'L' 'i' = '\x20A4' -- LIRA SIGN
+switch 'P' 't' = '\x20A7' -- PESETA SIGN
+switch 'W' '=' = '\x20A9' -- WON SIGN
+switch 'E' 'u' = '\x20AC' -- EURO SIGN
+switch 'o' 'C' = '\x2103' -- DEGREE CELSIUS
+switch 'c' 'o' = '\x2105' -- CARE OF
+switch 'o' 'F' = '\x2109' -- DEGREE FAHRENHEIT
+switch 'N' '0' = '\x2116' -- NUMERO SIGN
+switch 'P' 'O' = '\x2117' -- SOUND RECORDING COPYRIGHT
+switch 'R' 'x' = '\x211E' -- PRESCRIPTION TAKE
+switch 'S' 'M' = '\x2120' -- SERVICE MARK
+switch 'T' 'M' = '\x2122' -- TRADE MARK SIGN
+switch 'O' 'm' = '\x2126' -- OHM SIGN
+switch 'A' 'O' = '\x212B' -- ANGSTROM SIGN
+switch '1' '3' = '\x2153' -- VULGAR FRACTION ONE THIRD
+switch '2' '3' = '\x2154' -- VULGAR FRACTION TWO THIRDS
+switch '1' '5' = '\x2155' -- VULGAR FRACTION ONE FIFTH
+switch '2' '5' = '\x2156' -- VULGAR FRACTION TWO FIFTHS
+switch '3' '5' = '\x2157' -- VULGAR FRACTION THREE FIFTHS
+switch '4' '5' = '\x2158' -- VULGAR FRACTION FOUR FIFTHS
+switch '1' '6' = '\x2159' -- VULGAR FRACTION ONE SIXTH
+switch '5' '6' = '\x215A' -- VULGAR FRACTION FIVE SIXTHS
+switch '1' '8' = '\x215B' -- VULGAR FRACTION ONE EIGHTH
+switch '3' '8' = '\x215C' -- VULGAR FRACTION THREE EIGHTHS
+switch '5' '8' = '\x215D' -- VULGAR FRACTION FIVE EIGHTHS
+switch '7' '8' = '\x215E' -- VULGAR FRACTION SEVEN EIGHTHS
+switch '1' 'R' = '\x2160' -- ROMAN NUMERAL ONE
+switch '2' 'R' = '\x2161' -- ROMAN NUMERAL TWO
+switch '3' 'R' = '\x2162' -- ROMAN NUMERAL THREE
+switch '4' 'R' = '\x2163' -- ROMAN NUMERAL FOUR
+switch '5' 'R' = '\x2164' -- ROMAN NUMERAL FIVE
+switch '6' 'R' = '\x2165' -- ROMAN NUMERAL SIX
+switch '7' 'R' = '\x2166' -- ROMAN NUMERAL SEVEN
+switch '8' 'R' = '\x2167' -- ROMAN NUMERAL EIGHT
+switch '9' 'R' = '\x2168' -- ROMAN NUMERAL NINE
+switch 'a' 'R' = '\x2169' -- ROMAN NUMERAL TEN
+switch 'b' 'R' = '\x216A' -- ROMAN NUMERAL ELEVEN
+switch 'c' 'R' = '\x216B' -- ROMAN NUMERAL TWELVE
+switch '1' 'r' = '\x2170' -- SMALL ROMAN NUMERAL ONE
+switch '2' 'r' = '\x2171' -- SMALL ROMAN NUMERAL TWO
+switch '3' 'r' = '\x2172' -- SMALL ROMAN NUMERAL THREE
+switch '4' 'r' = '\x2173' -- SMALL ROMAN NUMERAL FOUR
+switch '5' 'r' = '\x2174' -- SMALL ROMAN NUMERAL FIVE
+switch '6' 'r' = '\x2175' -- SMALL ROMAN NUMERAL SIX
+switch '7' 'r' = '\x2176' -- SMALL ROMAN NUMERAL SEVEN
+switch '8' 'r' = '\x2177' -- SMALL ROMAN NUMERAL EIGHT
+switch '9' 'r' = '\x2178' -- SMALL ROMAN NUMERAL NINE
+switch 'a' 'r' = '\x2179' -- SMALL ROMAN NUMERAL TEN
+switch 'b' 'r' = '\x217A' -- SMALL ROMAN NUMERAL ELEVEN
+switch 'c' 'r' = '\x217B' -- SMALL ROMAN NUMERAL TWELVE
+switch '<' '-' = '\x2190' -- LEFTWARDS ARROW
+switch '-' '!' = '\x2191' -- UPWARDS ARROW
+switch '-' '>' = '\x2192' -- RIGHTWARDS ARROW
+switch '-' 'v' = '\x2193' -- DOWNWARDS ARROW
+switch '<' '>' = '\x2194' -- LEFT RIGHT ARROW
+switch 'U' 'D' = '\x2195' -- UP DOWN ARROW
+switch '<' '=' = '\x21D0' -- LEFTWARDS DOUBLE ARROW
+switch '=' '>' = '\x21D2' -- RIGHTWARDS DOUBLE ARROW
+switch '=' '=' = '\x21D4' -- LEFT RIGHT DOUBLE ARROW
+switch 'F' 'A' = '\x2200' -- FOR ALL
+switch 'd' 'P' = '\x2202' -- PARTIAL DIFFERENTIAL
+switch 'T' 'E' = '\x2203' -- THERE EXISTS
+switch '/' '0' = '\x2205' -- EMPTY SET
+switch 'D' 'E' = '\x2206' -- INCREMENT
+switch 'N' 'B' = '\x2207' -- NABLA
+switch '(' '-' = '\x2208' -- ELEMENT OF
+switch '-' ')' = '\x220B' -- CONTAINS AS MEMBER
+switch '*' 'P' = '\x220F' -- N-ARY PRODUCT `
+switch '+' 'Z' = '\x2211' -- N-ARY SUMMATION `
+switch '-' '2' = '\x2212' -- MINUS SIGN
+switch '-' '+' = '\x2213' -- MINUS-OR-PLUS SIGN
+switch '*' '-' = '\x2217' -- ASTERISK OPERATOR
+switch 'O' 'b' = '\x2218' -- RING OPERATOR
+switch 'S' 'b' = '\x2219' -- BULLET OPERATOR
+switch 'R' 'T' = '\x221A' -- SQUARE ROOT
+switch '0' '(' = '\x221D' -- PROPORTIONAL TO
+switch '0' '0' = '\x221E' -- INFINITY
+switch '-' 'L' = '\x221F' -- RIGHT ANGLE
+switch '-' 'V' = '\x2220' -- ANGLE
+switch 'P' 'P' = '\x2225' -- PARALLEL TO
+switch 'A' 'N' = '\x2227' -- LOGICAL AND
+switch 'O' 'R' = '\x2228' -- LOGICAL OR
+switch '(' 'U' = '\x2229' -- INTERSECTION
+switch ')' 'U' = '\x222A' -- UNION
+switch 'I' 'n' = '\x222B' -- INTEGRAL
+switch 'D' 'I' = '\x222C' -- DOUBLE INTEGRAL
+switch 'I' 'o' = '\x222E' -- CONTOUR INTEGRAL
+switch '.' ':' = '\x2234' -- THEREFORE
+switch ':' '.' = '\x2235' -- BECAUSE
+switch ':' 'R' = '\x2236' -- RATIO
+switch ':' ':' = '\x2237' -- PROPORTION
+switch '?' '1' = '\x223C' -- TILDE OPERATOR
+switch 'C' 'G' = '\x223E' -- INVERTED LAZY S
+switch '?' '-' = '\x2243' -- ASYMPTOTICALLY EQUAL TO
+switch '?' '=' = '\x2245' -- APPROXIMATELY EQUAL TO
+switch '?' '2' = '\x2248' -- ALMOST EQUAL TO
+switch '=' '?' = '\x224C' -- ALL EQUAL TO
+switch 'H' 'I' = '\x2253' -- IMAGE OF OR APPROXIMATELY EQUAL TO
+switch '!' '=' = '\x2260' -- NOT EQUAL TO
+switch '=' '3' = '\x2261' -- IDENTICAL TO
+switch '=' '<' = '\x2264' -- LESS-THAN OR EQUAL TO
+switch '>' '=' = '\x2265' -- GREATER-THAN OR EQUAL TO
+switch '<' '*' = '\x226A' -- MUCH LESS-THAN
+switch '*' '>' = '\x226B' -- MUCH GREATER-THAN
+switch '!' '<' = '\x226E' -- NOT LESS-THAN
+switch '!' '>' = '\x226F' -- NOT GREATER-THAN
+switch '(' 'C' = '\x2282' -- SUBSET OF
+switch ')' 'C' = '\x2283' -- SUPERSET OF
+switch '(' '_' = '\x2286' -- SUBSET OF OR EQUAL TO
+switch ')' '_' = '\x2287' -- SUPERSET OF OR EQUAL TO
+switch '0' '.' = '\x2299' -- CIRCLED DOT OPERATOR
+switch '0' '2' = '\x229A' -- CIRCLED RING OPERATOR
+switch '-' 'T' = '\x22A5' -- UP TACK
+switch '.' 'P' = '\x22C5' -- DOT OPERATOR
+switch ':' '3' = '\x22EE' -- VERTICAL ELLIPSIS
+switch '.' '3' = '\x22EF' -- MIDLINE HORIZONTAL ELLIPSIS
+switch 'E' 'h' = '\x2302' -- HOUSE
+switch '<' '7' = '\x2308' -- LEFT CEILING
+switch '>' '7' = '\x2309' -- RIGHT CEILING
+switch '7' '<' = '\x230A' -- LEFT FLOOR
+switch '7' '>' = '\x230B' -- RIGHT FLOOR
+switch 'N' 'I' = '\x2310' -- REVERSED NOT SIGN
+switch '(' 'A' = '\x2312' -- ARC
+switch 'T' 'R' = '\x2315' -- TELEPHONE RECORDER
+switch 'I' 'u' = '\x2320' -- TOP HALF INTEGRAL
+switch 'I' 'l' = '\x2321' -- BOTTOM HALF INTEGRAL
+switch '<' '/' = '\x2329' -- LEFT-POINTING ANGLE BRACKET
+switch '/' '>' = '\x232A' -- RIGHT-POINTING ANGLE BRACKET
+switch 'V' 's' = '\x2423' -- OPEN BOX
+switch '1' 'h' = '\x2440' -- OCR HOOK
+switch '3' 'h' = '\x2441' -- OCR CHAIR
+switch '2' 'h' = '\x2442' -- OCR FORK
+switch '4' 'h' = '\x2443' -- OCR INVERTED FORK
+switch '1' 'j' = '\x2446' -- OCR BRANCH BANK IDENTIFICATION
+switch '2' 'j' = '\x2447' -- OCR AMOUNT OF CHECK
+switch '3' 'j' = '\x2448' -- OCR DASH
+switch '4' 'j' = '\x2449' -- OCR CUSTOMER ACCOUNT NUMBER
+switch '1' '.' = '\x2488' -- DIGIT ONE FULL STOP
+switch '2' '.' = '\x2489' -- DIGIT TWO FULL STOP
+switch '3' '.' = '\x248A' -- DIGIT THREE FULL STOP
+switch '4' '.' = '\x248B' -- DIGIT FOUR FULL STOP
+switch '5' '.' = '\x248C' -- DIGIT FIVE FULL STOP
+switch '6' '.' = '\x248D' -- DIGIT SIX FULL STOP
+switch '7' '.' = '\x248E' -- DIGIT SEVEN FULL STOP
+switch '8' '.' = '\x248F' -- DIGIT EIGHT FULL STOP
+switch '9' '.' = '\x2490' -- DIGIT NINE FULL STOP
+switch 'h' 'h' = '\x2500' -- BOX DRAWINGS LIGHT HORIZONTAL
+switch 'H' 'H' = '\x2501' -- BOX DRAWINGS HEAVY HORIZONTAL
+switch 'v' 'v' = '\x2502' -- BOX DRAWINGS LIGHT VERTICAL
+switch 'V' 'V' = '\x2503' -- BOX DRAWINGS HEAVY VERTICAL
+switch '3' '-' = '\x2504' -- BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+switch '3' '_' = '\x2505' -- BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+switch '3' '!' = '\x2506' -- BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+switch '3' '/' = '\x2507' -- BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+switch '4' '-' = '\x2508' -- BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+switch '4' '_' = '\x2509' -- BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+switch '4' '!' = '\x250A' -- BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+switch '4' '/' = '\x250B' -- BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+switch 'd' 'r' = '\x250C' -- BOX DRAWINGS LIGHT DOWN AND RIGHT
+switch 'd' 'R' = '\x250D' -- BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+switch 'D' 'r' = '\x250E' -- BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+switch 'D' 'R' = '\x250F' -- BOX DRAWINGS HEAVY DOWN AND RIGHT
+switch 'd' 'l' = '\x2510' -- BOX DRAWINGS LIGHT DOWN AND LEFT
+switch 'd' 'L' = '\x2511' -- BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+switch 'D' 'l' = '\x2512' -- BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+switch 'L' 'D' = '\x2513' -- BOX DRAWINGS HEAVY DOWN AND LEFT
+switch 'u' 'r' = '\x2514' -- BOX DRAWINGS LIGHT UP AND RIGHT
+switch 'u' 'R' = '\x2515' -- BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+switch 'U' 'r' = '\x2516' -- BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+switch 'U' 'R' = '\x2517' -- BOX DRAWINGS HEAVY UP AND RIGHT
+switch 'u' 'l' = '\x2518' -- BOX VOICED SOUND MARKDRAWINGS LIGHT UP AND LEFT
+switch 'u' 'L' = '\x2519' -- BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+switch 'U' 'l' = '\x251A' -- BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+switch 'U' 'L' = '\x251B' -- BOX DRAWINGS HEAVY UP AND LEFT
+switch 'v' 'r' = '\x251C' -- BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+switch 'v' 'R' = '\x251D' -- BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+switch 'V' 'r' = '\x2520' -- BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+switch 'V' 'R' = '\x2523' -- BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+switch 'v' 'l' = '\x2524' -- BOX DRAWINGS LIGHT VERTICAL AND LEFT
+switch 'v' 'L' = '\x2525' -- BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+switch 'V' 'l' = '\x2528' -- BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+switch 'V' 'L' = '\x252B' -- BOX DRAWINGS HEAVY VERTICAL AND LEFT
+switch 'd' 'h' = '\x252C' -- BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+switch 'd' 'H' = '\x252F' -- BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+switch 'D' 'h' = '\x2530' -- BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+switch 'D' 'H' = '\x2533' -- BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+switch 'u' 'h' = '\x2534' -- BOX DRAWINGS LIGHT UP AND HORIZONTAL
+switch 'u' 'H' = '\x2537' -- BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+switch 'U' 'h' = '\x2538' -- BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+switch 'U' 'H' = '\x253B' -- BOX DRAWINGS HEAVY UP AND HORIZONTAL
+switch 'v' 'h' = '\x253C' -- BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+switch 'v' 'H' = '\x253F' -- BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+switch 'V' 'h' = '\x2542' -- BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+switch 'V' 'H' = '\x254B' -- BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+switch 'F' 'D' = '\x2571' -- BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+switch 'B' 'D' = '\x2572' -- BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+switch 'T' 'B' = '\x2580' -- UPPER HALF BLOCK
+switch 'L' 'B' = '\x2584' -- LOWER HALF BLOCK
+switch 'F' 'B' = '\x2588' -- FULL BLOCK
+switch 'l' 'B' = '\x258C' -- LEFT HALF BLOCK
+switch 'R' 'B' = '\x2590' -- RIGHT HALF BLOCK
+switch '.' 'S' = '\x2591' -- LIGHT SHADE
+switch ':' 'S' = '\x2592' -- MEDIUM SHADE
+switch '?' 'S' = '\x2593' -- DARK SHADE
+switch 'f' 'S' = '\x25A0' -- BLACK SQUARE
+switch 'O' 'S' = '\x25A1' -- WHITE SQUARE
+switch 'R' 'O' = '\x25A2' -- WHITE SQUARE WITH ROUNDED CORNERS
+switch 'R' 'r' = '\x25A3' -- WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+switch 'R' 'F' = '\x25A4' -- SQUARE WITH HORIZONTAL FILL
+switch 'R' 'Y' = '\x25A5' -- SQUARE WITH VERTICAL FILL
+switch 'R' 'H' = '\x25A6' -- SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+switch 'R' 'Z' = '\x25A7' -- SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+switch 'R' 'K' = '\x25A8' -- SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+switch 'R' 'X' = '\x25A9' -- SQUARE WITH DIAGONAL CROSSHATCH FILL
+switch 's' 'B' = '\x25AA' -- BLACK SMALL SQUARE
+switch 'S' 'R' = '\x25AC' -- BLACK RECTANGLE
+switch 'O' 'r' = '\x25AD' -- WHITE RECTANGLE
+switch 'U' 'T' = '\x25B2' -- BLACK UP-POINTING TRIANGLE
+switch 'u' 'T' = '\x25B3' -- WHITE UP-POINTING TRIANGLE
+switch 'P' 'R' = '\x25B6' -- BLACK RIGHT-POINTING TRIANGLE
+switch 'T' 'r' = '\x25B7' -- WHITE RIGHT-POINTING TRIANGLE
+switch 'D' 't' = '\x25BC' -- BLACK DOWN-POINTING TRIANGLE
+switch 'd' 'T' = '\x25BD' -- WHITE DOWN-POINTING TRIANGLE
+switch 'P' 'L' = '\x25C0' -- BLACK LEFT-POINTING TRIANGLE
+switch 'T' 'l' = '\x25C1' -- WHITE LEFT-POINTING TRIANGLE
+switch 'D' 'b' = '\x25C6' -- BLACK DIAMOND
+switch 'D' 'w' = '\x25C7' -- WHITE DIAMOND
+switch 'L' 'Z' = '\x25CA' -- LOZENGE
+switch '0' 'm' = '\x25CB' -- WHITE CIRCLE
+switch '0' 'o' = '\x25CE' -- BULLSEYE
+switch '0' 'M' = '\x25CF' -- BLACK CIRCLE
+switch '0' 'L' = '\x25D0' -- CIRCLE WITH LEFT HALF BLACK
+switch '0' 'R' = '\x25D1' -- CIRCLE WITH RIGHT HALF BLACK
+switch 'S' 'n' = '\x25D8' -- INVERSE BULLET
+switch 'I' 'c' = '\x25D9' -- INVERSE WHITE CIRCLE
+switch 'F' 'd' = '\x25E2' -- BLACK LOWER RIGHT TRIANGLE
+switch 'B' 'd' = '\x25E3' -- BLACK LOWER LEFT TRIANGLE
+switch '*' '2' = '\x2605' -- BLACK STAR
+switch '*' '1' = '\x2606' -- WHITE STAR
+switch '<' 'H' = '\x261C' -- WHITE LEFT POINTING INDEX
+switch '>' 'H' = '\x261E' -- WHITE RIGHT POINTING INDEX
+switch '0' 'u' = '\x263A' -- WHITE SMILING FACE
+switch '0' 'U' = '\x263B' -- BLACK SMILING FACE
+switch 'S' 'U' = '\x263C' -- WHITE SUN WITH RAYS
+switch 'F' 'm' = '\x2640' -- FEMALE SIGN
+switch 'M' 'l' = '\x2642' -- MALE SIGN
+switch 'c' 'S' = '\x2660' -- BLACK SPADE SUIT
+switch 'c' 'H' = '\x2661' -- WHITE HEART SUIT
+switch 'c' 'D' = '\x2662' -- WHITE DIAMOND SUIT
+switch 'c' 'C' = '\x2663' -- BLACK CLUB SUIT
+switch 'M' 'd' = '\x2669' -- QUARTER NOTE `
+switch 'M' '8' = '\x266A' -- EIGHTH NOTE `
+switch 'M' '2' = '\x266B' -- BEAMED EIGHTH NOTES
+switch 'M' 'b' = '\x266D' -- MUSIC FLAT SIGN
+switch 'M' 'x' = '\x266E' -- MUSIC NATURAL SIGN
+switch 'M' 'X' = '\x266F' -- MUSIC SHARP SIGN
+switch 'O' 'K' = '\x2713' -- CHECK MARK
+switch 'X' 'X' = '\x2717' -- BALLOT X
+switch '-' 'X' = '\x2720' -- MALTESE CROSS
+switch 'I' 'S' = '\x3000' -- IDEOGRAPHIC SPACE
+switch ',' '_' = '\x3001' -- IDEOGRAPHIC COMMA
+switch '.' '_' = '\x3002' -- IDEOGRAPHIC FULL STOP
+switch '+' '"' = '\x3003' -- DITTO MARK
+switch '+' '_' = '\x3004' -- JAPANESE INDUSTRIAL STANDARD SYMBOL
+switch '*' '_' = '\x3005' -- IDEOGRAPHIC ITERATION MARK
+switch ';' '_' = '\x3006' -- IDEOGRAPHIC CLOSING MARK
+switch '0' '_' = '\x3007' -- IDEOGRAPHIC NUMBER ZERO
+switch '<' '+' = '\x300A' -- LEFT DOUBLE ANGLE BRACKET
+switch '>' '+' = '\x300B' -- RIGHT DOUBLE ANGLE BRACKET
+switch '<' '\'' = '\x300C' -- LEFT CORNER BRACKET
+switch '>' '\'' = '\x300D' -- RIGHT CORNER BRACKET
+switch '<' '"' = '\x300E' -- LEFT WHITE CORNER BRACKET
+switch '>' '"' = '\x300F' -- RIGHT WHITE CORNER BRACKET
+switch '(' '"' = '\x3010' -- LEFT BLACK LENTICULAR BRACKET
+switch ')' '"' = '\x3011' -- RIGHT BLACK LENTICULAR BRACKET
+switch '=' 'T' = '\x3012' -- POSTAL MARK
+switch '=' '_' = '\x3013' -- GETA MARK
+switch '(' '\'' = '\x3014' -- LEFT TORTOISE SHELL BRACKET
+switch ')' '\'' = '\x3015' -- RIGHT TORTOISE SHELL BRACKET
+switch '(' 'I' = '\x3016' -- LEFT WHITE LENTICULAR BRACKET
+switch ')' 'I' = '\x3017' -- RIGHT WHITE LENTICULAR BRACKET
+switch '-' '?' = '\x301C' -- WAVE DASH
+switch 'A' '5' = '\x3041' -- HIRAGANA LETTER SMALL A
+switch 'a' '5' = '\x3042' -- HIRAGANA LETTER A
+switch 'I' '5' = '\x3043' -- HIRAGANA LETTER SMALL I
+switch 'i' '5' = '\x3044' -- HIRAGANA LETTER I
+switch 'U' '5' = '\x3045' -- HIRAGANA LETTER SMALL U
+switch 'u' '5' = '\x3046' -- HIRAGANA LETTER U
+switch 'E' '5' = '\x3047' -- HIRAGANA LETTER SMALL E
+switch 'e' '5' = '\x3048' -- HIRAGANA LETTER E
+switch 'O' '5' = '\x3049' -- HIRAGANA LETTER SMALL O
+switch 'o' '5' = '\x304A' -- HIRAGANA LETTER O
+switch 'k' 'a' = '\x304B' -- HIRAGANA LETTER KA
+switch 'g' 'a' = '\x304C' -- HIRAGANA LETTER GA
+switch 'k' 'i' = '\x304D' -- HIRAGANA LETTER KI
+switch 'g' 'i' = '\x304E' -- HIRAGANA LETTER GI
+switch 'k' 'u' = '\x304F' -- HIRAGANA LETTER KU
+switch 'g' 'u' = '\x3050' -- HIRAGANA LETTER GU
+switch 'k' 'e' = '\x3051' -- HIRAGANA LETTER KE
+switch 'g' 'e' = '\x3052' -- HIRAGANA LETTER GE
+switch 'k' 'o' = '\x3053' -- HIRAGANA LETTER KO
+switch 'g' 'o' = '\x3054' -- HIRAGANA LETTER GO
+switch 's' 'a' = '\x3055' -- HIRAGANA LETTER SA
+switch 'z' 'a' = '\x3056' -- HIRAGANA LETTER ZA
+switch 's' 'i' = '\x3057' -- HIRAGANA LETTER SI
+switch 'z' 'i' = '\x3058' -- HIRAGANA LETTER ZI
+switch 's' 'u' = '\x3059' -- HIRAGANA LETTER SU
+switch 'z' 'u' = '\x305A' -- HIRAGANA LETTER ZU
+switch 's' 'e' = '\x305B' -- HIRAGANA LETTER SE
+switch 'z' 'e' = '\x305C' -- HIRAGANA LETTER ZE
+switch 's' 'o' = '\x305D' -- HIRAGANA LETTER SO
+switch 'z' 'o' = '\x305E' -- HIRAGANA LETTER ZO
+switch 't' 'a' = '\x305F' -- HIRAGANA LETTER TA
+switch 'd' 'a' = '\x3060' -- HIRAGANA LETTER DA
+switch 't' 'i' = '\x3061' -- HIRAGANA LETTER TI
+switch 'd' 'i' = '\x3062' -- HIRAGANA LETTER DI
+switch 't' 'U' = '\x3063' -- HIRAGANA LETTER SMALL TU
+switch 't' 'u' = '\x3064' -- HIRAGANA LETTER TU
+switch 'd' 'u' = '\x3065' -- HIRAGANA LETTER DU
+switch 't' 'e' = '\x3066' -- HIRAGANA LETTER TE
+switch 'd' 'e' = '\x3067' -- HIRAGANA LETTER DE
+switch 't' 'o' = '\x3068' -- HIRAGANA LETTER TO
+switch 'd' 'o' = '\x3069' -- HIRAGANA LETTER DO
+switch 'n' 'a' = '\x306A' -- HIRAGANA LETTER NA
+switch 'n' 'i' = '\x306B' -- HIRAGANA LETTER NI
+switch 'n' 'u' = '\x306C' -- HIRAGANA LETTER NU
+switch 'n' 'e' = '\x306D' -- HIRAGANA LETTER NE
+switch 'n' 'o' = '\x306E' -- HIRAGANA LETTER NO
+switch 'h' 'a' = '\x306F' -- HIRAGANA LETTER HA
+switch 'b' 'a' = '\x3070' -- HIRAGANA LETTER BA
+switch 'p' 'a' = '\x3071' -- HIRAGANA LETTER PA
+switch 'h' 'i' = '\x3072' -- HIRAGANA LETTER HI
+switch 'b' 'i' = '\x3073' -- HIRAGANA LETTER BI
+switch 'p' 'i' = '\x3074' -- HIRAGANA LETTER PI
+switch 'h' 'u' = '\x3075' -- HIRAGANA LETTER HU
+switch 'b' 'u' = '\x3076' -- HIRAGANA LETTER BU
+switch 'p' 'u' = '\x3077' -- HIRAGANA LETTER PU
+switch 'h' 'e' = '\x3078' -- HIRAGANA LETTER HE
+switch 'b' 'e' = '\x3079' -- HIRAGANA LETTER BE
+switch 'p' 'e' = '\x307A' -- HIRAGANA LETTER PE
+switch 'h' 'o' = '\x307B' -- HIRAGANA LETTER HO
+switch 'b' 'o' = '\x307C' -- HIRAGANA LETTER BO
+switch 'p' 'o' = '\x307D' -- HIRAGANA LETTER PO
+switch 'm' 'a' = '\x307E' -- HIRAGANA LETTER MA
+switch 'm' 'i' = '\x307F' -- HIRAGANA LETTER MI
+switch 'm' 'u' = '\x3080' -- HIRAGANA LETTER MU
+switch 'm' 'e' = '\x3081' -- HIRAGANA LETTER ME
+switch 'm' 'o' = '\x3082' -- HIRAGANA LETTER MO
+switch 'y' 'A' = '\x3083' -- HIRAGANA LETTER SMALL YA
+switch 'y' 'a' = '\x3084' -- HIRAGANA LETTER YA
+switch 'y' 'U' = '\x3085' -- HIRAGANA LETTER SMALL YU
+switch 'y' 'u' = '\x3086' -- HIRAGANA LETTER YU
+switch 'y' 'O' = '\x3087' -- HIRAGANA LETTER SMALL YO
+switch 'y' 'o' = '\x3088' -- HIRAGANA LETTER YO
+switch 'r' 'a' = '\x3089' -- HIRAGANA LETTER RA
+switch 'r' 'i' = '\x308A' -- HIRAGANA LETTER RI
+switch 'r' 'u' = '\x308B' -- HIRAGANA LETTER RU
+switch 'r' 'e' = '\x308C' -- HIRAGANA LETTER RE
+switch 'r' 'o' = '\x308D' -- HIRAGANA LETTER RO
+switch 'w' 'A' = '\x308E' -- HIRAGANA LETTER SMALL WA
+switch 'w' 'a' = '\x308F' -- HIRAGANA LETTER WA
+switch 'w' 'i' = '\x3090' -- HIRAGANA LETTER WI
+switch 'w' 'e' = '\x3091' -- HIRAGANA LETTER WE
+switch 'w' 'o' = '\x3092' -- HIRAGANA LETTER WO
+switch 'n' '5' = '\x3093' -- HIRAGANA LETTER N `
+switch 'v' 'u' = '\x3094' -- HIRAGANA LETTER VU
+switch '"' '5' = '\x309B' -- KATAKANA-HIRAGANA VOICED SOUND MARK
+switch '0' '5' = '\x309C' -- KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+switch '*' '5' = '\x309D' -- HIRAGANA ITERATION MARK
+switch '+' '5' = '\x309E' -- HIRAGANA VOICED ITERATION MARK
+switch 'a' '6' = '\x30A1' -- KATAKANA LETTER SMALL A
+switch 'A' '6' = '\x30A2' -- KATAKANA LETTER A
+switch 'i' '6' = '\x30A3' -- KATAKANA LETTER SMALL I
+switch 'I' '6' = '\x30A4' -- KATAKANA LETTER I
+switch 'u' '6' = '\x30A5' -- KATAKANA LETTER SMALL U
+switch 'U' '6' = '\x30A6' -- KATAKANA LETTER U
+switch 'e' '6' = '\x30A7' -- KATAKANA LETTER SMALL E
+switch 'E' '6' = '\x30A8' -- KATAKANA LETTER E
+switch 'o' '6' = '\x30A9' -- KATAKANA LETTER SMALL O
+switch 'O' '6' = '\x30AA' -- KATAKANA LETTER O
+switch 'K' 'a' = '\x30AB' -- KATAKANA LETTER KA
+switch 'G' 'a' = '\x30AC' -- KATAKANA LETTER GA
+switch 'K' 'i' = '\x30AD' -- KATAKANA LETTER KI
+switch 'G' 'i' = '\x30AE' -- KATAKANA LETTER GI
+switch 'K' 'u' = '\x30AF' -- KATAKANA LETTER KU
+switch 'G' 'u' = '\x30B0' -- KATAKANA LETTER GU
+switch 'K' 'e' = '\x30B1' -- KATAKANA LETTER KE
+switch 'G' 'e' = '\x30B2' -- KATAKANA LETTER GE
+switch 'K' 'o' = '\x30B3' -- KATAKANA LETTER KO
+switch 'G' 'o' = '\x30B4' -- KATAKANA LETTER GO
+switch 'S' 'a' = '\x30B5' -- KATAKANA LETTER SA
+switch 'Z' 'a' = '\x30B6' -- KATAKANA LETTER ZA
+switch 'S' 'i' = '\x30B7' -- KATAKANA LETTER SI
+switch 'Z' 'i' = '\x30B8' -- KATAKANA LETTER ZI
+switch 'S' 'u' = '\x30B9' -- KATAKANA LETTER SU
+switch 'Z' 'u' = '\x30BA' -- KATAKANA LETTER ZU
+switch 'S' 'e' = '\x30BB' -- KATAKANA LETTER SE
+switch 'Z' 'e' = '\x30BC' -- KATAKANA LETTER ZE
+switch 'S' 'o' = '\x30BD' -- KATAKANA LETTER SO
+switch 'Z' 'o' = '\x30BE' -- KATAKANA LETTER ZO
+switch 'T' 'a' = '\x30BF' -- KATAKANA LETTER TA
+switch 'D' 'a' = '\x30C0' -- KATAKANA LETTER DA
+switch 'T' 'i' = '\x30C1' -- KATAKANA LETTER TI
+switch 'D' 'i' = '\x30C2' -- KATAKANA LETTER DI
+switch 'T' 'U' = '\x30C3' -- KATAKANA LETTER SMALL TU
+switch 'T' 'u' = '\x30C4' -- KATAKANA LETTER TU
+switch 'D' 'u' = '\x30C5' -- KATAKANA LETTER DU
+switch 'T' 'e' = '\x30C6' -- KATAKANA LETTER TE
+switch 'D' 'e' = '\x30C7' -- KATAKANA LETTER DE
+switch 'T' 'o' = '\x30C8' -- KATAKANA LETTER TO
+switch 'D' 'o' = '\x30C9' -- KATAKANA LETTER DO
+switch 'N' 'a' = '\x30CA' -- KATAKANA LETTER NA
+switch 'N' 'i' = '\x30CB' -- KATAKANA LETTER NI
+switch 'N' 'u' = '\x30CC' -- KATAKANA LETTER NU
+switch 'N' 'e' = '\x30CD' -- KATAKANA LETTER NE
+switch 'N' 'o' = '\x30CE' -- KATAKANA LETTER NO
+switch 'H' 'a' = '\x30CF' -- KATAKANA LETTER HA
+switch 'B' 'a' = '\x30D0' -- KATAKANA LETTER BA
+switch 'P' 'a' = '\x30D1' -- KATAKANA LETTER PA
+switch 'H' 'i' = '\x30D2' -- KATAKANA LETTER HI
+switch 'B' 'i' = '\x30D3' -- KATAKANA LETTER BI
+switch 'P' 'i' = '\x30D4' -- KATAKANA LETTER PI
+switch 'H' 'u' = '\x30D5' -- KATAKANA LETTER HU
+switch 'B' 'u' = '\x30D6' -- KATAKANA LETTER BU
+switch 'P' 'u' = '\x30D7' -- KATAKANA LETTER PU
+switch 'H' 'e' = '\x30D8' -- KATAKANA LETTER HE
+switch 'B' 'e' = '\x30D9' -- KATAKANA LETTER BE
+switch 'P' 'e' = '\x30DA' -- KATAKANA LETTER PE
+switch 'H' 'o' = '\x30DB' -- KATAKANA LETTER HO
+switch 'B' 'o' = '\x30DC' -- KATAKANA LETTER BO
+switch 'P' 'o' = '\x30DD' -- KATAKANA LETTER PO
+switch 'M' 'a' = '\x30DE' -- KATAKANA LETTER MA
+switch 'M' 'i' = '\x30DF' -- KATAKANA LETTER MI
+switch 'M' 'u' = '\x30E0' -- KATAKANA LETTER MU
+switch 'M' 'e' = '\x30E1' -- KATAKANA LETTER ME
+switch 'M' 'o' = '\x30E2' -- KATAKANA LETTER MO
+switch 'Y' 'A' = '\x30E3' -- KATAKANA LETTER SMALL YA
+switch 'Y' 'a' = '\x30E4' -- KATAKANA LETTER YA
+switch 'Y' 'U' = '\x30E5' -- KATAKANA LETTER SMALL YU
+switch 'Y' 'u' = '\x30E6' -- KATAKANA LETTER YU
+switch 'Y' 'O' = '\x30E7' -- KATAKANA LETTER SMALL YO
+switch 'Y' 'o' = '\x30E8' -- KATAKANA LETTER YO
+switch 'R' 'a' = '\x30E9' -- KATAKANA LETTER RA
+switch 'R' 'i' = '\x30EA' -- KATAKANA LETTER RI
+switch 'R' 'u' = '\x30EB' -- KATAKANA LETTER RU
+switch 'R' 'e' = '\x30EC' -- KATAKANA LETTER RE
+switch 'R' 'o' = '\x30ED' -- KATAKANA LETTER RO
+switch 'W' 'A' = '\x30EE' -- KATAKANA LETTER SMALL WA
+switch 'W' 'a' = '\x30EF' -- KATAKANA LETTER WA
+switch 'W' 'i' = '\x30F0' -- KATAKANA LETTER WI
+switch 'W' 'e' = '\x30F1' -- KATAKANA LETTER WE
+switch 'W' 'o' = '\x30F2' -- KATAKANA LETTER WO
+switch 'N' '6' = '\x30F3' -- KATAKANA LETTER N `
+switch 'V' 'u' = '\x30F4' -- KATAKANA LETTER VU
+switch 'K' 'A' = '\x30F5' -- KATAKANA LETTER SMALL KA
+switch 'K' 'E' = '\x30F6' -- KATAKANA LETTER SMALL KE
+switch 'V' 'a' = '\x30F7' -- KATAKANA LETTER VA
+switch 'V' 'i' = '\x30F8' -- KATAKANA LETTER VI
+switch 'V' 'e' = '\x30F9' -- KATAKANA LETTER VE
+switch 'V' 'o' = '\x30FA' -- KATAKANA LETTER VO
+switch '.' '6' = '\x30FB' -- KATAKANA MIDDLE DOT
+switch '-' '6' = '\x30FC' -- KATAKANA-HIRAGANA PROLONGED SOUND MARK
+switch '*' '6' = '\x30FD' -- KATAKANA ITERATION MARK
+switch '+' '6' = '\x30FE' -- KATAKANA VOICED ITERATION MARK
+switch 'b' '4' = '\x3105' -- BOPOMOFO LETTER B
+switch 'p' '4' = '\x3106' -- BOPOMOFO LETTER P
+switch 'm' '4' = '\x3107' -- BOPOMOFO LETTER M
+switch 'f' '4' = '\x3108' -- BOPOMOFO LETTER F
+switch 'd' '4' = '\x3109' -- BOPOMOFO LETTER D
+switch 't' '4' = '\x310A' -- BOPOMOFO LETTER T
+switch 'n' '4' = '\x310B' -- BOPOMOFO LETTER N `
+switch 'l' '4' = '\x310C' -- BOPOMOFO LETTER L
+switch 'g' '4' = '\x310D' -- BOPOMOFO LETTER G
+switch 'k' '4' = '\x310E' -- BOPOMOFO LETTER K
+switch 'h' '4' = '\x310F' -- BOPOMOFO LETTER H
+switch 'j' '4' = '\x3110' -- BOPOMOFO LETTER J
+switch 'q' '4' = '\x3111' -- BOPOMOFO LETTER Q
+switch 'x' '4' = '\x3112' -- BOPOMOFO LETTER X
+switch 'z' 'h' = '\x3113' -- BOPOMOFO LETTER ZH
+switch 'c' 'h' = '\x3114' -- BOPOMOFO LETTER CH
+switch 's' 'h' = '\x3115' -- BOPOMOFO LETTER SH
+switch 'r' '4' = '\x3116' -- BOPOMOFO LETTER R
+switch 'z' '4' = '\x3117' -- BOPOMOFO LETTER Z
+switch 'c' '4' = '\x3118' -- BOPOMOFO LETTER C
+switch 's' '4' = '\x3119' -- BOPOMOFO LETTER S
+switch 'a' '4' = '\x311A' -- BOPOMOFO LETTER A
+switch 'o' '4' = '\x311B' -- BOPOMOFO LETTER O
+switch 'e' '4' = '\x311C' -- BOPOMOFO LETTER E
+switch 'a' 'i' = '\x311E' -- BOPOMOFO LETTER AI
+switch 'e' 'i' = '\x311F' -- BOPOMOFO LETTER EI
+switch 'a' 'u' = '\x3120' -- BOPOMOFO LETTER AU
+switch 'o' 'u' = '\x3121' -- BOPOMOFO LETTER OU
+switch 'a' 'n' = '\x3122' -- BOPOMOFO LETTER AN
+switch 'e' 'n' = '\x3123' -- BOPOMOFO LETTER EN
+switch 'a' 'N' = '\x3124' -- BOPOMOFO LETTER ANG
+switch 'e' 'N' = '\x3125' -- BOPOMOFO LETTER ENG
+switch 'e' 'r' = '\x3126' -- BOPOMOFO LETTER ER
+switch 'i' '4' = '\x3127' -- BOPOMOFO LETTER I
+switch 'u' '4' = '\x3128' -- BOPOMOFO LETTER U
+switch 'i' 'u' = '\x3129' -- BOPOMOFO LETTER IU
+switch 'v' '4' = '\x312A' -- BOPOMOFO LETTER V
+switch 'n' 'G' = '\x312B' -- BOPOMOFO LETTER NG
+switch 'g' 'n' = '\x312C' -- BOPOMOFO LETTER GN
+switch '1' 'c' = '\x3220' -- PARENTHESIZED IDEOGRAPH ONE
+switch '2' 'c' = '\x3221' -- PARENTHESIZED IDEOGRAPH TWO
+switch '3' 'c' = '\x3222' -- PARENTHESIZED IDEOGRAPH THREE
+switch '4' 'c' = '\x3223' -- PARENTHESIZED IDEOGRAPH FOUR
+switch '5' 'c' = '\x3224' -- PARENTHESIZED IDEOGRAPH FIVE
+switch '6' 'c' = '\x3225' -- PARENTHESIZED IDEOGRAPH SIX
+switch '7' 'c' = '\x3226' -- PARENTHESIZED IDEOGRAPH SEVEN
+switch '8' 'c' = '\x3227' -- PARENTHESIZED IDEOGRAPH EIGHT
+switch '9' 'c' = '\x3228' -- PARENTHESIZED IDEOGRAPH NINE
+switch 'f' 'f' = '\xFB00' -- LATIN SMALL LIGATURE FF
+switch 'f' 'i' = '\xFB01' -- LATIN SMALL LIGATURE FI
+switch 'f' 'l' = '\xFB02' -- LATIN SMALL LIGATURE FL
+switch 'f' 't' = '\xFB05' -- LATIN SMALL LIGATURE LONG S T
+switch 's' 't' = '\xFB06' -- LATIN SMALL LIGATURE ST
+switch _   _   = '\xFFFF' -- Fallback
diff --git a/src/Yi/Keymap/Vim/Ex/Commands/Edit.hs b/src/Yi/Keymap/Vim/Ex/Commands/Edit.hs
--- a/src/Yi/Keymap/Vim/Ex/Commands/Edit.hs
+++ b/src/Yi/Keymap/Vim/Ex/Commands/Edit.hs
@@ -15,29 +15,33 @@
 import           Control.Applicative              (Alternative ((<|>)))
 import           Control.Monad                    (void, when)
 import           Data.Maybe                       (isJust)
-import qualified Data.Text                        as T (Text, append, pack, unpack)
-import qualified Data.Attoparsec.Text             as P (anyChar, many1, space, string, try, option)
+import qualified Data.Text                        as T (Text, append, pack, unpack, null)
+import qualified Data.Attoparsec.Text             as P (anyChar, many', many1, space, string, try, option)
 import           Yi.Editor                        (MonadEditor (withEditor), newTabE)
 import           Yi.File                          (openNewFile)
 import           Yi.Keymap                        (Action (YiA))
 import           Yi.Keymap.Vim.Common             (EventString)
 import qualified Yi.Keymap.Vim.Ex.Commands.Common as Common (filenameComplete, impureExCommand, parse)
 import           Yi.Keymap.Vim.Ex.Types           (ExCommand (cmdAction, cmdComplete, cmdShow))
+import           Yi.Editor                        (printMsg)
 
 parse :: EventString -> Maybe ExCommand
 parse = Common.parse $ do
     tab <- P.option Nothing $ Just <$> P.string "tab"
     void $ P.try (P.string "edit") <|> P.string "e"
     void $ P.many1 P.space
-    filename <- T.pack <$> P.many1 P.anyChar
+    filename <- T.pack <$> P.many' P.anyChar
     return $! edit (isJust tab) filename
 
 edit :: Bool -> T.Text -> ExCommand
 edit tab f = Common.impureExCommand {
     cmdShow = showEdit tab f
-  , cmdAction = YiA $ do
-        when tab $ withEditor newTabE
-        openNewFile $ T.unpack f
+  , cmdAction = YiA $
+        if T.null f
+          then printMsg "No file name"
+          else do
+            when tab $ withEditor newTabE
+            openNewFile $ T.unpack f
   , cmdComplete = (fmap . fmap)
                     (showEdit tab) (Common.filenameComplete f)
   }
diff --git a/src/Yi/Keymap/Vim/InsertMap.hs b/src/Yi/Keymap/Vim/InsertMap.hs
--- a/src/Yi/Keymap/Vim/InsertMap.hs
+++ b/src/Yi/Keymap/Vim/InsertMap.hs
@@ -23,7 +23,7 @@
 import           Yi.Editor                (EditorM, getEditorDyn, withCurrentBuffer)
 import           Yi.Event                 (Event)
 import           Yi.Keymap.Vim.Common
-import           Yi.Keymap.Vim.Digraph    (charFromDigraph)
+import           Yi.Keymap.Vim.Digraph    (charFromDigraph, DigraphTbl)
 import           Yi.Keymap.Vim.EventUtils (eventToEventString, parseEvents)
 import           Yi.Keymap.Vim.Motion     (Move (Move), stringToMove)
 import           Yi.Keymap.Vim.StateUtils
@@ -32,16 +32,16 @@
 import qualified Yi.Rope                  as R (fromString, fromText)
 import           Yi.TextCompletion        (CompletionScope (..), completeWordB)
 
-defInsertMap :: [(String, Char)] -> [VimBinding]
+defInsertMap :: DigraphTbl -> [VimBinding]
 defInsertMap digraphs =
     [rawPrintable] <> specials digraphs <> [printable]
 
-specials :: [(String, Char)] -> [VimBinding]
+specials :: DigraphTbl -> [VimBinding]
 specials digraphs =
     [exitBinding digraphs, pasteRegisterBinding, digraphBinding digraphs
     , oneshotNormalBinding, completionBinding, cursorBinding]
 
-exitBinding :: [(String, Char)] -> VimBinding
+exitBinding :: DigraphTbl -> VimBinding
 exitBinding digraphs = VimBindingE f
   where
     f :: EventString -> VimState -> MatchResult (EditorM RepeatToken)
@@ -86,7 +86,7 @@
             return Continue
     f _ _ = NoMatch
 
-replay :: [(String, Char)] -> [Event] -> EditorM ()
+replay :: DigraphTbl -> [Event] -> EditorM ()
 replay _ [] = return ()
 replay digraphs (e1:es1) = do
     state <- getEditorDyn
@@ -130,7 +130,7 @@
                   return Continue
           f _ _ = NoMatch
 
-digraphBinding :: [(String, Char)] -> VimBinding
+digraphBinding :: DigraphTbl -> VimBinding
 digraphBinding digraphs = VimBindingE (f . T.unpack . _unEv)
     where f ('<':'C':'-':'k':'>':c1:c2:[]) (VimState { vsMode = Insert _ })
             = WholeMatch $ do
diff --git a/src/Yi/Keymap/Vim/VisualMap.hs b/src/Yi/Keymap/Vim/VisualMap.hs
--- a/src/Yi/Keymap/Vim/VisualMap.hs
+++ b/src/Yi/Keymap/Vim/VisualMap.hs
@@ -13,8 +13,8 @@
 
 module Yi.Keymap.Vim.VisualMap ( defVisualMap ) where
 
-import           Lens.Micro.Platform                 ((.=))
-import           Control.Monad              (forM_, void)
+import           Lens.Micro.Platform        ((.=))
+import           Control.Monad              (forM_, void, when)
 import           Data.Char                  (ord)
 import           Data.List                  (group)
 import           Data.Maybe                 (fromJust, fromMaybe)
@@ -27,10 +27,10 @@
 import           Yi.Keymap.Vim.StyledRegion (StyledRegion (StyledRegion), transformCharactersInRegionB)
 import           Yi.Keymap.Vim.Tag          (gotoTag)
 import           Yi.Keymap.Vim.TextObject
-import           Yi.Keymap.Vim.Utils        (matchFromBool, mkChooseRegisterBinding, mkMotionBinding, addNewLineIfNecessary)
+import           Yi.Keymap.Vim.Utils        (matchFromBool, mkChooseRegisterBinding, mkMotionBinding, addNewLineIfNecessary, pasteInclusiveB)
 import           Yi.MiniBuffer              (spawnMinibufferE)
 import           Yi.Monad                   (whenM)
-import qualified Yi.Rope                    as R (toText)
+import qualified Yi.Rope                    as R (toText, countNewLines)
 import           Yi.Tag                     (Tag (Tag))
 import           Yi.Utils                   (SemiNum ((-~)))
 
@@ -230,40 +230,73 @@
                     region <- withCurrentBuffer regionOfSelectionB
                     withCurrentBuffer $ transformCharactersInRegionB (StyledRegion style region)
                                       (\x -> if x == '\n' then x else c)
-                    escAction
+                    void escAction
                     return Finish
                 _ -> NoMatch
           f _ _ = NoMatch
 
+
+data VisualPaste
+  = PasteBefore
+  | ReplaceSelection
+  deriving (Eq, Ord, Show)
+
 pasteBinding :: VimBinding
 pasteBinding = VimBindingE (f . T.unpack . _unEv)
     where
-    f "p" (VimState { vsMode = (Visual style) }) = WholeMatch $ do
+    f "P" VimState { vsMode = (Visual style) } = pasteMatch style PasteBefore
+    f "p" VimState { vsMode = (Visual style) } = pasteMatch style ReplaceSelection
+    f _ _ = NoMatch
+
+    pasteMatch :: RegionStyle -> VisualPaste -> MatchResult (EditorM RepeatToken)
+    pasteMatch style p = WholeMatch $ do
         register <- getRegisterE . vsActiveRegister =<< getEditorDyn
-        case (register, style) of
-            (Just (Register _style rope), LineWise) -> withCurrentBuffer $ do
-                region <- regionOfSelectionB
-                _ <- deleteRegionWithStyleB region LineWise
-                insertRopeWithStyleB (addNewLineIfNecessary rope) LineWise
-            (Just (Register Block rope), Block) -> withCurrentBuffer $ do
-                here <- pointB
-                there <- getSelectionMarkPointB
-                (here', there') <- flipRectangleB here there
-                reg <- regionOfSelectionB
-                void $ deleteRegionWithStyleB reg Block
-                moveTo (minimum [here, there, here', there'])
-                insertRopeWithStyleB rope Block
-            (Just (Register _ _), Block) ->
-                printMsg "Pasting non-block string into a block selection is not implemented"
-            (Just (Register _style rope), _) -> withCurrentBuffer $ do
-                region <- regionOfSelectionB
-                region' <- convertRegionToStyleB region Inclusive
-                replaceRegionB region' rope
-            _ -> pure ()
-        escAction
+        maybe (pure ()) (paste style p) register
+        void escAction
         return Finish
-    f _ _ = NoMatch
 
+    paste :: RegionStyle -> VisualPaste -> Register -> EditorM ()
+    paste LineWise  = linePaste
+    paste Block     = blockPaste
+    paste Inclusive = otherPaste
+    paste Exclusive = otherPaste
+
+    linePaste :: VisualPaste -> Register -> EditorM ()
+    linePaste p (Register _style rope) = withCurrentBuffer $ do
+        region <- regionOfSelectionB
+        when (p == ReplaceSelection) . void $ deleteRegionWithStyleB region LineWise
+        insertRopeWithStyleB (addNewLineIfNecessary rope) LineWise
+
+    blockPaste :: VisualPaste -> Register -> EditorM ()
+    blockPaste p (Register _style rope) = withCurrentBuffer $ do
+        here <- pointB
+        there <- getSelectionMarkPointB
+        (here', there') <- flipRectangleB here there
+        reg <- regionOfSelectionB
+        moveTo (minimum [here, there, here', there'])
+        when (p == ReplaceSelection) . void $ deleteRegionWithStyleB reg Block
+        if R.countNewLines rope == 0
+        then actionOnLeft reg $ maybe (pure ()) (\_ -> insertRopeWithStyleB rope _style)
+        else pasteInclusiveB rope _style
+      where
+        -- Taken from deleteRegionWithStyleB
+        actionOnLeft :: Region -> (Maybe Point -> BufferM ()) -> BufferM ()
+        actionOnLeft reg action = savingPointB $ do
+            (start, lengths) <- shapeOfBlockRegionB reg
+            moveTo start
+            forM_ (zip [0..] lengths) $ \(i, l) -> do
+                p' <- pointB
+                moveTo start
+                void $ lineMoveRel i
+                action (if l == 0 then Nothing else Just p')
+
+    otherPaste :: VisualPaste -> Register -> EditorM ()
+    otherPaste _ (Register _style rope) = withCurrentBuffer $ do
+      region <- regionOfSelectionB
+      region' <- convertRegionToStyleB region Inclusive
+      replaceRegionB region' rope
+
+
 switchEdgeBinding :: VimBinding
 switchEdgeBinding = VimBindingE (f . T.unpack . _unEv)
     where f [c] (VimState { vsMode = (Visual _) }) | c `elem` ['o', 'O']
@@ -305,7 +338,7 @@
             = WholeMatch $ do
                  tag <- Tag . R.toText <$> withCurrentBuffer
                             (regionOfSelectionB >>= readRegionB)
-                 withEditor escAction
+                 void $ withEditor escAction
                  gotoTag tag 0 Nothing
                  return Finish
           f _ _ = NoMatch
diff --git a/tests/vimtests/blockvisual/block_P_1.test b/tests/vimtests/blockvisual/block_P_1.test
new file mode 100644
--- /dev/null
+++ b/tests/vimtests/blockvisual/block_P_1.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+foo
+bar
+
+baz
+-- Output
+(1,1)
+foofoo
+foobar
+
+foobaz
+-- Events
+yw<C-v>jjjP<Esc>
diff --git a/tests/vimtests/blockvisual/block_P_2.test b/tests/vimtests/blockvisual/block_P_2.test
new file mode 100644
--- /dev/null
+++ b/tests/vimtests/blockvisual/block_P_2.test
@@ -0,0 +1,20 @@
+-- Input
+(4,1)
+123456
+123456
+123456
+foo
+bar
+
+baz
+-- Output
+(1,1)
+foo123456
+bar123456
+123456
+bazfoo
+bar
+
+baz
+-- Events
+<C-v>jjjey<C-v>kkkP<Esc>
diff --git a/tests/vimtests/blockvisual/block_P_3.test b/tests/vimtests/blockvisual/block_P_3.test
new file mode 100644
--- /dev/null
+++ b/tests/vimtests/blockvisual/block_P_3.test
@@ -0,0 +1,20 @@
+-- Input
+(4,1)
+123456
+123456
+123456
+foo
+bar
+
+baz
+-- Output
+(1,1)
+foo123456
+bar123456
+123456
+foo
+bar
+
+baz
+-- Events
+<C-v>jey<C-v>kkkP<Esc>
diff --git a/tests/vimtests/blockvisual/block_P_4.test b/tests/vimtests/blockvisual/block_P_4.test
new file mode 100644
--- /dev/null
+++ b/tests/vimtests/blockvisual/block_P_4.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+foo
+bar
+
+baz
+-- Output
+(1,1)
+foofoo
+barbar
+
+bazbaz
+-- Events
+<C-v>jjjey<C-v>jjjP<Esc>
diff --git a/tests/vimtests/blockvisual/block_p_1.test b/tests/vimtests/blockvisual/block_p_1.test
new file mode 100644
--- /dev/null
+++ b/tests/vimtests/blockvisual/block_p_1.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+foo
+bar
+
+baz
+-- Output
+(1,1)
+foooo
+fooar
+
+fooaz
+-- Events
+yw<C-v>jjjp<Esc>
diff --git a/tests/vimtests/blockvisual/block_p_2.test b/tests/vimtests/blockvisual/block_p_2.test
new file mode 100644
--- /dev/null
+++ b/tests/vimtests/blockvisual/block_p_2.test
@@ -0,0 +1,20 @@
+-- Input
+(4,1)
+123456
+123456
+123456
+foo
+bar
+
+baz
+-- Output
+(1,1)
+foo23456
+bar23456
+23456
+bazoo
+bar
+
+baz
+-- Events
+<C-v>jjjey<C-v>kkkp<Esc>
diff --git a/tests/vimtests/blockvisual/block_p_3.test b/tests/vimtests/blockvisual/block_p_3.test
new file mode 100644
--- /dev/null
+++ b/tests/vimtests/blockvisual/block_p_3.test
@@ -0,0 +1,20 @@
+-- Input
+(4,1)
+123456
+123456
+123456
+foo
+bar
+
+baz
+-- Output
+(1,1)
+foo23456
+bar23456
+23456
+oo
+bar
+
+baz
+-- Events
+<C-v>jey<C-v>kkkp<Esc>
diff --git a/tests/vimtests/blockvisual/block_p_4.test b/tests/vimtests/blockvisual/block_p_4.test
new file mode 100644
--- /dev/null
+++ b/tests/vimtests/blockvisual/block_p_4.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+foo
+bar
+
+baz
+-- Output
+(1,1)
+foooo
+barar
+
+bazaz
+-- Events
+<C-v>jjjey<C-v>jjjp<Esc>
diff --git a/tests/vimtests/delete/2dw..test b/tests/vimtests/delete/2dw..test
deleted file mode 100644
--- a/tests/vimtests/delete/2dw..test
+++ /dev/null
@@ -1,12 +0,0 @@
--- Input
-(2,1)
-a b c d e f g h i j
-a b c d e f g h i j
-a b c d e f g h i j
--- Output
-(2,1)
-a b c d e f g h i j
-e f g h i j
-a b c d e f g h i j
--- Events
-2dw.
diff --git a/tests/vimtests/delete/2dw2..test b/tests/vimtests/delete/2dw2..test
deleted file mode 100644
--- a/tests/vimtests/delete/2dw2..test
+++ /dev/null
@@ -1,12 +0,0 @@
--- Input
-(2,1)
-a b c d e f g h i j
-a b c d e f g h i j
-a b c d e f g h i j
--- Output
-(2,1)
-a b c d e f g h i j
-e f g h i j
-a b c d e f g h i j
--- Events
-2dw2.
diff --git a/tests/vimtests/delete/2dw3..test b/tests/vimtests/delete/2dw3..test
deleted file mode 100644
--- a/tests/vimtests/delete/2dw3..test
+++ /dev/null
@@ -1,12 +0,0 @@
--- Input
-(2,1)
-a b c d e f g h i j
-a b c d e f g h i j
-a b c d e f g h i j
--- Output
-(2,1)
-a b c d e f g h i j
-f g h i j
-a b c d e f g h i j
--- Events
-2dw3.
diff --git a/tests/vimtests/repeat/O1.test b/tests/vimtests/repeat/O1.test
new file mode 100644
--- /dev/null
+++ b/tests/vimtests/repeat/O1.test
@@ -0,0 +1,17 @@
+-- Input
+(2,1)
+123
+456
+789
+-- Output
+(7,3)
+123
+456
+abc
+abc
+abc
+abc
+abc
+789
+-- Events
+2oabc<Esc>3.
diff --git a/yi-keymap-vim.cabal b/yi-keymap-vim.cabal
--- a/yi-keymap-vim.cabal
+++ b/yi-keymap-vim.cabal
@@ -1,9 +1,5 @@
--- This file has been generated from package.yaml by hpack version 0.17.1.
---
--- see: https://github.com/sol/hpack
-
 name:           yi-keymap-vim
-version:        0.16.0
+version:        0.17.1
 synopsis:       Vim keymap for Yi editor
 category:       Yi
 homepage:       https://github.com/yi-editor/yi#readme
@@ -13,478 +9,36 @@
 build-type:     Simple
 cabal-version:  >= 1.10
 
-data-files:
-    tests/vimtests/blockvisual/0.test
-    tests/vimtests/blockvisual/8.test
-    tests/vimtests/blockvisual/9.test
-    tests/vimtests/blockvisual/block.test
-    tests/vimtests/blockvisual/block_d.test
-    tests/vimtests/blockvisual/block_d_1.test
-    tests/vimtests/blockvisual/block_d_2.test
-    tests/vimtests/blockvisual/c.test
-    tests/vimtests/blockvisual/capD_1.test
-    tests/vimtests/blockvisual/capD_2.test
-    tests/vimtests/blockvisual/capI.test
-    tests/vimtests/blockvisual/capU_2.test
-    tests/vimtests/blockvisual/commentblock.test
-    tests/vimtests/blockvisual/commentblock_1.test
-    tests/vimtests/blockvisual/commentblock_2.test
-    tests/vimtests/blockvisual/d.test
-    tests/vimtests/blockvisual/d_1.test
-    tests/vimtests/blockvisual/d_2.test
-    tests/vimtests/blockvisual/d_3.test
-    tests/vimtests/blockvisual/d_4.test
-    tests/vimtests/blockvisual/hl.test
-    tests/vimtests/blockvisual/o_1.test
-    tests/vimtests/blockvisual/o_2.test
-    tests/vimtests/blockvisual/o_3.test
-    tests/vimtests/blockvisual/o_4.test
-    tests/vimtests/blockvisual/o_5.test
-    tests/vimtests/blockvisual/o_6.test
-    tests/vimtests/blockvisual/paste_block.test
-    tests/vimtests/blockvisual/r_1.test
-    tests/vimtests/blockvisual/r_2.test
-    tests/vimtests/blockvisual/r_3.test
-    tests/vimtests/blockvisual/r_4.test
-    tests/vimtests/blockvisual/switchcase_2.test
-    tests/vimtests/blockvisual/u_2.test
-    tests/vimtests/blockvisual/y_10.test
-    tests/vimtests/blockvisual/y_11.test
-    tests/vimtests/blockvisual/y_12.test
-    tests/vimtests/blockvisual/y_13.test
-    tests/vimtests/blockvisual/y_14.test
-    tests/vimtests/blockvisual/y_15.test
-    tests/vimtests/blockvisual/y_3.test
-    tests/vimtests/blockvisual/y_4.test
-    tests/vimtests/blockvisual/y_7.test
-    tests/vimtests/blockvisual/y_8.test
-    tests/vimtests/blockvisual/y_9.test
-    tests/vimtests/change/c3l.test
-    tests/vimtests/change/C_part_of_line.test
-    tests/vimtests/change/C_whole_line.test
-    tests/vimtests/change/cc.test
-    tests/vimtests/change/ciw.test
-    tests/vimtests/change/S.test
-    tests/vimtests/change/s_eol.test
-    tests/vimtests/change/V3jc.test
-    tests/vimtests/delete/10dd.test
-    tests/vimtests/delete/2d3w.test
-    tests/vimtests/delete/2d3w_1.test
-    tests/vimtests/delete/2dd.test
-    tests/vimtests/delete/2dw..test
-    tests/vimtests/delete/2dw2..test
-    tests/vimtests/delete/2dw3..test
-    tests/vimtests/delete/C-u_1.test
-    tests/vimtests/delete/C-u_2.test
-    tests/vimtests/delete/capD.test
-    tests/vimtests/delete/capX.test
-    tests/vimtests/delete/capX_1.test
-    tests/vimtests/delete/d0.test
-    tests/vimtests/delete/d00.test
-    tests/vimtests/delete/d2G.test
-    tests/vimtests/delete/d2vd.test
-    tests/vimtests/delete/d2vd_1.test
-    tests/vimtests/delete/d3G.test
-    tests/vimtests/delete/d3vd.test
-    tests/vimtests/delete/d_capG.test
-    tests/vimtests/delete/d_capV_right_curly.test
-    tests/vimtests/delete/d_right_curly.test
-    tests/vimtests/delete/d_v_right_curly.test
-    tests/vimtests/delete/daw.test
-    tests/vimtests/delete/dd.test
-    tests/vimtests/delete/dd_1.test
-    tests/vimtests/delete/dd_2.test
-    tests/vimtests/delete/dd_3.test
-    tests/vimtests/delete/dd_4.test
-    tests/vimtests/delete/dd_5.test
-    tests/vimtests/delete/de.test
-    tests/vimtests/delete/diw.test
-    tests/vimtests/delete/dj.test
-    tests/vimtests/delete/dt.test
-    tests/vimtests/delete/dvd.test
-    tests/vimtests/delete/dve.test
-    tests/vimtests/delete/dVl.test
-    tests/vimtests/delete/dw_1.test
-    tests/vimtests/delete/ld3w.test
-    tests/vimtests/delete/ld3w_1.test
-    tests/vimtests/delete/ldw.test
-    tests/vimtests/delete/ldwdw.test
-    tests/vimtests/delete/spec_delete.test
-    tests/vimtests/delete/x.test
-    tests/vimtests/delete/x_1.test
-    tests/vimtests/digraphs/ae.test
-    tests/vimtests/digraphs/eacute.test
-    tests/vimtests/empty/empty.test
-    tests/vimtests/ex/empty.test
-    tests/vimtests/ex/esc.test
-    tests/vimtests/ex/esc_1.test
-    tests/vimtests/ex/fail.test
-    tests/vimtests/find/f.test
-    tests/vimtests/find/f1.test
-    tests/vimtests/find/f2.test
-    tests/vimtests/find/f3.test
-    tests/vimtests/find/f4.test
-    tests/vimtests/find/f5.test
-    tests/vimtests/find/f6.test
-    tests/vimtests/find/t.test
-    tests/vimtests/find/t1.test
-    tests/vimtests/find/t2.test
-    tests/vimtests/find/t3.test
-    tests/vimtests/find/t4.test
-    tests/vimtests/find/t5.test
-    tests/vimtests/find/t6.test
-    tests/vimtests/find/t7.test
-    tests/vimtests/format/break_line_in_word.test
-    tests/vimtests/format/indent.test
-    tests/vimtests/format/join_lines.test
-    tests/vimtests/format/long_blank_line.test
-    tests/vimtests/format/long_line.test
-    tests/vimtests/format/trailing_ws.test
-    tests/vimtests/indent/1.test
-    tests/vimtests/indent/2.test
-    tests/vimtests/indent/3.test
-    tests/vimtests/indent/4.test
-    tests/vimtests/indent/5.test
-    tests/vimtests/indent/6.test
-    tests/vimtests/indent/7.test
-    tests/vimtests/indent/8.test
-    tests/vimtests/indent/setpaste.test
-    tests/vimtests/insertion/2o.test
-    tests/vimtests/insertion/a.test
-    tests/vimtests/insertion/a2.test
-    tests/vimtests/insertion/a3.test
-    tests/vimtests/insertion/a4.test
-    tests/vimtests/insertion/a_on_empty_line.test
-    tests/vimtests/insertion/C-b.test
-    tests/vimtests/insertion/C-c_0.test
-    tests/vimtests/insertion/C-c_1.test
-    tests/vimtests/insertion/C-c_10.test
-    tests/vimtests/insertion/C-c_11.test
-    tests/vimtests/insertion/C-c_12.test
-    tests/vimtests/insertion/C-c_13.test
-    tests/vimtests/insertion/C-c_2.test
-    tests/vimtests/insertion/C-c_3.test
-    tests/vimtests/insertion/C-c_4.test
-    tests/vimtests/insertion/C-c_5.test
-    tests/vimtests/insertion/C-c_6.test
-    tests/vimtests/insertion/C-c_7.test
-    tests/vimtests/insertion/C-c_8.test
-    tests/vimtests/insertion/C-c_9.test
-    tests/vimtests/insertion/C-d_0.test
-    tests/vimtests/insertion/C-d_1.test
-    tests/vimtests/insertion/C-d_2.test
-    tests/vimtests/insertion/C-d_3.test
-    tests/vimtests/insertion/C-d_4.test
-    tests/vimtests/insertion/C-d_5.test
-    tests/vimtests/insertion/C-d_6.test
-    tests/vimtests/insertion/C-e_0.test
-    tests/vimtests/insertion/C-e_1.test
-    tests/vimtests/insertion/C-e_2.test
-    tests/vimtests/insertion/C-f.test
-    tests/vimtests/insertion/C-h_0.test
-    tests/vimtests/insertion/C-h_1.test
-    tests/vimtests/insertion/C-h_2.test
-    tests/vimtests/insertion/C-h_3.test
-    tests/vimtests/insertion/C-h_4.test
-    tests/vimtests/insertion/C-o_2.test
-    tests/vimtests/insertion/C-o_3.test
-    tests/vimtests/insertion/C-o_4.test
-    tests/vimtests/insertion/C-r_0.test
-    tests/vimtests/insertion/C-r_1.test
-    tests/vimtests/insertion/C-w_0.test
-    tests/vimtests/insertion/C-w_1.test
-    tests/vimtests/insertion/C-y_0.test
-    tests/vimtests/insertion/C-y_1.test
-    tests/vimtests/insertion/C-y_2.test
-    tests/vimtests/insertion/capA.test
-    tests/vimtests/insertion/capA2.test
-    tests/vimtests/insertion/capA3.test
-    tests/vimtests/insertion/capA4.test
-    tests/vimtests/insertion/capI.test
-    tests/vimtests/insertion/capI2.test
-    tests/vimtests/insertion/capI3.test
-    tests/vimtests/insertion/capO.test
-    tests/vimtests/insertion/counted_a.test
-    tests/vimtests/insertion/counted_capA.test
-    tests/vimtests/insertion/counted_capI.test
-    tests/vimtests/insertion/counted_capO.test
-    tests/vimtests/insertion/counted_i.test
-    tests/vimtests/insertion/counted_o.test
-    tests/vimtests/insertion/i.test
-    tests/vimtests/insertion/i2.test
-    tests/vimtests/insertion/i3.test
-    tests/vimtests/insertion/indent_0.test
-    tests/vimtests/insertion/indent_1.test
-    tests/vimtests/insertion/indent_2.test
-    tests/vimtests/insertion/indent_3.test
-    tests/vimtests/insertion/indent_4.test
-    tests/vimtests/insertion/indent_5.test
-    tests/vimtests/insertion/indent_6.test
-    tests/vimtests/insertion/indent_7.test
-    tests/vimtests/insertion/indent_8.test
-    tests/vimtests/insertion/nl_insert.test
-    tests/vimtests/insertion/o.test
-    tests/vimtests/insertion/o1.test
-    tests/vimtests/insertion/O2.test
-    tests/vimtests/insertion/o3.test
-    tests/vimtests/insertion/O4.test
-    tests/vimtests/insertion/onechar.test
-    tests/vimtests/insertion/spec_delete.test
-    tests/vimtests/insertion/spec_insert.test
-    tests/vimtests/joinlines/1.test
-    tests/vimtests/joinlines/2.test
-    tests/vimtests/joinlines/counted_1.test
-    tests/vimtests/joinlines/counted_2.test
-    tests/vimtests/jumplist/1.test
-    tests/vimtests/jumplist/2.test
-    tests/vimtests/macros/0.test
-    tests/vimtests/macros/1.test
-    tests/vimtests/macros/10.test
-    tests/vimtests/macros/11.test
-    tests/vimtests/macros/12.test
-    tests/vimtests/macros/13.test
-    tests/vimtests/macros/14.test
-    tests/vimtests/macros/15.test
-    tests/vimtests/macros/16.test
-    tests/vimtests/macros/2.test
-    tests/vimtests/macros/3.test
-    tests/vimtests/macros/4.test
-    tests/vimtests/macros/5.test
-    tests/vimtests/macros/6.test
-    tests/vimtests/macros/7.test
-    tests/vimtests/macros/8.test
-    tests/vimtests/macros/9.test
-    tests/vimtests/macros/repeat_last_macro.test
-    tests/vimtests/marks/unjump_backquote.test
-    tests/vimtests/marks/unjump_quote.test
-    tests/vimtests/marks/unjump_quote_blank.test
-    tests/vimtests/movement/empty.test
-    tests/vimtests/movement/empty_1.test
-    tests/vimtests/movement/eol_j.test
-    tests/vimtests/movement/eol_j2.test
-    tests/vimtests/movement/v_eol_j2.test
-    tests/vimtests/numbers/cursor_on_digits.test
-    tests/vimtests/numbers/decrement.test
-    tests/vimtests/numbers/hex_decrease.test
-    tests/vimtests/numbers/hex_increase.test
-    tests/vimtests/numbers/increment.test
-    tests/vimtests/numbers/no_numbers.test
-    tests/vimtests/numbers/oct_decrease.test
-    tests/vimtests/numbers/oct_hex_letters.test
-    tests/vimtests/numbers/oct_increase.test
-    tests/vimtests/numbers/sol_eol.test
-    tests/vimtests/paste/2dd_capP.test
-    tests/vimtests/paste/2dd_capP_1.test
-    tests/vimtests/paste/2ddp.test
-    tests/vimtests/paste/2ddp_1.test
-    tests/vimtests/paste/2yyp.test
-    tests/vimtests/paste/d2wp.test
-    tests/vimtests/paste/dbp.test
-    tests/vimtests/paste/dd_capP.test
-    tests/vimtests/paste/dd_capP_1.test
-    tests/vimtests/paste/ddjp.test
-    tests/vimtests/paste/ddkP.test
-    tests/vimtests/paste/ddp.test
-    tests/vimtests/paste/ddp_1.test
-    tests/vimtests/paste/dep.test
-    tests/vimtests/paste/dw_capP.test
-    tests/vimtests/paste/dwp.test
-    tests/vimtests/paste/p_at_newline.test
-    tests/vimtests/paste/p_at_newline2.test
-    tests/vimtests/paste/visual.test
-    tests/vimtests/paste/y_1.test
-    tests/vimtests/paste/y_2.test
-    tests/vimtests/paste/y_3.test
-    tests/vimtests/paste/yep.test
-    tests/vimtests/paste/yjp.test
-    tests/vimtests/paste/Yp.test
-    tests/vimtests/paste/ywp.test
-    tests/vimtests/paste/yy_capP.test
-    tests/vimtests/paste/yyp.test
-    tests/vimtests/repeat/2r.test
-    tests/vimtests/repeat/a.test
-    tests/vimtests/repeat/a2.test
-    tests/vimtests/repeat/a3.test
-    tests/vimtests/repeat/a4.test
-    tests/vimtests/repeat/a5.test
-    tests/vimtests/repeat/capA.test
-    tests/vimtests/repeat/capA2.test
-    tests/vimtests/repeat/capA3.test
-    tests/vimtests/repeat/capA4.test
-    tests/vimtests/repeat/capC.test
-    tests/vimtests/repeat/capI.test
-    tests/vimtests/repeat/capI2.test
-    tests/vimtests/repeat/capI3.test
-    tests/vimtests/repeat/capI4.test
-    tests/vimtests/repeat/capO.test
-    tests/vimtests/repeat/capO2.test
-    tests/vimtests/repeat/capO3.test
-    tests/vimtests/repeat/capX.test
-    tests/vimtests/repeat/capX_1.test
-    tests/vimtests/repeat/counted_2r.test
-    tests/vimtests/repeat/dw_capP.test
-    tests/vimtests/repeat/dwp.test
-    tests/vimtests/repeat/i.test
-    tests/vimtests/repeat/i2.test
-    tests/vimtests/repeat/i3.test
-    tests/vimtests/repeat/i4.test
-    tests/vimtests/repeat/o.test
-    tests/vimtests/repeat/o1.test
-    tests/vimtests/repeat/o2.test
-    tests/vimtests/repeat/o3.test
-    tests/vimtests/repeat/r.test
-    tests/vimtests/repeat/r_1.test
-    tests/vimtests/repeat/r_2.test
-    tests/vimtests/repeat/r_3.test
-    tests/vimtests/repeat/tilde_repeat.test
-    tests/vimtests/repeat/tilde_repeat_does_not_affect_other_lines.test
-    tests/vimtests/repeat/x.test
-    tests/vimtests/repeat/x_1.test
-    tests/vimtests/repeat/x_2.test
-    tests/vimtests/replace/0.test
-    tests/vimtests/replace/1.test
-    tests/vimtests/replace/10.test
-    tests/vimtests/replace/11.test
-    tests/vimtests/replace/12.test
-    tests/vimtests/replace/2.test
-    tests/vimtests/replace/3.test
-    tests/vimtests/replace/4.test
-    tests/vimtests/replace/5.test
-    tests/vimtests/replace/6.test
-    tests/vimtests/replace/7.test
-    tests/vimtests/replace/8.test
-    tests/vimtests/replace/9.test
-    tests/vimtests/search/1.test
-    tests/vimtests/search/2.test
-    tests/vimtests/search/3.test
-    tests/vimtests/search/4.test
-    tests/vimtests/search/5.test
-    tests/vimtests/search/6.test
-    tests/vimtests/search/7.test
-    tests/vimtests/search/8.test
-    tests/vimtests/search/9.test
-    tests/vimtests/search/counted_1.test
-    tests/vimtests/search/counted_2.test
-    tests/vimtests/search/counted_3.test
-    tests/vimtests/search/counted_capN_1.test
-    tests/vimtests/search/counted_capN_2.test
-    tests/vimtests/search/counted_n_1.test
-    tests/vimtests/search/counted_n_2.test
-    tests/vimtests/search/counted_n_3.test
-    tests/vimtests/search/history1.test
-    tests/vimtests/search/history2.test
-    tests/vimtests/search/history3.test
-    tests/vimtests/search/history4.test
-    tests/vimtests/searchword/g_pound.test
-    tests/vimtests/searchword/g_repeat_pound.test
-    tests/vimtests/searchword/g_repeat_pound_1.test
-    tests/vimtests/searchword/g_repeat_star.test
-    tests/vimtests/searchword/g_star.test
-    tests/vimtests/searchword/pound.test
-    tests/vimtests/searchword/repeat_pound.test
-    tests/vimtests/searchword/repeat_star.test
-    tests/vimtests/searchword/star.test
-    tests/vimtests/searchword/star_2.test
-    tests/vimtests/sort/1.test
-    tests/vimtests/sort/2.test
-    tests/vimtests/sort/3.test
-    tests/vimtests/sort/4.test
-    tests/vimtests/sort/5.test
-    tests/vimtests/sort/6.test
-    tests/vimtests/switchcase/g_capU.test
-    tests/vimtests/switchcase/gtilde.test
-    tests/vimtests/switchcase/gtilde_1.test
-    tests/vimtests/switchcase/gu.test
-    tests/vimtests/switchcase/tilde_does_not_cross_lines.test
-    tests/vimtests/switchcase/tilde_left_over_count_at_eol_is_ignored.test
-    tests/vimtests/switchcase/tilde_near_eol.test
-    tests/vimtests/switchcase/tilde_no_count.test
-    tests/vimtests/switchcase/tilde_with_count.test
-    tests/vimtests/undo/1.test
-    tests/vimtests/undo/2.test
-    tests/vimtests/undo/3.test
-    tests/vimtests/undo/4.test
-    tests/vimtests/undo/5.test
-    tests/vimtests/undo/6.test
-    tests/vimtests/undo/7.test
-    tests/vimtests/undo/8.test
-    tests/vimtests/undo/9.test
-    tests/vimtests/undo/cw.test
-    tests/vimtests/unicode/chinese-simp.test
-    tests/vimtests/unicode/chinese-trad.test
-    tests/vimtests/unicode/russian.test
-    tests/vimtests/unsorted/2yy.test
-    tests/vimtests/unsorted/v3lcABC.test
-    tests/vimtests/visual/1.test
-    tests/vimtests/visual/10.test
-    tests/vimtests/visual/11.test
-    tests/vimtests/visual/12.test
-    tests/vimtests/visual/13.test
-    tests/vimtests/visual/14.test
-    tests/vimtests/visual/15.test
-    tests/vimtests/visual/2.test
-    tests/vimtests/visual/3.test
-    tests/vimtests/visual/4.test
-    tests/vimtests/visual/6.test
-    tests/vimtests/visual/7.test
-    tests/vimtests/visual/A_0.test
-    tests/vimtests/visual/A_1.test
-    tests/vimtests/visual/A_2.test
-    tests/vimtests/visual/A_3.test
-    tests/vimtests/visual/capD_0.test
-    tests/vimtests/visual/capD_1.test
-    tests/vimtests/visual/capD_2.test
-    tests/vimtests/visual/capU_0.test
-    tests/vimtests/visual/capU_1.test
-    tests/vimtests/visual/capY_0.test
-    tests/vimtests/visual/CSs.test
-    tests/vimtests/visual/d_0.test
-    tests/vimtests/visual/d_1.test
-    tests/vimtests/visual/d_2.test
-    tests/vimtests/visual/gq_0.test
-    tests/vimtests/visual/gq_1.test
-    tests/vimtests/visual/I_0.test
-    tests/vimtests/visual/I_1.test
-    tests/vimtests/visual/indent_0.test
-    tests/vimtests/visual/indent_1.test
-    tests/vimtests/visual/indent_10.test
-    tests/vimtests/visual/indent_11.test
-    tests/vimtests/visual/indent_12.test
-    tests/vimtests/visual/indent_13.test
-    tests/vimtests/visual/indent_2.test
-    tests/vimtests/visual/indent_3.test
-    tests/vimtests/visual/indent_4.test
-    tests/vimtests/visual/indent_5.test
-    tests/vimtests/visual/indent_6.test
-    tests/vimtests/visual/indent_7.test
-    tests/vimtests/visual/indent_8.test
-    tests/vimtests/visual/indent_9.test
-    tests/vimtests/visual/m_0.test
-    tests/vimtests/visual/m_1.test
-    tests/vimtests/visual/o_0.test
-    tests/vimtests/visual/paste_line.test
-    tests/vimtests/visual/paste_multiline.test
-    tests/vimtests/visual/paste_word.test
-    tests/vimtests/visual/paste_word_2.test
-    tests/vimtests/visual/r_0.test
-    tests/vimtests/visual/r_1.test
-    tests/vimtests/visual/r_2.test
-    tests/vimtests/visual/switchcase_0.test
-    tests/vimtests/visual/switchcase_1.test
-    tests/vimtests/visual/u_0.test
-    tests/vimtests/visual/u_1.test
-    tests/vimtests/visual/v3iwx.test
-    tests/vimtests/visual/Vd.test
-    tests/vimtests/visual/viw.test
-    tests/vimtests/visual/vlllx.test
-    tests/vimtests/visual/vx.test
-    tests/vimtests/visual/y_0.test
-    tests/vimtests/visual/y_1.test
-    tests/vimtests/visual/y_2.test
-    tests/vimtests/visual/y_3.test
-    tests/vimtests/visual/y_5.test
-    tests/vimtests/visual/y_6.test
-    tests/vimtests/yank/yy.test
+extra-source-files:
+    tests/vimtests/blockvisual/*.test
+    tests/vimtests/change/*.test
+    tests/vimtests/delete/*.test
+    tests/vimtests/digraphs/*.test
+    tests/vimtests/digraphs/*.test
+    tests/vimtests/empty/*.test
+    tests/vimtests/ex/*.test
+    tests/vimtests/find/*.test
+    tests/vimtests/format/*.test
+    tests/vimtests/indent/*.test
+    tests/vimtests/insertion/*.test
+    tests/vimtests/joinlines/*.test
+    tests/vimtests/jumplist/*.test
+    tests/vimtests/macros/*.test
+    tests/vimtests/marks/*.test
+    tests/vimtests/movement/*.test
+    tests/vimtests/numbers/*.test
+    tests/vimtests/paste/*.test
+    tests/vimtests/repeat/*.test
+    tests/vimtests/replace/*.test
+    tests/vimtests/search/*.test
+    tests/vimtests/searchword/*.test
+    tests/vimtests/sort/*.test
+    tests/vimtests/switchcase/*.test
+    tests/vimtests/undo/*.test
+    tests/vimtests/unicode/*.test
+    tests/vimtests/unsorted/*.test
+    tests/vimtests/visual/*.test
+    tests/vimtests/yank/*.test
 
 source-repository head
   type: git
@@ -511,9 +65,9 @@
     , text
     , transformers-base
     , unordered-containers
-    , yi-core
-    , yi-language
-    , yi-rope
+    , yi-core >= 0.17
+    , yi-language >= 0.17
+    , yi-rope >= 0.10
   exposed-modules:
       Yi.Config.Default.Vim
       Yi.Keymap.Vim
@@ -595,14 +149,13 @@
     , text
     , transformers-base
     , unordered-containers
-    , yi-core
-    , yi-language
-    , yi-rope
+    , yi-core >= 0.17
+    , yi-language >= 0.17
+    , yi-rope >= 0.10
     , tasty
     , tasty-hunit
     , QuickCheck
     , tasty-quickcheck
-    , yi-core
     , yi-keymap-vim
   other-modules:
       Generic.TestPureBufferManipulations
