-- | This module converts between HTML/XML entities (i.e. @&@) and
--   the characters they represent.
module Text.HTML.TagSoup.Entity(
    lookupEntity, lookupNamedEntity, lookupNumericEntity,
    escapeXML,
    xmlEntities, htmlEntities
    ) where

import Data.Char (chr, ord)
import qualified Data.IntMap as IntMap
import Data.Ix
import qualified Data.Map as Map
import Numeric (readHex)


-- | Lookup an entity, using 'lookupNumericEntity' if it starts with
--   @#@ and 'lookupNamedEntity' otherwise
lookupEntity :: String -> Maybe String
lookupEntity ('#':xs) = lookupNumericEntity xs
lookupEntity xs = lookupNamedEntity xs


-- | Lookup a numeric entity, the leading @\'#\'@ must have already been removed.
--
-- > lookupNumericEntity "65" == Just "A"
-- > lookupNumericEntity "x41" == Just "A"
-- > lookupNumericEntity "x4E" === Just "N"
-- > lookupNumericEntity "x4e" === Just "N"
-- > lookupNumericEntity "Haskell" == Nothing
-- > lookupNumericEntity "" == Nothing
-- > lookupNumericEntity "89439085908539082" == Nothing
lookupNumericEntity :: String -> Maybe String
lookupNumericEntity = f
        -- entity = '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'
    where
        f ('x':xs) = g [('0','9'),('a','f'),('A','F')] readHex xs
        f xs = g [('0','9')] reads xs

        g :: [(Char,Char)] -> ReadS Integer -> String -> Maybe String
        g valid reader xs = do
            let test b = if b then Just () else Nothing
            test $ isValid valid xs
            test $ not $ null xs
            case reader xs of
                [(a,"")] -> do
                    test $ inRange (toInteger $ ord minBound, toInteger $ ord maxBound) a
                    return [chr $ fromInteger a]
                _ -> Nothing

        isValid :: [(Char,Char)] -> String -> Bool
        isValid valid xs = all (\x -> any (`inRange` x) valid) xs


-- | Lookup a named entity, using 'htmlEntities'
--
-- > lookupNamedEntity "amp" == Just "&"
-- > lookupNamedEntity "haskell" == Nothing
lookupNamedEntity :: String -> Maybe String
lookupNamedEntity = \x -> Map.lookup x mp
    where mp = Map.fromList htmlEntities


-- | Escape an XML string.
--
-- > escapeXML "hello world" == "hello world"
-- > escapeXML "hello & world" == "hello & world"
escapeXML :: String -> String
escapeXML = concatMap $ \x -> IntMap.findWithDefault [x] (ord x) mp
    where mp = IntMap.fromList [(ord b, "&"++a++";") | (a,[b]) <- xmlEntities]


-- | A table mapping XML entity names to resolved strings. All strings are a single character long.
--   Does /not/ include @apos@ as Internet Explorer does not know about it.
xmlEntities :: [(String, String)]
xmlEntities = let a*b = (a,[b]) in
    ["quot" * '"'
    ,"amp"  * '&'
    -- ,"apos" * '\''    -- Internet Explorer does not know that
    ,"lt"   * '<'
    ,"gt"   * '>'
    ]

-- | A table mapping HTML entity names to resolved strings. Most resolved strings are a single character long,
--   but some (e.g. @"ngeqq"@) are two characters long. The list is taken from
--   <http://www.w3.org/TR/html5/syntax.html#named-character-references>.
htmlEntities :: [(String, String)]
htmlEntities = let (*) = (,) in
    ["Aacute" * "\x00C1"
    ,"aacute" * "\x00E1"
    ,"Abreve" * "\x0102"
    ,"abreve" * "\x0103"
    ,"ac" * "\x223E"
    ,"acd" * "\x223F"
    ,"acE" * "\x223E\x0333"
    ,"Acirc" * "\x00C2"
    ,"acirc" * "\x00E2"
    ,"acute" * "\x00B4"
    ,"Acy" * "\x0410"
    ,"acy" * "\x0430"
    ,"AElig" * "\x00C6"
    ,"aelig" * "\x00E6"
    ,"af" * "\x2061"
    ,"Afr" * "\xD835\xDD04"
    ,"afr" * "\xD835\xDD1E"
    ,"Agrave" * "\x00C0"
    ,"agrave" * "\x00E0"
    ,"alefsym" * "\x2135"
    ,"aleph" * "\x2135"
    ,"Alpha" * "\x0391"
    ,"alpha" * "\x03B1"
    ,"Amacr" * "\x0100"
    ,"amacr" * "\x0101"
    ,"amalg" * "\x2A3F"
    ,"AMP" * "\x0026"
    ,"amp" * "\x0026"
    ,"and" * "\x2227"
    ,"And" * "\x2A53"
    ,"andand" * "\x2A55"
    ,"andd" * "\x2A5C"
    ,"andslope" * "\x2A58"
    ,"andv" * "\x2A5A"
    ,"ang" * "\x2220"
    ,"ange" * "\x29A4"
    ,"angle" * "\x2220"
    ,"angmsd" * "\x2221"
    ,"angmsdaa" * "\x29A8"
    ,"angmsdab" * "\x29A9"
    ,"angmsdac" * "\x29AA"
    ,"angmsdad" * "\x29AB"
    ,"angmsdae" * "\x29AC"
    ,"angmsdaf" * "\x29AD"
    ,"angmsdag" * "\x29AE"
    ,"angmsdah" * "\x29AF"
    ,"angrt" * "\x221F"
    ,"angrtvb" * "\x22BE"
    ,"angrtvbd" * "\x299D"
    ,"angsph" * "\x2222"
    ,"angst" * "\x00C5"
    ,"angzarr" * "\x237C"
    ,"Aogon" * "\x0104"
    ,"aogon" * "\x0105"
    ,"Aopf" * "\xD835\xDD38"
    ,"aopf" * "\xD835\xDD52"
    ,"ap" * "\x2248"
    ,"apacir" * "\x2A6F"
    ,"ape" * "\x224A"
    ,"apE" * "\x2A70"
    ,"apid" * "\x224B"
    ,"apos" * "\x0027"
    ,"ApplyFunction" * "\x2061"
    ,"approx" * "\x2248"
    ,"approxeq" * "\x224A"
    ,"Aring" * "\x00C5"
    ,"aring" * "\x00E5"
    ,"Ascr" * "\xD835\xDC9C"
    ,"ascr" * "\xD835\xDCB6"
    ,"Assign" * "\x2254"
    ,"ast" * "\x002A"
    ,"asymp" * "\x2248"
    ,"asympeq" * "\x224D"
    ,"Atilde" * "\x00C3"
    ,"atilde" * "\x00E3"
    ,"Auml" * "\x00C4"
    ,"auml" * "\x00E4"
    ,"awconint" * "\x2233"
    ,"awint" * "\x2A11"
    ,"backcong" * "\x224C"
    ,"backepsilon" * "\x03F6"
    ,"backprime" * "\x2035"
    ,"backsim" * "\x223D"
    ,"backsimeq" * "\x22CD"
    ,"Backslash" * "\x2216"
    ,"Barv" * "\x2AE7"
    ,"barvee" * "\x22BD"
    ,"barwed" * "\x2305"
    ,"Barwed" * "\x2306"
    ,"barwedge" * "\x2305"
    ,"bbrk" * "\x23B5"
    ,"bbrktbrk" * "\x23B6"
    ,"bcong" * "\x224C"
    ,"Bcy" * "\x0411"
    ,"bcy" * "\x0431"
    ,"bdquo" * "\x201E"
    ,"becaus" * "\x2235"
    ,"Because" * "\x2235"
    ,"because" * "\x2235"
    ,"bemptyv" * "\x29B0"
    ,"bepsi" * "\x03F6"
    ,"bernou" * "\x212C"
    ,"Bernoullis" * "\x212C"
    ,"Beta" * "\x0392"
    ,"beta" * "\x03B2"
    ,"beth" * "\x2136"
    ,"between" * "\x226C"
    ,"Bfr" * "\xD835\xDD05"
    ,"bfr" * "\xD835\xDD1F"
    ,"bigcap" * "\x22C2"
    ,"bigcirc" * "\x25EF"
    ,"bigcup" * "\x22C3"
    ,"bigodot" * "\x2A00"
    ,"bigoplus" * "\x2A01"
    ,"bigotimes" * "\x2A02"
    ,"bigsqcup" * "\x2A06"
    ,"bigstar" * "\x2605"
    ,"bigtriangledown" * "\x25BD"
    ,"bigtriangleup" * "\x25B3"
    ,"biguplus" * "\x2A04"
    ,"bigvee" * "\x22C1"
    ,"bigwedge" * "\x22C0"
    ,"bkarow" * "\x290D"
    ,"blacklozenge" * "\x29EB"
    ,"blacksquare" * "\x25AA"
    ,"blacktriangle" * "\x25B4"
    ,"blacktriangledown" * "\x25BE"
    ,"blacktriangleleft" * "\x25C2"
    ,"blacktriangleright" * "\x25B8"
    ,"blank" * "\x2423"
    ,"blk12" * "\x2592"
    ,"blk14" * "\x2591"
    ,"blk34" * "\x2593"
    ,"block" * "\x2588"
    ,"bne" * "\x003D\x20E5"
    ,"bnequiv" * "\x2261\x20E5"
    ,"bnot" * "\x2310"
    ,"bNot" * "\x2AED"
    ,"Bopf" * "\xD835\xDD39"
    ,"bopf" * "\xD835\xDD53"
    ,"bot" * "\x22A5"
    ,"bottom" * "\x22A5"
    ,"bowtie" * "\x22C8"
    ,"boxbox" * "\x29C9"
    ,"boxdl" * "\x2510"
    ,"boxdL" * "\x2555"
    ,"boxDl" * "\x2556"
    ,"boxDL" * "\x2557"
    ,"boxdr" * "\x250C"
    ,"boxdR" * "\x2552"
    ,"boxDr" * "\x2553"
    ,"boxDR" * "\x2554"
    ,"boxh" * "\x2500"
    ,"boxH" * "\x2550"
    ,"boxhd" * "\x252C"
    ,"boxHd" * "\x2564"
    ,"boxhD" * "\x2565"
    ,"boxHD" * "\x2566"
    ,"boxhu" * "\x2534"
    ,"boxHu" * "\x2567"
    ,"boxhU" * "\x2568"
    ,"boxHU" * "\x2569"
    ,"boxminus" * "\x229F"
    ,"boxplus" * "\x229E"
    ,"boxtimes" * "\x22A0"
    ,"boxul" * "\x2518"
    ,"boxuL" * "\x255B"
    ,"boxUl" * "\x255C"
    ,"boxUL" * "\x255D"
    ,"boxur" * "\x2514"
    ,"boxuR" * "\x2558"
    ,"boxUr" * "\x2559"
    ,"boxUR" * "\x255A"
    ,"boxv" * "\x2502"
    ,"boxV" * "\x2551"
    ,"boxvh" * "\x253C"
    ,"boxvH" * "\x256A"
    ,"boxVh" * "\x256B"
    ,"boxVH" * "\x256C"
    ,"boxvl" * "\x2524"
    ,"boxvL" * "\x2561"
    ,"boxVl" * "\x2562"
    ,"boxVL" * "\x2563"
    ,"boxvr" * "\x251C"
    ,"boxvR" * "\x255E"
    ,"boxVr" * "\x255F"
    ,"boxVR" * "\x2560"
    ,"bprime" * "\x2035"
    ,"Breve" * "\x02D8"
    ,"breve" * "\x02D8"
    ,"brvbar" * "\x00A6"
    ,"Bscr" * "\x212C"
    ,"bscr" * "\xD835\xDCB7"
    ,"bsemi" * "\x204F"
    ,"bsim" * "\x223D"
    ,"bsime" * "\x22CD"
    ,"bsol" * "\x005C"
    ,"bsolb" * "\x29C5"
    ,"bsolhsub" * "\x27C8"
    ,"bull" * "\x2022"
    ,"bullet" * "\x2022"
    ,"bump" * "\x224E"
    ,"bumpe" * "\x224F"
    ,"bumpE" * "\x2AAE"
    ,"Bumpeq" * "\x224E"
    ,"bumpeq" * "\x224F"
    ,"Cacute" * "\x0106"
    ,"cacute" * "\x0107"
    ,"cap" * "\x2229"
    ,"Cap" * "\x22D2"
    ,"capand" * "\x2A44"
    ,"capbrcup" * "\x2A49"
    ,"capcap" * "\x2A4B"
    ,"capcup" * "\x2A47"
    ,"capdot" * "\x2A40"
    ,"CapitalDifferentialD" * "\x2145"
    ,"caps" * "\x2229\xFE00"
    ,"caret" * "\x2041"
    ,"caron" * "\x02C7"
    ,"Cayleys" * "\x212D"
    ,"ccaps" * "\x2A4D"
    ,"Ccaron" * "\x010C"
    ,"ccaron" * "\x010D"
    ,"Ccedil" * "\x00C7"
    ,"ccedil" * "\x00E7"
    ,"Ccirc" * "\x0108"
    ,"ccirc" * "\x0109"
    ,"Cconint" * "\x2230"
    ,"ccups" * "\x2A4C"
    ,"ccupssm" * "\x2A50"
    ,"Cdot" * "\x010A"
    ,"cdot" * "\x010B"
    ,"cedil" * "\x00B8"
    ,"Cedilla" * "\x00B8"
    ,"cemptyv" * "\x29B2"
    ,"cent" * "\x00A2"
    ,"CenterDot" * "\x00B7"
    ,"centerdot" * "\x00B7"
    ,"Cfr" * "\x212D"
    ,"cfr" * "\xD835\xDD20"
    ,"CHcy" * "\x0427"
    ,"chcy" * "\x0447"
    ,"check" * "\x2713"
    ,"checkmark" * "\x2713"
    ,"Chi" * "\x03A7"
    ,"chi" * "\x03C7"
    ,"cir" * "\x25CB"
    ,"circ" * "\x02C6"
    ,"circeq" * "\x2257"
    ,"circlearrowleft" * "\x21BA"
    ,"circlearrowright" * "\x21BB"
    ,"circledast" * "\x229B"
    ,"circledcirc" * "\x229A"
    ,"circleddash" * "\x229D"
    ,"CircleDot" * "\x2299"
    ,"circledR" * "\x00AE"
    ,"circledS" * "\x24C8"
    ,"CircleMinus" * "\x2296"
    ,"CirclePlus" * "\x2295"
    ,"CircleTimes" * "\x2297"
    ,"cire" * "\x2257"
    ,"cirE" * "\x29C3"
    ,"cirfnint" * "\x2A10"
    ,"cirmid" * "\x2AEF"
    ,"cirscir" * "\x29C2"
    ,"ClockwiseContourIntegral" * "\x2232"
    ,"CloseCurlyDoubleQuote" * "\x201D"
    ,"CloseCurlyQuote" * "\x2019"
    ,"clubs" * "\x2663"
    ,"clubsuit" * "\x2663"
    ,"colon" * "\x003A"
    ,"Colon" * "\x2237"
    ,"colone" * "\x2254"
    ,"Colone" * "\x2A74"
    ,"coloneq" * "\x2254"
    ,"comma" * "\x002C"
    ,"commat" * "\x0040"
    ,"comp" * "\x2201"
    ,"compfn" * "\x2218"
    ,"complement" * "\x2201"
    ,"complexes" * "\x2102"
    ,"cong" * "\x2245"
    ,"congdot" * "\x2A6D"
    ,"Congruent" * "\x2261"
    ,"conint" * "\x222E"
    ,"Conint" * "\x222F"
    ,"ContourIntegral" * "\x222E"
    ,"Copf" * "\x2102"
    ,"copf" * "\xD835\xDD54"
    ,"coprod" * "\x2210"
    ,"Coproduct" * "\x2210"
    ,"COPY" * "\x00A9"
    ,"copy" * "\x00A9"
    ,"copysr" * "\x2117"
    ,"CounterClockwiseContourIntegral" * "\x2233"
    ,"crarr" * "\x21B5"
    ,"cross" * "\x2717"
    ,"Cross" * "\x2A2F"
    ,"Cscr" * "\xD835\xDC9E"
    ,"cscr" * "\xD835\xDCB8"
    ,"csub" * "\x2ACF"
    ,"csube" * "\x2AD1"
    ,"csup" * "\x2AD0"
    ,"csupe" * "\x2AD2"
    ,"ctdot" * "\x22EF"
    ,"cudarrl" * "\x2938"
    ,"cudarrr" * "\x2935"
    ,"cuepr" * "\x22DE"
    ,"cuesc" * "\x22DF"
    ,"cularr" * "\x21B6"
    ,"cularrp" * "\x293D"
    ,"cup" * "\x222A"
    ,"Cup" * "\x22D3"
    ,"cupbrcap" * "\x2A48"
    ,"CupCap" * "\x224D"
    ,"cupcap" * "\x2A46"
    ,"cupcup" * "\x2A4A"
    ,"cupdot" * "\x228D"
    ,"cupor" * "\x2A45"
    ,"cups" * "\x222A\xFE00"
    ,"curarr" * "\x21B7"
    ,"curarrm" * "\x293C"
    ,"curlyeqprec" * "\x22DE"
    ,"curlyeqsucc" * "\x22DF"
    ,"curlyvee" * "\x22CE"
    ,"curlywedge" * "\x22CF"
    ,"curren" * "\x00A4"
    ,"curvearrowleft" * "\x21B6"
    ,"curvearrowright" * "\x21B7"
    ,"cuvee" * "\x22CE"
    ,"cuwed" * "\x22CF"
    ,"cwconint" * "\x2232"
    ,"cwint" * "\x2231"
    ,"cylcty" * "\x232D"
    ,"dagger" * "\x2020"
    ,"Dagger" * "\x2021"
    ,"daleth" * "\x2138"
    ,"darr" * "\x2193"
    ,"Darr" * "\x21A1"
    ,"dArr" * "\x21D3"
    ,"dash" * "\x2010"
    ,"dashv" * "\x22A3"
    ,"Dashv" * "\x2AE4"
    ,"dbkarow" * "\x290F"
    ,"dblac" * "\x02DD"
    ,"Dcaron" * "\x010E"
    ,"dcaron" * "\x010F"
    ,"Dcy" * "\x0414"
    ,"dcy" * "\x0434"
    ,"DD" * "\x2145"
    ,"dd" * "\x2146"
    ,"ddagger" * "\x2021"
    ,"ddarr" * "\x21CA"
    ,"DDotrahd" * "\x2911"
    ,"ddotseq" * "\x2A77"
    ,"deg" * "\x00B0"
    ,"Del" * "\x2207"
    ,"Delta" * "\x0394"
    ,"delta" * "\x03B4"
    ,"demptyv" * "\x29B1"
    ,"dfisht" * "\x297F"
    ,"Dfr" * "\xD835\xDD07"
    ,"dfr" * "\xD835\xDD21"
    ,"dHar" * "\x2965"
    ,"dharl" * "\x21C3"
    ,"dharr" * "\x21C2"
    ,"DiacriticalAcute" * "\x00B4"
    ,"DiacriticalDot" * "\x02D9"
    ,"DiacriticalDoubleAcute" * "\x02DD"
    ,"DiacriticalGrave" * "\x0060"
    ,"DiacriticalTilde" * "\x02DC"
    ,"diam" * "\x22C4"
    ,"Diamond" * "\x22C4"
    ,"diamond" * "\x22C4"
    ,"diamondsuit" * "\x2666"
    ,"diams" * "\x2666"
    ,"die" * "\x00A8"
    ,"DifferentialD" * "\x2146"
    ,"digamma" * "\x03DD"
    ,"disin" * "\x22F2"
    ,"div" * "\x00F7"
    ,"divide" * "\x00F7"
    ,"divideontimes" * "\x22C7"
    ,"divonx" * "\x22C7"
    ,"DJcy" * "\x0402"
    ,"djcy" * "\x0452"
    ,"dlcorn" * "\x231E"
    ,"dlcrop" * "\x230D"
    ,"dollar" * "\x0024"
    ,"Dopf" * "\xD835\xDD3B"
    ,"dopf" * "\xD835\xDD55"
    ,"Dot" * "\x00A8"
    ,"dot" * "\x02D9"
    ,"DotDot" * "\x20DC"
    ,"doteq" * "\x2250"
    ,"doteqdot" * "\x2251"
    ,"DotEqual" * "\x2250"
    ,"dotminus" * "\x2238"
    ,"dotplus" * "\x2214"
    ,"dotsquare" * "\x22A1"
    ,"doublebarwedge" * "\x2306"
    ,"DoubleContourIntegral" * "\x222F"
    ,"DoubleDot" * "\x00A8"
    ,"DoubleDownArrow" * "\x21D3"
    ,"DoubleLeftArrow" * "\x21D0"
    ,"DoubleLeftRightArrow" * "\x21D4"
    ,"DoubleLeftTee" * "\x2AE4"
    ,"DoubleLongLeftArrow" * "\x27F8"
    ,"DoubleLongLeftRightArrow" * "\x27FA"
    ,"DoubleLongRightArrow" * "\x27F9"
    ,"DoubleRightArrow" * "\x21D2"
    ,"DoubleRightTee" * "\x22A8"
    ,"DoubleUpArrow" * "\x21D1"
    ,"DoubleUpDownArrow" * "\x21D5"
    ,"DoubleVerticalBar" * "\x2225"
    ,"DownArrow" * "\x2193"
    ,"downarrow" * "\x2193"
    ,"Downarrow" * "\x21D3"
    ,"DownArrowBar" * "\x2913"
    ,"DownArrowUpArrow" * "\x21F5"
    ,"DownBreve" * "\x0311"
    ,"downdownarrows" * "\x21CA"
    ,"downharpoonleft" * "\x21C3"
    ,"downharpoonright" * "\x21C2"
    ,"DownLeftRightVector" * "\x2950"
    ,"DownLeftTeeVector" * "\x295E"
    ,"DownLeftVector" * "\x21BD"
    ,"DownLeftVectorBar" * "\x2956"
    ,"DownRightTeeVector" * "\x295F"
    ,"DownRightVector" * "\x21C1"
    ,"DownRightVectorBar" * "\x2957"
    ,"DownTee" * "\x22A4"
    ,"DownTeeArrow" * "\x21A7"
    ,"drbkarow" * "\x2910"
    ,"drcorn" * "\x231F"
    ,"drcrop" * "\x230C"
    ,"Dscr" * "\xD835\xDC9F"
    ,"dscr" * "\xD835\xDCB9"
    ,"DScy" * "\x0405"
    ,"dscy" * "\x0455"
    ,"dsol" * "\x29F6"
    ,"Dstrok" * "\x0110"
    ,"dstrok" * "\x0111"
    ,"dtdot" * "\x22F1"
    ,"dtri" * "\x25BF"
    ,"dtrif" * "\x25BE"
    ,"duarr" * "\x21F5"
    ,"duhar" * "\x296F"
    ,"dwangle" * "\x29A6"
    ,"DZcy" * "\x040F"
    ,"dzcy" * "\x045F"
    ,"dzigrarr" * "\x27FF"
    ,"Eacute" * "\x00C9"
    ,"eacute" * "\x00E9"
    ,"easter" * "\x2A6E"
    ,"Ecaron" * "\x011A"
    ,"ecaron" * "\x011B"
    ,"ecir" * "\x2256"
    ,"Ecirc" * "\x00CA"
    ,"ecirc" * "\x00EA"
    ,"ecolon" * "\x2255"
    ,"Ecy" * "\x042D"
    ,"ecy" * "\x044D"
    ,"eDDot" * "\x2A77"
    ,"Edot" * "\x0116"
    ,"edot" * "\x0117"
    ,"eDot" * "\x2251"
    ,"ee" * "\x2147"
    ,"efDot" * "\x2252"
    ,"Efr" * "\xD835\xDD08"
    ,"efr" * "\xD835\xDD22"
    ,"eg" * "\x2A9A"
    ,"Egrave" * "\x00C8"
    ,"egrave" * "\x00E8"
    ,"egs" * "\x2A96"
    ,"egsdot" * "\x2A98"
    ,"el" * "\x2A99"
    ,"Element" * "\x2208"
    ,"elinters" * "\x23E7"
    ,"ell" * "\x2113"
    ,"els" * "\x2A95"
    ,"elsdot" * "\x2A97"
    ,"Emacr" * "\x0112"
    ,"emacr" * "\x0113"
    ,"empty" * "\x2205"
    ,"emptyset" * "\x2205"
    ,"EmptySmallSquare" * "\x25FB"
    ,"emptyv" * "\x2205"
    ,"EmptyVerySmallSquare" * "\x25AB"
    ,"emsp" * "\x2003"
    ,"emsp13" * "\x2004"
    ,"emsp14" * "\x2005"
    ,"ENG" * "\x014A"
    ,"eng" * "\x014B"
    ,"ensp" * "\x2002"
    ,"Eogon" * "\x0118"
    ,"eogon" * "\x0119"
    ,"Eopf" * "\xD835\xDD3C"
    ,"eopf" * "\xD835\xDD56"
    ,"epar" * "\x22D5"
    ,"eparsl" * "\x29E3"
    ,"eplus" * "\x2A71"
    ,"epsi" * "\x03B5"
    ,"Epsilon" * "\x0395"
    ,"epsilon" * "\x03B5"
    ,"epsiv" * "\x03F5"
    ,"eqcirc" * "\x2256"
    ,"eqcolon" * "\x2255"
    ,"eqsim" * "\x2242"
    ,"eqslantgtr" * "\x2A96"
    ,"eqslantless" * "\x2A95"
    ,"Equal" * "\x2A75"
    ,"equals" * "\x003D"
    ,"EqualTilde" * "\x2242"
    ,"equest" * "\x225F"
    ,"Equilibrium" * "\x21CC"
    ,"equiv" * "\x2261"
    ,"equivDD" * "\x2A78"
    ,"eqvparsl" * "\x29E5"
    ,"erarr" * "\x2971"
    ,"erDot" * "\x2253"
    ,"escr" * "\x212F"
    ,"Escr" * "\x2130"
    ,"esdot" * "\x2250"
    ,"esim" * "\x2242"
    ,"Esim" * "\x2A73"
    ,"Eta" * "\x0397"
    ,"eta" * "\x03B7"
    ,"ETH" * "\x00D0"
    ,"eth" * "\x00F0"
    ,"Euml" * "\x00CB"
    ,"euml" * "\x00EB"
    ,"euro" * "\x20AC"
    ,"excl" * "\x0021"
    ,"exist" * "\x2203"
    ,"Exists" * "\x2203"
    ,"expectation" * "\x2130"
    ,"ExponentialE" * "\x2147"
    ,"exponentiale" * "\x2147"
    ,"fallingdotseq" * "\x2252"
    ,"Fcy" * "\x0424"
    ,"fcy" * "\x0444"
    ,"female" * "\x2640"
    ,"ffilig" * "\xFB03"
    ,"fflig" * "\xFB00"
    ,"ffllig" * "\xFB04"
    ,"Ffr" * "\xD835\xDD09"
    ,"ffr" * "\xD835\xDD23"
    ,"filig" * "\xFB01"
    ,"FilledSmallSquare" * "\x25FC"
    ,"FilledVerySmallSquare" * "\x25AA"
    ,"fjlig" * "\x0066\x006A"
    ,"flat" * "\x266D"
    ,"fllig" * "\xFB02"
    ,"fltns" * "\x25B1"
    ,"fnof" * "\x0192"
    ,"Fopf" * "\xD835\xDD3D"
    ,"fopf" * "\xD835\xDD57"
    ,"ForAll" * "\x2200"
    ,"forall" * "\x2200"
    ,"fork" * "\x22D4"
    ,"forkv" * "\x2AD9"
    ,"Fouriertrf" * "\x2131"
    ,"fpartint" * "\x2A0D"
    ,"frac12" * "\x00BD"
    ,"frac13" * "\x2153"
    ,"frac14" * "\x00BC"
    ,"frac15" * "\x2155"
    ,"frac16" * "\x2159"
    ,"frac18" * "\x215B"
    ,"frac23" * "\x2154"
    ,"frac25" * "\x2156"
    ,"frac34" * "\x00BE"
    ,"frac35" * "\x2157"
    ,"frac38" * "\x215C"
    ,"frac45" * "\x2158"
    ,"frac56" * "\x215A"
    ,"frac58" * "\x215D"
    ,"frac78" * "\x215E"
    ,"frasl" * "\x2044"
    ,"frown" * "\x2322"
    ,"Fscr" * "\x2131"
    ,"fscr" * "\xD835\xDCBB"
    ,"gacute" * "\x01F5"
    ,"Gamma" * "\x0393"
    ,"gamma" * "\x03B3"
    ,"Gammad" * "\x03DC"
    ,"gammad" * "\x03DD"
    ,"gap" * "\x2A86"
    ,"Gbreve" * "\x011E"
    ,"gbreve" * "\x011F"
    ,"Gcedil" * "\x0122"
    ,"Gcirc" * "\x011C"
    ,"gcirc" * "\x011D"
    ,"Gcy" * "\x0413"
    ,"gcy" * "\x0433"
    ,"Gdot" * "\x0120"
    ,"gdot" * "\x0121"
    ,"ge" * "\x2265"
    ,"gE" * "\x2267"
    ,"gel" * "\x22DB"
    ,"gEl" * "\x2A8C"
    ,"geq" * "\x2265"
    ,"geqq" * "\x2267"
    ,"geqslant" * "\x2A7E"
    ,"ges" * "\x2A7E"
    ,"gescc" * "\x2AA9"
    ,"gesdot" * "\x2A80"
    ,"gesdoto" * "\x2A82"
    ,"gesdotol" * "\x2A84"
    ,"gesl" * "\x22DB\xFE00"
    ,"gesles" * "\x2A94"
    ,"Gfr" * "\xD835\xDD0A"
    ,"gfr" * "\xD835\xDD24"
    ,"gg" * "\x226B"
    ,"Gg" * "\x22D9"
    ,"ggg" * "\x22D9"
    ,"gimel" * "\x2137"
    ,"GJcy" * "\x0403"
    ,"gjcy" * "\x0453"
    ,"gl" * "\x2277"
    ,"gla" * "\x2AA5"
    ,"glE" * "\x2A92"
    ,"glj" * "\x2AA4"
    ,"gnap" * "\x2A8A"
    ,"gnapprox" * "\x2A8A"
    ,"gnE" * "\x2269"
    ,"gne" * "\x2A88"
    ,"gneq" * "\x2A88"
    ,"gneqq" * "\x2269"
    ,"gnsim" * "\x22E7"
    ,"Gopf" * "\xD835\xDD3E"
    ,"gopf" * "\xD835\xDD58"
    ,"grave" * "\x0060"
    ,"GreaterEqual" * "\x2265"
    ,"GreaterEqualLess" * "\x22DB"
    ,"GreaterFullEqual" * "\x2267"
    ,"GreaterGreater" * "\x2AA2"
    ,"GreaterLess" * "\x2277"
    ,"GreaterSlantEqual" * "\x2A7E"
    ,"GreaterTilde" * "\x2273"
    ,"gscr" * "\x210A"
    ,"Gscr" * "\xD835\xDCA2"
    ,"gsim" * "\x2273"
    ,"gsime" * "\x2A8E"
    ,"gsiml" * "\x2A90"
    ,"GT" * "\x003E"
    ,"gt" * "\x003E"
    ,"Gt" * "\x226B"
    ,"gtcc" * "\x2AA7"
    ,"gtcir" * "\x2A7A"
    ,"gtdot" * "\x22D7"
    ,"gtlPar" * "\x2995"
    ,"gtquest" * "\x2A7C"
    ,"gtrapprox" * "\x2A86"
    ,"gtrarr" * "\x2978"
    ,"gtrdot" * "\x22D7"
    ,"gtreqless" * "\x22DB"
    ,"gtreqqless" * "\x2A8C"
    ,"gtrless" * "\x2277"
    ,"gtrsim" * "\x2273"
    ,"gvertneqq" * "\x2269\xFE00"
    ,"gvnE" * "\x2269\xFE00"
    ,"Hacek" * "\x02C7"
    ,"hairsp" * "\x200A"
    ,"half" * "\x00BD"
    ,"hamilt" * "\x210B"
    ,"HARDcy" * "\x042A"
    ,"hardcy" * "\x044A"
    ,"harr" * "\x2194"
    ,"hArr" * "\x21D4"
    ,"harrcir" * "\x2948"
    ,"harrw" * "\x21AD"
    ,"Hat" * "\x005E"
    ,"hbar" * "\x210F"
    ,"Hcirc" * "\x0124"
    ,"hcirc" * "\x0125"
    ,"hearts" * "\x2665"
    ,"heartsuit" * "\x2665"
    ,"hellip" * "\x2026"
    ,"hercon" * "\x22B9"
    ,"Hfr" * "\x210C"
    ,"hfr" * "\xD835\xDD25"
    ,"HilbertSpace" * "\x210B"
    ,"hksearow" * "\x2925"
    ,"hkswarow" * "\x2926"
    ,"hoarr" * "\x21FF"
    ,"homtht" * "\x223B"
    ,"hookleftarrow" * "\x21A9"
    ,"hookrightarrow" * "\x21AA"
    ,"Hopf" * "\x210D"
    ,"hopf" * "\xD835\xDD59"
    ,"horbar" * "\x2015"
    ,"HorizontalLine" * "\x2500"
    ,"Hscr" * "\x210B"
    ,"hscr" * "\xD835\xDCBD"
    ,"hslash" * "\x210F"
    ,"Hstrok" * "\x0126"
    ,"hstrok" * "\x0127"
    ,"HumpDownHump" * "\x224E"
    ,"HumpEqual" * "\x224F"
    ,"hybull" * "\x2043"
    ,"hyphen" * "\x2010"
    ,"Iacute" * "\x00CD"
    ,"iacute" * "\x00ED"
    ,"ic" * "\x2063"
    ,"Icirc" * "\x00CE"
    ,"icirc" * "\x00EE"
    ,"Icy" * "\x0418"
    ,"icy" * "\x0438"
    ,"Idot" * "\x0130"
    ,"IEcy" * "\x0415"
    ,"iecy" * "\x0435"
    ,"iexcl" * "\x00A1"
    ,"iff" * "\x21D4"
    ,"Ifr" * "\x2111"
    ,"ifr" * "\xD835\xDD26"
    ,"Igrave" * "\x00CC"
    ,"igrave" * "\x00EC"
    ,"ii" * "\x2148"
    ,"iiiint" * "\x2A0C"
    ,"iiint" * "\x222D"
    ,"iinfin" * "\x29DC"
    ,"iiota" * "\x2129"
    ,"IJlig" * "\x0132"
    ,"ijlig" * "\x0133"
    ,"Im" * "\x2111"
    ,"Imacr" * "\x012A"
    ,"imacr" * "\x012B"
    ,"image" * "\x2111"
    ,"ImaginaryI" * "\x2148"
    ,"imagline" * "\x2110"
    ,"imagpart" * "\x2111"
    ,"imath" * "\x0131"
    ,"imof" * "\x22B7"
    ,"imped" * "\x01B5"
    ,"Implies" * "\x21D2"
    ,"in" * "\x2208"
    ,"incare" * "\x2105"
    ,"infin" * "\x221E"
    ,"infintie" * "\x29DD"
    ,"inodot" * "\x0131"
    ,"int" * "\x222B"
    ,"Int" * "\x222C"
    ,"intcal" * "\x22BA"
    ,"integers" * "\x2124"
    ,"Integral" * "\x222B"
    ,"intercal" * "\x22BA"
    ,"Intersection" * "\x22C2"
    ,"intlarhk" * "\x2A17"
    ,"intprod" * "\x2A3C"
    ,"InvisibleComma" * "\x2063"
    ,"InvisibleTimes" * "\x2062"
    ,"IOcy" * "\x0401"
    ,"iocy" * "\x0451"
    ,"Iogon" * "\x012E"
    ,"iogon" * "\x012F"
    ,"Iopf" * "\xD835\xDD40"
    ,"iopf" * "\xD835\xDD5A"
    ,"Iota" * "\x0399"
    ,"iota" * "\x03B9"
    ,"iprod" * "\x2A3C"
    ,"iquest" * "\x00BF"
    ,"Iscr" * "\x2110"
    ,"iscr" * "\xD835\xDCBE"
    ,"isin" * "\x2208"
    ,"isindot" * "\x22F5"
    ,"isinE" * "\x22F9"
    ,"isins" * "\x22F4"
    ,"isinsv" * "\x22F3"
    ,"isinv" * "\x2208"
    ,"it" * "\x2062"
    ,"Itilde" * "\x0128"
    ,"itilde" * "\x0129"
    ,"Iukcy" * "\x0406"
    ,"iukcy" * "\x0456"
    ,"Iuml" * "\x00CF"
    ,"iuml" * "\x00EF"
    ,"Jcirc" * "\x0134"
    ,"jcirc" * "\x0135"
    ,"Jcy" * "\x0419"
    ,"jcy" * "\x0439"
    ,"Jfr" * "\xD835\xDD0D"
    ,"jfr" * "\xD835\xDD27"
    ,"jmath" * "\x0237"
    ,"Jopf" * "\xD835\xDD41"
    ,"jopf" * "\xD835\xDD5B"
    ,"Jscr" * "\xD835\xDCA5"
    ,"jscr" * "\xD835\xDCBF"
    ,"Jsercy" * "\x0408"
    ,"jsercy" * "\x0458"
    ,"Jukcy" * "\x0404"
    ,"jukcy" * "\x0454"
    ,"Kappa" * "\x039A"
    ,"kappa" * "\x03BA"
    ,"kappav" * "\x03F0"
    ,"Kcedil" * "\x0136"
    ,"kcedil" * "\x0137"
    ,"Kcy" * "\x041A"
    ,"kcy" * "\x043A"
    ,"Kfr" * "\xD835\xDD0E"
    ,"kfr" * "\xD835\xDD28"
    ,"kgreen" * "\x0138"
    ,"KHcy" * "\x0425"
    ,"khcy" * "\x0445"
    ,"KJcy" * "\x040C"
    ,"kjcy" * "\x045C"
    ,"Kopf" * "\xD835\xDD42"
    ,"kopf" * "\xD835\xDD5C"
    ,"Kscr" * "\xD835\xDCA6"
    ,"kscr" * "\xD835\xDCC0"
    ,"lAarr" * "\x21DA"
    ,"Lacute" * "\x0139"
    ,"lacute" * "\x013A"
    ,"laemptyv" * "\x29B4"
    ,"lagran" * "\x2112"
    ,"Lambda" * "\x039B"
    ,"lambda" * "\x03BB"
    ,"lang" * "\x27E8"
    ,"Lang" * "\x27EA"
    ,"langd" * "\x2991"
    ,"langle" * "\x27E8"
    ,"lap" * "\x2A85"
    ,"Laplacetrf" * "\x2112"
    ,"laquo" * "\x00AB"
    ,"larr" * "\x2190"
    ,"Larr" * "\x219E"
    ,"lArr" * "\x21D0"
    ,"larrb" * "\x21E4"
    ,"larrbfs" * "\x291F"
    ,"larrfs" * "\x291D"
    ,"larrhk" * "\x21A9"
    ,"larrlp" * "\x21AB"
    ,"larrpl" * "\x2939"
    ,"larrsim" * "\x2973"
    ,"larrtl" * "\x21A2"
    ,"lat" * "\x2AAB"
    ,"latail" * "\x2919"
    ,"lAtail" * "\x291B"
    ,"late" * "\x2AAD"
    ,"lates" * "\x2AAD\xFE00"
    ,"lbarr" * "\x290C"
    ,"lBarr" * "\x290E"
    ,"lbbrk" * "\x2772"
    ,"lbrace" * "\x007B"
    ,"lbrack" * "\x005B"
    ,"lbrke" * "\x298B"
    ,"lbrksld" * "\x298F"
    ,"lbrkslu" * "\x298D"
    ,"Lcaron" * "\x013D"
    ,"lcaron" * "\x013E"
    ,"Lcedil" * "\x013B"
    ,"lcedil" * "\x013C"
    ,"lceil" * "\x2308"
    ,"lcub" * "\x007B"
    ,"Lcy" * "\x041B"
    ,"lcy" * "\x043B"
    ,"ldca" * "\x2936"
    ,"ldquo" * "\x201C"
    ,"ldquor" * "\x201E"
    ,"ldrdhar" * "\x2967"
    ,"ldrushar" * "\x294B"
    ,"ldsh" * "\x21B2"
    ,"le" * "\x2264"
    ,"lE" * "\x2266"
    ,"LeftAngleBracket" * "\x27E8"
    ,"LeftArrow" * "\x2190"
    ,"leftarrow" * "\x2190"
    ,"Leftarrow" * "\x21D0"
    ,"LeftArrowBar" * "\x21E4"
    ,"LeftArrowRightArrow" * "\x21C6"
    ,"leftarrowtail" * "\x21A2"
    ,"LeftCeiling" * "\x2308"
    ,"LeftDoubleBracket" * "\x27E6"
    ,"LeftDownTeeVector" * "\x2961"
    ,"LeftDownVector" * "\x21C3"
    ,"LeftDownVectorBar" * "\x2959"
    ,"LeftFloor" * "\x230A"
    ,"leftharpoondown" * "\x21BD"
    ,"leftharpoonup" * "\x21BC"
    ,"leftleftarrows" * "\x21C7"
    ,"LeftRightArrow" * "\x2194"
    ,"leftrightarrow" * "\x2194"
    ,"Leftrightarrow" * "\x21D4"
    ,"leftrightarrows" * "\x21C6"
    ,"leftrightharpoons" * "\x21CB"
    ,"leftrightsquigarrow" * "\x21AD"
    ,"LeftRightVector" * "\x294E"
    ,"LeftTee" * "\x22A3"
    ,"LeftTeeArrow" * "\x21A4"
    ,"LeftTeeVector" * "\x295A"
    ,"leftthreetimes" * "\x22CB"
    ,"LeftTriangle" * "\x22B2"
    ,"LeftTriangleBar" * "\x29CF"
    ,"LeftTriangleEqual" * "\x22B4"
    ,"LeftUpDownVector" * "\x2951"
    ,"LeftUpTeeVector" * "\x2960"
    ,"LeftUpVector" * "\x21BF"
    ,"LeftUpVectorBar" * "\x2958"
    ,"LeftVector" * "\x21BC"
    ,"LeftVectorBar" * "\x2952"
    ,"leg" * "\x22DA"
    ,"lEg" * "\x2A8B"
    ,"leq" * "\x2264"
    ,"leqq" * "\x2266"
    ,"leqslant" * "\x2A7D"
    ,"les" * "\x2A7D"
    ,"lescc" * "\x2AA8"
    ,"lesdot" * "\x2A7F"
    ,"lesdoto" * "\x2A81"
    ,"lesdotor" * "\x2A83"
    ,"lesg" * "\x22DA\xFE00"
    ,"lesges" * "\x2A93"
    ,"lessapprox" * "\x2A85"
    ,"lessdot" * "\x22D6"
    ,"lesseqgtr" * "\x22DA"
    ,"lesseqqgtr" * "\x2A8B"
    ,"LessEqualGreater" * "\x22DA"
    ,"LessFullEqual" * "\x2266"
    ,"LessGreater" * "\x2276"
    ,"lessgtr" * "\x2276"
    ,"LessLess" * "\x2AA1"
    ,"lesssim" * "\x2272"
    ,"LessSlantEqual" * "\x2A7D"
    ,"LessTilde" * "\x2272"
    ,"lfisht" * "\x297C"
    ,"lfloor" * "\x230A"
    ,"Lfr" * "\xD835\xDD0F"
    ,"lfr" * "\xD835\xDD29"
    ,"lg" * "\x2276"
    ,"lgE" * "\x2A91"
    ,"lHar" * "\x2962"
    ,"lhard" * "\x21BD"
    ,"lharu" * "\x21BC"
    ,"lharul" * "\x296A"
    ,"lhblk" * "\x2584"
    ,"LJcy" * "\x0409"
    ,"ljcy" * "\x0459"
    ,"ll" * "\x226A"
    ,"Ll" * "\x22D8"
    ,"llarr" * "\x21C7"
    ,"llcorner" * "\x231E"
    ,"Lleftarrow" * "\x21DA"
    ,"llhard" * "\x296B"
    ,"lltri" * "\x25FA"
    ,"Lmidot" * "\x013F"
    ,"lmidot" * "\x0140"
    ,"lmoust" * "\x23B0"
    ,"lmoustache" * "\x23B0"
    ,"lnap" * "\x2A89"
    ,"lnapprox" * "\x2A89"
    ,"lnE" * "\x2268"
    ,"lne" * "\x2A87"
    ,"lneq" * "\x2A87"
    ,"lneqq" * "\x2268"
    ,"lnsim" * "\x22E6"
    ,"loang" * "\x27EC"
    ,"loarr" * "\x21FD"
    ,"lobrk" * "\x27E6"
    ,"LongLeftArrow" * "\x27F5"
    ,"longleftarrow" * "\x27F5"
    ,"Longleftarrow" * "\x27F8"
    ,"LongLeftRightArrow" * "\x27F7"
    ,"longleftrightarrow" * "\x27F7"
    ,"Longleftrightarrow" * "\x27FA"
    ,"longmapsto" * "\x27FC"
    ,"LongRightArrow" * "\x27F6"
    ,"longrightarrow" * "\x27F6"
    ,"Longrightarrow" * "\x27F9"
    ,"looparrowleft" * "\x21AB"
    ,"looparrowright" * "\x21AC"
    ,"lopar" * "\x2985"
    ,"Lopf" * "\xD835\xDD43"
    ,"lopf" * "\xD835\xDD5D"
    ,"loplus" * "\x2A2D"
    ,"lotimes" * "\x2A34"
    ,"lowast" * "\x2217"
    ,"lowbar" * "\x005F"
    ,"LowerLeftArrow" * "\x2199"
    ,"LowerRightArrow" * "\x2198"
    ,"loz" * "\x25CA"
    ,"lozenge" * "\x25CA"
    ,"lozf" * "\x29EB"
    ,"lpar" * "\x0028"
    ,"lparlt" * "\x2993"
    ,"lrarr" * "\x21C6"
    ,"lrcorner" * "\x231F"
    ,"lrhar" * "\x21CB"
    ,"lrhard" * "\x296D"
    ,"lrm" * "\x200E"
    ,"lrtri" * "\x22BF"
    ,"lsaquo" * "\x2039"
    ,"Lscr" * "\x2112"
    ,"lscr" * "\xD835\xDCC1"
    ,"Lsh" * "\x21B0"
    ,"lsh" * "\x21B0"
    ,"lsim" * "\x2272"
    ,"lsime" * "\x2A8D"
    ,"lsimg" * "\x2A8F"
    ,"lsqb" * "\x005B"
    ,"lsquo" * "\x2018"
    ,"lsquor" * "\x201A"
    ,"Lstrok" * "\x0141"
    ,"lstrok" * "\x0142"
    ,"LT" * "\x003C"
    ,"lt" * "\x003C"
    ,"Lt" * "\x226A"
    ,"ltcc" * "\x2AA6"
    ,"ltcir" * "\x2A79"
    ,"ltdot" * "\x22D6"
    ,"lthree" * "\x22CB"
    ,"ltimes" * "\x22C9"
    ,"ltlarr" * "\x2976"
    ,"ltquest" * "\x2A7B"
    ,"ltri" * "\x25C3"
    ,"ltrie" * "\x22B4"
    ,"ltrif" * "\x25C2"
    ,"ltrPar" * "\x2996"
    ,"lurdshar" * "\x294A"
    ,"luruhar" * "\x2966"
    ,"lvertneqq" * "\x2268\xFE00"
    ,"lvnE" * "\x2268\xFE00"
    ,"macr" * "\x00AF"
    ,"male" * "\x2642"
    ,"malt" * "\x2720"
    ,"maltese" * "\x2720"
    ,"map" * "\x21A6"
    ,"Map" * "\x2905"
    ,"mapsto" * "\x21A6"
    ,"mapstodown" * "\x21A7"
    ,"mapstoleft" * "\x21A4"
    ,"mapstoup" * "\x21A5"
    ,"marker" * "\x25AE"
    ,"mcomma" * "\x2A29"
    ,"Mcy" * "\x041C"
    ,"mcy" * "\x043C"
    ,"mdash" * "\x2014"
    ,"mDDot" * "\x223A"
    ,"measuredangle" * "\x2221"
    ,"MediumSpace" * "\x205F"
    ,"Mellintrf" * "\x2133"
    ,"Mfr" * "\xD835\xDD10"
    ,"mfr" * "\xD835\xDD2A"
    ,"mho" * "\x2127"
    ,"micro" * "\x00B5"
    ,"mid" * "\x2223"
    ,"midast" * "\x002A"
    ,"midcir" * "\x2AF0"
    ,"middot" * "\x00B7"
    ,"minus" * "\x2212"
    ,"minusb" * "\x229F"
    ,"minusd" * "\x2238"
    ,"minusdu" * "\x2A2A"
    ,"MinusPlus" * "\x2213"
    ,"mlcp" * "\x2ADB"
    ,"mldr" * "\x2026"
    ,"mnplus" * "\x2213"
    ,"models" * "\x22A7"
    ,"Mopf" * "\xD835\xDD44"
    ,"mopf" * "\xD835\xDD5E"
    ,"mp" * "\x2213"
    ,"Mscr" * "\x2133"
    ,"mscr" * "\xD835\xDCC2"
    ,"mstpos" * "\x223E"
    ,"Mu" * "\x039C"
    ,"mu" * "\x03BC"
    ,"multimap" * "\x22B8"
    ,"mumap" * "\x22B8"
    ,"nabla" * "\x2207"
    ,"Nacute" * "\x0143"
    ,"nacute" * "\x0144"
    ,"nang" * "\x2220\x20D2"
    ,"nap" * "\x2249"
    ,"napE" * "\x2A70\x0338"
    ,"napid" * "\x224B\x0338"
    ,"napos" * "\x0149"
    ,"napprox" * "\x2249"
    ,"natur" * "\x266E"
    ,"natural" * "\x266E"
    ,"naturals" * "\x2115"
    ,"nbsp" * "\x00A0"
    ,"nbump" * "\x224E\x0338"
    ,"nbumpe" * "\x224F\x0338"
    ,"ncap" * "\x2A43"
    ,"Ncaron" * "\x0147"
    ,"ncaron" * "\x0148"
    ,"Ncedil" * "\x0145"
    ,"ncedil" * "\x0146"
    ,"ncong" * "\x2247"
    ,"ncongdot" * "\x2A6D\x0338"
    ,"ncup" * "\x2A42"
    ,"Ncy" * "\x041D"
    ,"ncy" * "\x043D"
    ,"ndash" * "\x2013"
    ,"ne" * "\x2260"
    ,"nearhk" * "\x2924"
    ,"nearr" * "\x2197"
    ,"neArr" * "\x21D7"
    ,"nearrow" * "\x2197"
    ,"nedot" * "\x2250\x0338"
    ,"NegativeMediumSpace" * "\x200B"
    ,"NegativeThickSpace" * "\x200B"
    ,"NegativeThinSpace" * "\x200B"
    ,"NegativeVeryThinSpace" * "\x200B"
    ,"nequiv" * "\x2262"
    ,"nesear" * "\x2928"
    ,"nesim" * "\x2242\x0338"
    ,"NestedGreaterGreater" * "\x226B"
    ,"NestedLessLess" * "\x226A"
    ,"NewLine" * "\x000A"
    ,"nexist" * "\x2204"
    ,"nexists" * "\x2204"
    ,"Nfr" * "\xD835\xDD11"
    ,"nfr" * "\xD835\xDD2B"
    ,"ngE" * "\x2267\x0338"
    ,"nge" * "\x2271"
    ,"ngeq" * "\x2271"
    ,"ngeqq" * "\x2267\x0338"
    ,"ngeqslant" * "\x2A7E\x0338"
    ,"nges" * "\x2A7E\x0338"
    ,"nGg" * "\x22D9\x0338"
    ,"ngsim" * "\x2275"
    ,"nGt" * "\x226B\x20D2"
    ,"ngt" * "\x226F"
    ,"ngtr" * "\x226F"
    ,"nGtv" * "\x226B\x0338"
    ,"nharr" * "\x21AE"
    ,"nhArr" * "\x21CE"
    ,"nhpar" * "\x2AF2"
    ,"ni" * "\x220B"
    ,"nis" * "\x22FC"
    ,"nisd" * "\x22FA"
    ,"niv" * "\x220B"
    ,"NJcy" * "\x040A"
    ,"njcy" * "\x045A"
    ,"nlarr" * "\x219A"
    ,"nlArr" * "\x21CD"
    ,"nldr" * "\x2025"
    ,"nlE" * "\x2266\x0338"
    ,"nle" * "\x2270"
    ,"nleftarrow" * "\x219A"
    ,"nLeftarrow" * "\x21CD"
    ,"nleftrightarrow" * "\x21AE"
    ,"nLeftrightarrow" * "\x21CE"
    ,"nleq" * "\x2270"
    ,"nleqq" * "\x2266\x0338"
    ,"nleqslant" * "\x2A7D\x0338"
    ,"nles" * "\x2A7D\x0338"
    ,"nless" * "\x226E"
    ,"nLl" * "\x22D8\x0338"
    ,"nlsim" * "\x2274"
    ,"nLt" * "\x226A\x20D2"
    ,"nlt" * "\x226E"
    ,"nltri" * "\x22EA"
    ,"nltrie" * "\x22EC"
    ,"nLtv" * "\x226A\x0338"
    ,"nmid" * "\x2224"
    ,"NoBreak" * "\x2060"
    ,"NonBreakingSpace" * "\x00A0"
    ,"Nopf" * "\x2115"
    ,"nopf" * "\xD835\xDD5F"
    ,"not" * "\x00AC"
    ,"Not" * "\x2AEC"
    ,"NotCongruent" * "\x2262"
    ,"NotCupCap" * "\x226D"
    ,"NotDoubleVerticalBar" * "\x2226"
    ,"NotElement" * "\x2209"
    ,"NotEqual" * "\x2260"
    ,"NotEqualTilde" * "\x2242\x0338"
    ,"NotExists" * "\x2204"
    ,"NotGreater" * "\x226F"
    ,"NotGreaterEqual" * "\x2271"
    ,"NotGreaterFullEqual" * "\x2267\x0338"
    ,"NotGreaterGreater" * "\x226B\x0338"
    ,"NotGreaterLess" * "\x2279"
    ,"NotGreaterSlantEqual" * "\x2A7E\x0338"
    ,"NotGreaterTilde" * "\x2275"
    ,"NotHumpDownHump" * "\x224E\x0338"
    ,"NotHumpEqual" * "\x224F\x0338"
    ,"notin" * "\x2209"
    ,"notindot" * "\x22F5\x0338"
    ,"notinE" * "\x22F9\x0338"
    ,"notinva" * "\x2209"
    ,"notinvb" * "\x22F7"
    ,"notinvc" * "\x22F6"
    ,"NotLeftTriangle" * "\x22EA"
    ,"NotLeftTriangleBar" * "\x29CF\x0338"
    ,"NotLeftTriangleEqual" * "\x22EC"
    ,"NotLess" * "\x226E"
    ,"NotLessEqual" * "\x2270"
    ,"NotLessGreater" * "\x2278"
    ,"NotLessLess" * "\x226A\x0338"
    ,"NotLessSlantEqual" * "\x2A7D\x0338"
    ,"NotLessTilde" * "\x2274"
    ,"NotNestedGreaterGreater" * "\x2AA2\x0338"
    ,"NotNestedLessLess" * "\x2AA1\x0338"
    ,"notni" * "\x220C"
    ,"notniva" * "\x220C"
    ,"notnivb" * "\x22FE"
    ,"notnivc" * "\x22FD"
    ,"NotPrecedes" * "\x2280"
    ,"NotPrecedesEqual" * "\x2AAF\x0338"
    ,"NotPrecedesSlantEqual" * "\x22E0"
    ,"NotReverseElement" * "\x220C"
    ,"NotRightTriangle" * "\x22EB"
    ,"NotRightTriangleBar" * "\x29D0\x0338"
    ,"NotRightTriangleEqual" * "\x22ED"
    ,"NotSquareSubset" * "\x228F\x0338"
    ,"NotSquareSubsetEqual" * "\x22E2"
    ,"NotSquareSuperset" * "\x2290\x0338"
    ,"NotSquareSupersetEqual" * "\x22E3"
    ,"NotSubset" * "\x2282\x20D2"
    ,"NotSubsetEqual" * "\x2288"
    ,"NotSucceeds" * "\x2281"
    ,"NotSucceedsEqual" * "\x2AB0\x0338"
    ,"NotSucceedsSlantEqual" * "\x22E1"
    ,"NotSucceedsTilde" * "\x227F\x0338"
    ,"NotSuperset" * "\x2283\x20D2"
    ,"NotSupersetEqual" * "\x2289"
    ,"NotTilde" * "\x2241"
    ,"NotTildeEqual" * "\x2244"
    ,"NotTildeFullEqual" * "\x2247"
    ,"NotTildeTilde" * "\x2249"
    ,"NotVerticalBar" * "\x2224"
    ,"npar" * "\x2226"
    ,"nparallel" * "\x2226"
    ,"nparsl" * "\x2AFD\x20E5"
    ,"npart" * "\x2202\x0338"
    ,"npolint" * "\x2A14"
    ,"npr" * "\x2280"
    ,"nprcue" * "\x22E0"
    ,"npre" * "\x2AAF\x0338"
    ,"nprec" * "\x2280"
    ,"npreceq" * "\x2AAF\x0338"
    ,"nrarr" * "\x219B"
    ,"nrArr" * "\x21CF"
    ,"nrarrc" * "\x2933\x0338"
    ,"nrarrw" * "\x219D\x0338"
    ,"nrightarrow" * "\x219B"
    ,"nRightarrow" * "\x21CF"
    ,"nrtri" * "\x22EB"
    ,"nrtrie" * "\x22ED"
    ,"nsc" * "\x2281"
    ,"nsccue" * "\x22E1"
    ,"nsce" * "\x2AB0\x0338"
    ,"Nscr" * "\xD835\xDCA9"
    ,"nscr" * "\xD835\xDCC3"
    ,"nshortmid" * "\x2224"
    ,"nshortparallel" * "\x2226"
    ,"nsim" * "\x2241"
    ,"nsime" * "\x2244"
    ,"nsimeq" * "\x2244"
    ,"nsmid" * "\x2224"
    ,"nspar" * "\x2226"
    ,"nsqsube" * "\x22E2"
    ,"nsqsupe" * "\x22E3"
    ,"nsub" * "\x2284"
    ,"nsube" * "\x2288"
    ,"nsubE" * "\x2AC5\x0338"
    ,"nsubset" * "\x2282\x20D2"
    ,"nsubseteq" * "\x2288"
    ,"nsubseteqq" * "\x2AC5\x0338"
    ,"nsucc" * "\x2281"
    ,"nsucceq" * "\x2AB0\x0338"
    ,"nsup" * "\x2285"
    ,"nsupe" * "\x2289"
    ,"nsupE" * "\x2AC6\x0338"
    ,"nsupset" * "\x2283\x20D2"
    ,"nsupseteq" * "\x2289"
    ,"nsupseteqq" * "\x2AC6\x0338"
    ,"ntgl" * "\x2279"
    ,"Ntilde" * "\x00D1"
    ,"ntilde" * "\x00F1"
    ,"ntlg" * "\x2278"
    ,"ntriangleleft" * "\x22EA"
    ,"ntrianglelefteq" * "\x22EC"
    ,"ntriangleright" * "\x22EB"
    ,"ntrianglerighteq" * "\x22ED"
    ,"Nu" * "\x039D"
    ,"nu" * "\x03BD"
    ,"num" * "\x0023"
    ,"numero" * "\x2116"
    ,"numsp" * "\x2007"
    ,"nvap" * "\x224D\x20D2"
    ,"nvdash" * "\x22AC"
    ,"nvDash" * "\x22AD"
    ,"nVdash" * "\x22AE"
    ,"nVDash" * "\x22AF"
    ,"nvge" * "\x2265\x20D2"
    ,"nvgt" * "\x003E\x20D2"
    ,"nvHarr" * "\x2904"
    ,"nvinfin" * "\x29DE"
    ,"nvlArr" * "\x2902"
    ,"nvle" * "\x2264\x20D2"
    ,"nvlt" * "\x003C\x20D2"
    ,"nvltrie" * "\x22B4\x20D2"
    ,"nvrArr" * "\x2903"
    ,"nvrtrie" * "\x22B5\x20D2"
    ,"nvsim" * "\x223C\x20D2"
    ,"nwarhk" * "\x2923"
    ,"nwarr" * "\x2196"
    ,"nwArr" * "\x21D6"
    ,"nwarrow" * "\x2196"
    ,"nwnear" * "\x2927"
    ,"Oacute" * "\x00D3"
    ,"oacute" * "\x00F3"
    ,"oast" * "\x229B"
    ,"ocir" * "\x229A"
    ,"Ocirc" * "\x00D4"
    ,"ocirc" * "\x00F4"
    ,"Ocy" * "\x041E"
    ,"ocy" * "\x043E"
    ,"odash" * "\x229D"
    ,"Odblac" * "\x0150"
    ,"odblac" * "\x0151"
    ,"odiv" * "\x2A38"
    ,"odot" * "\x2299"
    ,"odsold" * "\x29BC"
    ,"OElig" * "\x0152"
    ,"oelig" * "\x0153"
    ,"ofcir" * "\x29BF"
    ,"Ofr" * "\xD835\xDD12"
    ,"ofr" * "\xD835\xDD2C"
    ,"ogon" * "\x02DB"
    ,"Ograve" * "\x00D2"
    ,"ograve" * "\x00F2"
    ,"ogt" * "\x29C1"
    ,"ohbar" * "\x29B5"
    ,"ohm" * "\x03A9"
    ,"oint" * "\x222E"
    ,"olarr" * "\x21BA"
    ,"olcir" * "\x29BE"
    ,"olcross" * "\x29BB"
    ,"oline" * "\x203E"
    ,"olt" * "\x29C0"
    ,"Omacr" * "\x014C"
    ,"omacr" * "\x014D"
    ,"Omega" * "\x03A9"
    ,"omega" * "\x03C9"
    ,"Omicron" * "\x039F"
    ,"omicron" * "\x03BF"
    ,"omid" * "\x29B6"
    ,"ominus" * "\x2296"
    ,"Oopf" * "\xD835\xDD46"
    ,"oopf" * "\xD835\xDD60"
    ,"opar" * "\x29B7"
    ,"OpenCurlyDoubleQuote" * "\x201C"
    ,"OpenCurlyQuote" * "\x2018"
    ,"operp" * "\x29B9"
    ,"oplus" * "\x2295"
    ,"or" * "\x2228"
    ,"Or" * "\x2A54"
    ,"orarr" * "\x21BB"
    ,"ord" * "\x2A5D"
    ,"order" * "\x2134"
    ,"orderof" * "\x2134"
    ,"ordf" * "\x00AA"
    ,"ordm" * "\x00BA"
    ,"origof" * "\x22B6"
    ,"oror" * "\x2A56"
    ,"orslope" * "\x2A57"
    ,"orv" * "\x2A5B"
    ,"oS" * "\x24C8"
    ,"oscr" * "\x2134"
    ,"Oscr" * "\xD835\xDCAA"
    ,"Oslash" * "\x00D8"
    ,"oslash" * "\x00F8"
    ,"osol" * "\x2298"
    ,"Otilde" * "\x00D5"
    ,"otilde" * "\x00F5"
    ,"otimes" * "\x2297"
    ,"Otimes" * "\x2A37"
    ,"otimesas" * "\x2A36"
    ,"Ouml" * "\x00D6"
    ,"ouml" * "\x00F6"
    ,"ovbar" * "\x233D"
    ,"OverBar" * "\x203E"
    ,"OverBrace" * "\x23DE"
    ,"OverBracket" * "\x23B4"
    ,"OverParenthesis" * "\x23DC"
    ,"par" * "\x2225"
    ,"para" * "\x00B6"
    ,"parallel" * "\x2225"
    ,"parsim" * "\x2AF3"
    ,"parsl" * "\x2AFD"
    ,"part" * "\x2202"
    ,"PartialD" * "\x2202"
    ,"Pcy" * "\x041F"
    ,"pcy" * "\x043F"
    ,"percnt" * "\x0025"
    ,"period" * "\x002E"
    ,"permil" * "\x2030"
    ,"perp" * "\x22A5"
    ,"pertenk" * "\x2031"
    ,"Pfr" * "\xD835\xDD13"
    ,"pfr" * "\xD835\xDD2D"
    ,"Phi" * "\x03A6"
    ,"phi" * "\x03C6"
    ,"phiv" * "\x03D5"
    ,"phmmat" * "\x2133"
    ,"phone" * "\x260E"
    ,"Pi" * "\x03A0"
    ,"pi" * "\x03C0"
    ,"pitchfork" * "\x22D4"
    ,"piv" * "\x03D6"
    ,"planck" * "\x210F"
    ,"planckh" * "\x210E"
    ,"plankv" * "\x210F"
    ,"plus" * "\x002B"
    ,"plusacir" * "\x2A23"
    ,"plusb" * "\x229E"
    ,"pluscir" * "\x2A22"
    ,"plusdo" * "\x2214"
    ,"plusdu" * "\x2A25"
    ,"pluse" * "\x2A72"
    ,"PlusMinus" * "\x00B1"
    ,"plusmn" * "\x00B1"
    ,"plussim" * "\x2A26"
    ,"plustwo" * "\x2A27"
    ,"pm" * "\x00B1"
    ,"Poincareplane" * "\x210C"
    ,"pointint" * "\x2A15"
    ,"Popf" * "\x2119"
    ,"popf" * "\xD835\xDD61"
    ,"pound" * "\x00A3"
    ,"pr" * "\x227A"
    ,"Pr" * "\x2ABB"
    ,"prap" * "\x2AB7"
    ,"prcue" * "\x227C"
    ,"pre" * "\x2AAF"
    ,"prE" * "\x2AB3"
    ,"prec" * "\x227A"
    ,"precapprox" * "\x2AB7"
    ,"preccurlyeq" * "\x227C"
    ,"Precedes" * "\x227A"
    ,"PrecedesEqual" * "\x2AAF"
    ,"PrecedesSlantEqual" * "\x227C"
    ,"PrecedesTilde" * "\x227E"
    ,"preceq" * "\x2AAF"
    ,"precnapprox" * "\x2AB9"
    ,"precneqq" * "\x2AB5"
    ,"precnsim" * "\x22E8"
    ,"precsim" * "\x227E"
    ,"prime" * "\x2032"
    ,"Prime" * "\x2033"
    ,"primes" * "\x2119"
    ,"prnap" * "\x2AB9"
    ,"prnE" * "\x2AB5"
    ,"prnsim" * "\x22E8"
    ,"prod" * "\x220F"
    ,"Product" * "\x220F"
    ,"profalar" * "\x232E"
    ,"profline" * "\x2312"
    ,"profsurf" * "\x2313"
    ,"prop" * "\x221D"
    ,"Proportion" * "\x2237"
    ,"Proportional" * "\x221D"
    ,"propto" * "\x221D"
    ,"prsim" * "\x227E"
    ,"prurel" * "\x22B0"
    ,"Pscr" * "\xD835\xDCAB"
    ,"pscr" * "\xD835\xDCC5"
    ,"Psi" * "\x03A8"
    ,"psi" * "\x03C8"
    ,"puncsp" * "\x2008"
    ,"Qfr" * "\xD835\xDD14"
    ,"qfr" * "\xD835\xDD2E"
    ,"qint" * "\x2A0C"
    ,"Qopf" * "\x211A"
    ,"qopf" * "\xD835\xDD62"
    ,"qprime" * "\x2057"
    ,"Qscr" * "\xD835\xDCAC"
    ,"qscr" * "\xD835\xDCC6"
    ,"quaternions" * "\x210D"
    ,"quatint" * "\x2A16"
    ,"quest" * "\x003F"
    ,"questeq" * "\x225F"
    ,"QUOT" * "\x0022"
    ,"quot" * "\x0022"
    ,"rAarr" * "\x21DB"
    ,"race" * "\x223D\x0331"
    ,"Racute" * "\x0154"
    ,"racute" * "\x0155"
    ,"radic" * "\x221A"
    ,"raemptyv" * "\x29B3"
    ,"rang" * "\x27E9"
    ,"Rang" * "\x27EB"
    ,"rangd" * "\x2992"
    ,"range" * "\x29A5"
    ,"rangle" * "\x27E9"
    ,"raquo" * "\x00BB"
    ,"rarr" * "\x2192"
    ,"Rarr" * "\x21A0"
    ,"rArr" * "\x21D2"
    ,"rarrap" * "\x2975"
    ,"rarrb" * "\x21E5"
    ,"rarrbfs" * "\x2920"
    ,"rarrc" * "\x2933"
    ,"rarrfs" * "\x291E"
    ,"rarrhk" * "\x21AA"
    ,"rarrlp" * "\x21AC"
    ,"rarrpl" * "\x2945"
    ,"rarrsim" * "\x2974"
    ,"rarrtl" * "\x21A3"
    ,"Rarrtl" * "\x2916"
    ,"rarrw" * "\x219D"
    ,"ratail" * "\x291A"
    ,"rAtail" * "\x291C"
    ,"ratio" * "\x2236"
    ,"rationals" * "\x211A"
    ,"rbarr" * "\x290D"
    ,"rBarr" * "\x290F"
    ,"RBarr" * "\x2910"
    ,"rbbrk" * "\x2773"
    ,"rbrace" * "\x007D"
    ,"rbrack" * "\x005D"
    ,"rbrke" * "\x298C"
    ,"rbrksld" * "\x298E"
    ,"rbrkslu" * "\x2990"
    ,"Rcaron" * "\x0158"
    ,"rcaron" * "\x0159"
    ,"Rcedil" * "\x0156"
    ,"rcedil" * "\x0157"
    ,"rceil" * "\x2309"
    ,"rcub" * "\x007D"
    ,"Rcy" * "\x0420"
    ,"rcy" * "\x0440"
    ,"rdca" * "\x2937"
    ,"rdldhar" * "\x2969"
    ,"rdquo" * "\x201D"
    ,"rdquor" * "\x201D"
    ,"rdsh" * "\x21B3"
    ,"Re" * "\x211C"
    ,"real" * "\x211C"
    ,"realine" * "\x211B"
    ,"realpart" * "\x211C"
    ,"reals" * "\x211D"
    ,"rect" * "\x25AD"
    ,"REG" * "\x00AE"
    ,"reg" * "\x00AE"
    ,"ReverseElement" * "\x220B"
    ,"ReverseEquilibrium" * "\x21CB"
    ,"ReverseUpEquilibrium" * "\x296F"
    ,"rfisht" * "\x297D"
    ,"rfloor" * "\x230B"
    ,"Rfr" * "\x211C"
    ,"rfr" * "\xD835\xDD2F"
    ,"rHar" * "\x2964"
    ,"rhard" * "\x21C1"
    ,"rharu" * "\x21C0"
    ,"rharul" * "\x296C"
    ,"Rho" * "\x03A1"
    ,"rho" * "\x03C1"
    ,"rhov" * "\x03F1"
    ,"RightAngleBracket" * "\x27E9"
    ,"RightArrow" * "\x2192"
    ,"rightarrow" * "\x2192"
    ,"Rightarrow" * "\x21D2"
    ,"RightArrowBar" * "\x21E5"
    ,"RightArrowLeftArrow" * "\x21C4"
    ,"rightarrowtail" * "\x21A3"
    ,"RightCeiling" * "\x2309"
    ,"RightDoubleBracket" * "\x27E7"
    ,"RightDownTeeVector" * "\x295D"
    ,"RightDownVector" * "\x21C2"
    ,"RightDownVectorBar" * "\x2955"
    ,"RightFloor" * "\x230B"
    ,"rightharpoondown" * "\x21C1"
    ,"rightharpoonup" * "\x21C0"
    ,"rightleftarrows" * "\x21C4"
    ,"rightleftharpoons" * "\x21CC"
    ,"rightrightarrows" * "\x21C9"
    ,"rightsquigarrow" * "\x219D"
    ,"RightTee" * "\x22A2"
    ,"RightTeeArrow" * "\x21A6"
    ,"RightTeeVector" * "\x295B"
    ,"rightthreetimes" * "\x22CC"
    ,"RightTriangle" * "\x22B3"
    ,"RightTriangleBar" * "\x29D0"
    ,"RightTriangleEqual" * "\x22B5"
    ,"RightUpDownVector" * "\x294F"
    ,"RightUpTeeVector" * "\x295C"
    ,"RightUpVector" * "\x21BE"
    ,"RightUpVectorBar" * "\x2954"
    ,"RightVector" * "\x21C0"
    ,"RightVectorBar" * "\x2953"
    ,"ring" * "\x02DA"
    ,"risingdotseq" * "\x2253"
    ,"rlarr" * "\x21C4"
    ,"rlhar" * "\x21CC"
    ,"rlm" * "\x200F"
    ,"rmoust" * "\x23B1"
    ,"rmoustache" * "\x23B1"
    ,"rnmid" * "\x2AEE"
    ,"roang" * "\x27ED"
    ,"roarr" * "\x21FE"
    ,"robrk" * "\x27E7"
    ,"ropar" * "\x2986"
    ,"Ropf" * "\x211D"
    ,"ropf" * "\xD835\xDD63"
    ,"roplus" * "\x2A2E"
    ,"rotimes" * "\x2A35"
    ,"RoundImplies" * "\x2970"
    ,"rpar" * "\x0029"
    ,"rpargt" * "\x2994"
    ,"rppolint" * "\x2A12"
    ,"rrarr" * "\x21C9"
    ,"Rrightarrow" * "\x21DB"
    ,"rsaquo" * "\x203A"
    ,"Rscr" * "\x211B"
    ,"rscr" * "\xD835\xDCC7"
    ,"Rsh" * "\x21B1"
    ,"rsh" * "\x21B1"
    ,"rsqb" * "\x005D"
    ,"rsquo" * "\x2019"
    ,"rsquor" * "\x2019"
    ,"rthree" * "\x22CC"
    ,"rtimes" * "\x22CA"
    ,"rtri" * "\x25B9"
    ,"rtrie" * "\x22B5"
    ,"rtrif" * "\x25B8"
    ,"rtriltri" * "\x29CE"
    ,"RuleDelayed" * "\x29F4"
    ,"ruluhar" * "\x2968"
    ,"rx" * "\x211E"
    ,"Sacute" * "\x015A"
    ,"sacute" * "\x015B"
    ,"sbquo" * "\x201A"
    ,"sc" * "\x227B"
    ,"Sc" * "\x2ABC"
    ,"scap" * "\x2AB8"
    ,"Scaron" * "\x0160"
    ,"scaron" * "\x0161"
    ,"sccue" * "\x227D"
    ,"sce" * "\x2AB0"
    ,"scE" * "\x2AB4"
    ,"Scedil" * "\x015E"
    ,"scedil" * "\x015F"
    ,"Scirc" * "\x015C"
    ,"scirc" * "\x015D"
    ,"scnap" * "\x2ABA"
    ,"scnE" * "\x2AB6"
    ,"scnsim" * "\x22E9"
    ,"scpolint" * "\x2A13"
    ,"scsim" * "\x227F"
    ,"Scy" * "\x0421"
    ,"scy" * "\x0441"
    ,"sdot" * "\x22C5"
    ,"sdotb" * "\x22A1"
    ,"sdote" * "\x2A66"
    ,"searhk" * "\x2925"
    ,"searr" * "\x2198"
    ,"seArr" * "\x21D8"
    ,"searrow" * "\x2198"
    ,"sect" * "\x00A7"
    ,"semi" * "\x003B"
    ,"seswar" * "\x2929"
    ,"setminus" * "\x2216"
    ,"setmn" * "\x2216"
    ,"sext" * "\x2736"
    ,"Sfr" * "\xD835\xDD16"
    ,"sfr" * "\xD835\xDD30"
    ,"sfrown" * "\x2322"
    ,"sharp" * "\x266F"
    ,"SHCHcy" * "\x0429"
    ,"shchcy" * "\x0449"
    ,"SHcy" * "\x0428"
    ,"shcy" * "\x0448"
    ,"ShortDownArrow" * "\x2193"
    ,"ShortLeftArrow" * "\x2190"
    ,"shortmid" * "\x2223"
    ,"shortparallel" * "\x2225"
    ,"ShortRightArrow" * "\x2192"
    ,"ShortUpArrow" * "\x2191"
    ,"shy" * "\x00AD"
    ,"Sigma" * "\x03A3"
    ,"sigma" * "\x03C3"
    ,"sigmaf" * "\x03C2"
    ,"sigmav" * "\x03C2"
    ,"sim" * "\x223C"
    ,"simdot" * "\x2A6A"
    ,"sime" * "\x2243"
    ,"simeq" * "\x2243"
    ,"simg" * "\x2A9E"
    ,"simgE" * "\x2AA0"
    ,"siml" * "\x2A9D"
    ,"simlE" * "\x2A9F"
    ,"simne" * "\x2246"
    ,"simplus" * "\x2A24"
    ,"simrarr" * "\x2972"
    ,"slarr" * "\x2190"
    ,"SmallCircle" * "\x2218"
    ,"smallsetminus" * "\x2216"
    ,"smashp" * "\x2A33"
    ,"smeparsl" * "\x29E4"
    ,"smid" * "\x2223"
    ,"smile" * "\x2323"
    ,"smt" * "\x2AAA"
    ,"smte" * "\x2AAC"
    ,"smtes" * "\x2AAC\xFE00"
    ,"SOFTcy" * "\x042C"
    ,"softcy" * "\x044C"
    ,"sol" * "\x002F"
    ,"solb" * "\x29C4"
    ,"solbar" * "\x233F"
    ,"Sopf" * "\xD835\xDD4A"
    ,"sopf" * "\xD835\xDD64"
    ,"spades" * "\x2660"
    ,"spadesuit" * "\x2660"
    ,"spar" * "\x2225"
    ,"sqcap" * "\x2293"
    ,"sqcaps" * "\x2293\xFE00"
    ,"sqcup" * "\x2294"
    ,"sqcups" * "\x2294\xFE00"
    ,"Sqrt" * "\x221A"
    ,"sqsub" * "\x228F"
    ,"sqsube" * "\x2291"
    ,"sqsubset" * "\x228F"
    ,"sqsubseteq" * "\x2291"
    ,"sqsup" * "\x2290"
    ,"sqsupe" * "\x2292"
    ,"sqsupset" * "\x2290"
    ,"sqsupseteq" * "\x2292"
    ,"squ" * "\x25A1"
    ,"Square" * "\x25A1"
    ,"square" * "\x25A1"
    ,"SquareIntersection" * "\x2293"
    ,"SquareSubset" * "\x228F"
    ,"SquareSubsetEqual" * "\x2291"
    ,"SquareSuperset" * "\x2290"
    ,"SquareSupersetEqual" * "\x2292"
    ,"SquareUnion" * "\x2294"
    ,"squarf" * "\x25AA"
    ,"squf" * "\x25AA"
    ,"srarr" * "\x2192"
    ,"Sscr" * "\xD835\xDCAE"
    ,"sscr" * "\xD835\xDCC8"
    ,"ssetmn" * "\x2216"
    ,"ssmile" * "\x2323"
    ,"sstarf" * "\x22C6"
    ,"Star" * "\x22C6"
    ,"star" * "\x2606"
    ,"starf" * "\x2605"
    ,"straightepsilon" * "\x03F5"
    ,"straightphi" * "\x03D5"
    ,"strns" * "\x00AF"
    ,"sub" * "\x2282"
    ,"Sub" * "\x22D0"
    ,"subdot" * "\x2ABD"
    ,"sube" * "\x2286"
    ,"subE" * "\x2AC5"
    ,"subedot" * "\x2AC3"
    ,"submult" * "\x2AC1"
    ,"subne" * "\x228A"
    ,"subnE" * "\x2ACB"
    ,"subplus" * "\x2ABF"
    ,"subrarr" * "\x2979"
    ,"subset" * "\x2282"
    ,"Subset" * "\x22D0"
    ,"subseteq" * "\x2286"
    ,"subseteqq" * "\x2AC5"
    ,"SubsetEqual" * "\x2286"
    ,"subsetneq" * "\x228A"
    ,"subsetneqq" * "\x2ACB"
    ,"subsim" * "\x2AC7"
    ,"subsub" * "\x2AD5"
    ,"subsup" * "\x2AD3"
    ,"succ" * "\x227B"
    ,"succapprox" * "\x2AB8"
    ,"succcurlyeq" * "\x227D"
    ,"Succeeds" * "\x227B"
    ,"SucceedsEqual" * "\x2AB0"
    ,"SucceedsSlantEqual" * "\x227D"
    ,"SucceedsTilde" * "\x227F"
    ,"succeq" * "\x2AB0"
    ,"succnapprox" * "\x2ABA"
    ,"succneqq" * "\x2AB6"
    ,"succnsim" * "\x22E9"
    ,"succsim" * "\x227F"
    ,"SuchThat" * "\x220B"
    ,"Sum" * "\x2211"
    ,"sum" * "\x2211"
    ,"sung" * "\x266A"
    ,"sup" * "\x2283"
    ,"Sup" * "\x22D1"
    ,"sup1" * "\x00B9"
    ,"sup2" * "\x00B2"
    ,"sup3" * "\x00B3"
    ,"supdot" * "\x2ABE"
    ,"supdsub" * "\x2AD8"
    ,"supe" * "\x2287"
    ,"supE" * "\x2AC6"
    ,"supedot" * "\x2AC4"
    ,"Superset" * "\x2283"
    ,"SupersetEqual" * "\x2287"
    ,"suphsol" * "\x27C9"
    ,"suphsub" * "\x2AD7"
    ,"suplarr" * "\x297B"
    ,"supmult" * "\x2AC2"
    ,"supne" * "\x228B"
    ,"supnE" * "\x2ACC"
    ,"supplus" * "\x2AC0"
    ,"supset" * "\x2283"
    ,"Supset" * "\x22D1"
    ,"supseteq" * "\x2287"
    ,"supseteqq" * "\x2AC6"
    ,"supsetneq" * "\x228B"
    ,"supsetneqq" * "\x2ACC"
    ,"supsim" * "\x2AC8"
    ,"supsub" * "\x2AD4"
    ,"supsup" * "\x2AD6"
    ,"swarhk" * "\x2926"
    ,"swarr" * "\x2199"
    ,"swArr" * "\x21D9"
    ,"swarrow" * "\x2199"
    ,"swnwar" * "\x292A"
    ,"szlig" * "\x00DF"
    ,"Tab" * "\x0009"
    ,"target" * "\x2316"
    ,"Tau" * "\x03A4"
    ,"tau" * "\x03C4"
    ,"tbrk" * "\x23B4"
    ,"Tcaron" * "\x0164"
    ,"tcaron" * "\x0165"
    ,"Tcedil" * "\x0162"
    ,"tcedil" * "\x0163"
    ,"Tcy" * "\x0422"
    ,"tcy" * "\x0442"
    ,"tdot" * "\x20DB"
    ,"telrec" * "\x2315"
    ,"Tfr" * "\xD835\xDD17"
    ,"tfr" * "\xD835\xDD31"
    ,"there4" * "\x2234"
    ,"Therefore" * "\x2234"
    ,"therefore" * "\x2234"
    ,"Theta" * "\x0398"
    ,"theta" * "\x03B8"
    ,"thetasym" * "\x03D1"
    ,"thetav" * "\x03D1"
    ,"thickapprox" * "\x2248"
    ,"thicksim" * "\x223C"
    ,"ThickSpace" * "\x205F\x200A"
    ,"thinsp" * "\x2009"
    ,"ThinSpace" * "\x2009"
    ,"thkap" * "\x2248"
    ,"thksim" * "\x223C"
    ,"THORN" * "\x00DE"
    ,"thorn" * "\x00FE"
    ,"tilde" * "\x02DC"
    ,"Tilde" * "\x223C"
    ,"TildeEqual" * "\x2243"
    ,"TildeFullEqual" * "\x2245"
    ,"TildeTilde" * "\x2248"
    ,"times" * "\x00D7"
    ,"timesb" * "\x22A0"
    ,"timesbar" * "\x2A31"
    ,"timesd" * "\x2A30"
    ,"tint" * "\x222D"
    ,"toea" * "\x2928"
    ,"top" * "\x22A4"
    ,"topbot" * "\x2336"
    ,"topcir" * "\x2AF1"
    ,"Topf" * "\xD835\xDD4B"
    ,"topf" * "\xD835\xDD65"
    ,"topfork" * "\x2ADA"
    ,"tosa" * "\x2929"
    ,"tprime" * "\x2034"
    ,"TRADE" * "\x2122"
    ,"trade" * "\x2122"
    ,"triangle" * "\x25B5"
    ,"triangledown" * "\x25BF"
    ,"triangleleft" * "\x25C3"
    ,"trianglelefteq" * "\x22B4"
    ,"triangleq" * "\x225C"
    ,"triangleright" * "\x25B9"
    ,"trianglerighteq" * "\x22B5"
    ,"tridot" * "\x25EC"
    ,"trie" * "\x225C"
    ,"triminus" * "\x2A3A"
    ,"TripleDot" * "\x20DB"
    ,"triplus" * "\x2A39"
    ,"trisb" * "\x29CD"
    ,"tritime" * "\x2A3B"
    ,"trpezium" * "\x23E2"
    ,"Tscr" * "\xD835\xDCAF"
    ,"tscr" * "\xD835\xDCC9"
    ,"TScy" * "\x0426"
    ,"tscy" * "\x0446"
    ,"TSHcy" * "\x040B"
    ,"tshcy" * "\x045B"
    ,"Tstrok" * "\x0166"
    ,"tstrok" * "\x0167"
    ,"twixt" * "\x226C"
    ,"twoheadleftarrow" * "\x219E"
    ,"twoheadrightarrow" * "\x21A0"
    ,"Uacute" * "\x00DA"
    ,"uacute" * "\x00FA"
    ,"uarr" * "\x2191"
    ,"Uarr" * "\x219F"
    ,"uArr" * "\x21D1"
    ,"Uarrocir" * "\x2949"
    ,"Ubrcy" * "\x040E"
    ,"ubrcy" * "\x045E"
    ,"Ubreve" * "\x016C"
    ,"ubreve" * "\x016D"
    ,"Ucirc" * "\x00DB"
    ,"ucirc" * "\x00FB"
    ,"Ucy" * "\x0423"
    ,"ucy" * "\x0443"
    ,"udarr" * "\x21C5"
    ,"Udblac" * "\x0170"
    ,"udblac" * "\x0171"
    ,"udhar" * "\x296E"
    ,"ufisht" * "\x297E"
    ,"Ufr" * "\xD835\xDD18"
    ,"ufr" * "\xD835\xDD32"
    ,"Ugrave" * "\x00D9"
    ,"ugrave" * "\x00F9"
    ,"uHar" * "\x2963"
    ,"uharl" * "\x21BF"
    ,"uharr" * "\x21BE"
    ,"uhblk" * "\x2580"
    ,"ulcorn" * "\x231C"
    ,"ulcorner" * "\x231C"
    ,"ulcrop" * "\x230F"
    ,"ultri" * "\x25F8"
    ,"Umacr" * "\x016A"
    ,"umacr" * "\x016B"
    ,"uml" * "\x00A8"
    ,"UnderBar" * "\x005F"
    ,"UnderBrace" * "\x23DF"
    ,"UnderBracket" * "\x23B5"
    ,"UnderParenthesis" * "\x23DD"
    ,"Union" * "\x22C3"
    ,"UnionPlus" * "\x228E"
    ,"Uogon" * "\x0172"
    ,"uogon" * "\x0173"
    ,"Uopf" * "\xD835\xDD4C"
    ,"uopf" * "\xD835\xDD66"
    ,"UpArrow" * "\x2191"
    ,"uparrow" * "\x2191"
    ,"Uparrow" * "\x21D1"
    ,"UpArrowBar" * "\x2912"
    ,"UpArrowDownArrow" * "\x21C5"
    ,"UpDownArrow" * "\x2195"
    ,"updownarrow" * "\x2195"
    ,"Updownarrow" * "\x21D5"
    ,"UpEquilibrium" * "\x296E"
    ,"upharpoonleft" * "\x21BF"
    ,"upharpoonright" * "\x21BE"
    ,"uplus" * "\x228E"
    ,"UpperLeftArrow" * "\x2196"
    ,"UpperRightArrow" * "\x2197"
    ,"upsi" * "\x03C5"
    ,"Upsi" * "\x03D2"
    ,"upsih" * "\x03D2"
    ,"Upsilon" * "\x03A5"
    ,"upsilon" * "\x03C5"
    ,"UpTee" * "\x22A5"
    ,"UpTeeArrow" * "\x21A5"
    ,"upuparrows" * "\x21C8"
    ,"urcorn" * "\x231D"
    ,"urcorner" * "\x231D"
    ,"urcrop" * "\x230E"
    ,"Uring" * "\x016E"
    ,"uring" * "\x016F"
    ,"urtri" * "\x25F9"
    ,"Uscr" * "\xD835\xDCB0"
    ,"uscr" * "\xD835\xDCCA"
    ,"utdot" * "\x22F0"
    ,"Utilde" * "\x0168"
    ,"utilde" * "\x0169"
    ,"utri" * "\x25B5"
    ,"utrif" * "\x25B4"
    ,"uuarr" * "\x21C8"
    ,"Uuml" * "\x00DC"
    ,"uuml" * "\x00FC"
    ,"uwangle" * "\x29A7"
    ,"vangrt" * "\x299C"
    ,"varepsilon" * "\x03F5"
    ,"varkappa" * "\x03F0"
    ,"varnothing" * "\x2205"
    ,"varphi" * "\x03D5"
    ,"varpi" * "\x03D6"
    ,"varpropto" * "\x221D"
    ,"varr" * "\x2195"
    ,"vArr" * "\x21D5"
    ,"varrho" * "\x03F1"
    ,"varsigma" * "\x03C2"
    ,"varsubsetneq" * "\x228A\xFE00"
    ,"varsubsetneqq" * "\x2ACB\xFE00"
    ,"varsupsetneq" * "\x228B\xFE00"
    ,"varsupsetneqq" * "\x2ACC\xFE00"
    ,"vartheta" * "\x03D1"
    ,"vartriangleleft" * "\x22B2"
    ,"vartriangleright" * "\x22B3"
    ,"vBar" * "\x2AE8"
    ,"Vbar" * "\x2AEB"
    ,"vBarv" * "\x2AE9"
    ,"Vcy" * "\x0412"
    ,"vcy" * "\x0432"
    ,"vdash" * "\x22A2"
    ,"vDash" * "\x22A8"
    ,"Vdash" * "\x22A9"
    ,"VDash" * "\x22AB"
    ,"Vdashl" * "\x2AE6"
    ,"vee" * "\x2228"
    ,"Vee" * "\x22C1"
    ,"veebar" * "\x22BB"
    ,"veeeq" * "\x225A"
    ,"vellip" * "\x22EE"
    ,"verbar" * "\x007C"
    ,"Verbar" * "\x2016"
    ,"vert" * "\x007C"
    ,"Vert" * "\x2016"
    ,"VerticalBar" * "\x2223"
    ,"VerticalLine" * "\x007C"
    ,"VerticalSeparator" * "\x2758"
    ,"VerticalTilde" * "\x2240"
    ,"VeryThinSpace" * "\x200A"
    ,"Vfr" * "\xD835\xDD19"
    ,"vfr" * "\xD835\xDD33"
    ,"vltri" * "\x22B2"
    ,"vnsub" * "\x2282\x20D2"
    ,"vnsup" * "\x2283\x20D2"
    ,"Vopf" * "\xD835\xDD4D"
    ,"vopf" * "\xD835\xDD67"
    ,"vprop" * "\x221D"
    ,"vrtri" * "\x22B3"
    ,"Vscr" * "\xD835\xDCB1"
    ,"vscr" * "\xD835\xDCCB"
    ,"vsubne" * "\x228A\xFE00"
    ,"vsubnE" * "\x2ACB\xFE00"
    ,"vsupne" * "\x228B\xFE00"
    ,"vsupnE" * "\x2ACC\xFE00"
    ,"Vvdash" * "\x22AA"
    ,"vzigzag" * "\x299A"
    ,"Wcirc" * "\x0174"
    ,"wcirc" * "\x0175"
    ,"wedbar" * "\x2A5F"
    ,"wedge" * "\x2227"
    ,"Wedge" * "\x22C0"
    ,"wedgeq" * "\x2259"
    ,"weierp" * "\x2118"
    ,"Wfr" * "\xD835\xDD1A"
    ,"wfr" * "\xD835\xDD34"
    ,"Wopf" * "\xD835\xDD4E"
    ,"wopf" * "\xD835\xDD68"
    ,"wp" * "\x2118"
    ,"wr" * "\x2240"
    ,"wreath" * "\x2240"
    ,"Wscr" * "\xD835\xDCB2"
    ,"wscr" * "\xD835\xDCCC"
    ,"xcap" * "\x22C2"
    ,"xcirc" * "\x25EF"
    ,"xcup" * "\x22C3"
    ,"xdtri" * "\x25BD"
    ,"Xfr" * "\xD835\xDD1B"
    ,"xfr" * "\xD835\xDD35"
    ,"xharr" * "\x27F7"
    ,"xhArr" * "\x27FA"
    ,"Xi" * "\x039E"
    ,"xi" * "\x03BE"
    ,"xlarr" * "\x27F5"
    ,"xlArr" * "\x27F8"
    ,"xmap" * "\x27FC"
    ,"xnis" * "\x22FB"
    ,"xodot" * "\x2A00"
    ,"Xopf" * "\xD835\xDD4F"
    ,"xopf" * "\xD835\xDD69"
    ,"xoplus" * "\x2A01"
    ,"xotime" * "\x2A02"
    ,"xrarr" * "\x27F6"
    ,"xrArr" * "\x27F9"
    ,"Xscr" * "\xD835\xDCB3"
    ,"xscr" * "\xD835\xDCCD"
    ,"xsqcup" * "\x2A06"
    ,"xuplus" * "\x2A04"
    ,"xutri" * "\x25B3"
    ,"xvee" * "\x22C1"
    ,"xwedge" * "\x22C0"
    ,"Yacute" * "\x00DD"
    ,"yacute" * "\x00FD"
    ,"YAcy" * "\x042F"
    ,"yacy" * "\x044F"
    ,"Ycirc" * "\x0176"
    ,"ycirc" * "\x0177"
    ,"Ycy" * "\x042B"
    ,"ycy" * "\x044B"
    ,"yen" * "\x00A5"
    ,"Yfr" * "\xD835\xDD1C"
    ,"yfr" * "\xD835\xDD36"
    ,"YIcy" * "\x0407"
    ,"yicy" * "\x0457"
    ,"Yopf" * "\xD835\xDD50"
    ,"yopf" * "\xD835\xDD6A"
    ,"Yscr" * "\xD835\xDCB4"
    ,"yscr" * "\xD835\xDCCE"
    ,"YUcy" * "\x042E"
    ,"yucy" * "\x044E"
    ,"yuml" * "\x00FF"
    ,"Yuml" * "\x0178"
    ,"Zacute" * "\x0179"
    ,"zacute" * "\x017A"
    ,"Zcaron" * "\x017D"
    ,"zcaron" * "\x017E"
    ,"Zcy" * "\x0417"
    ,"zcy" * "\x0437"
    ,"Zdot" * "\x017B"
    ,"zdot" * "\x017C"
    ,"zeetrf" * "\x2128"
    ,"ZeroWidthSpace" * "\x200B"
    ,"Zeta" * "\x0396"
    ,"zeta" * "\x03B6"
    ,"Zfr" * "\x2128"
    ,"zfr" * "\xD835\xDD37"
    ,"ZHcy" * "\x0416"
    ,"zhcy" * "\x0436"
    ,"zigrarr" * "\x21DD"
    ,"Zopf" * "\x2124"
    ,"zopf" * "\xD835\xDD6B"
    ,"Zscr" * "\xD835\xDCB5"
    ,"zscr" * "\xD835\xDCCF"
    ,"zwj" * "\x200D"
    ,"zwnj" * "\x200C"
    ]