packages feed

pdf-toolbox-content 0.0.5.1 → 0.1.1

raw patch · 31 files changed

+7369/−6653 lines, 31 filesdep +hspecdep +pdf-toolbox-contentdep +scientificdep ~attoparsecdep ~basedep ~base16-bytestringPVP ok

version bump matches the API change (PVP)

Dependencies added: hspec, pdf-toolbox-content, scientific, vector

Dependency ranges changed: attoparsec, base, base16-bytestring, pdf-toolbox-core

API changes (from Hackage documentation)

- Pdf.Toolbox.Content.Encoding.MacRoman: encoding :: Map Word8 Text
- Pdf.Toolbox.Content.Encoding.WinAnsi: encoding :: Map Word8 Text
- Pdf.Toolbox.Content.FontInfo: CIDFontWidths :: Map Int Double -> [(Int, Int, Double)] -> CIDFontWidths
- Pdf.Toolbox.Content.FontInfo: FIComposite :: Maybe UnicodeCMap -> CIDFontWidths -> Double -> FIComposite
- Pdf.Toolbox.Content.FontInfo: FISimple :: Maybe UnicodeCMap -> Maybe SimpleFontEncoding -> Maybe (Int, Int, [Double]) -> Transform Double -> FISimple
- Pdf.Toolbox.Content.FontInfo: FontBaseEncodingMacRoman :: FontBaseEncoding
- Pdf.Toolbox.Content.FontInfo: FontBaseEncodingWinAnsi :: FontBaseEncoding
- Pdf.Toolbox.Content.FontInfo: FontInfoComposite :: FIComposite -> FontInfo
- Pdf.Toolbox.Content.FontInfo: FontInfoSimple :: FISimple -> FontInfo
- Pdf.Toolbox.Content.FontInfo: SimpleFontEncoding :: FontBaseEncoding -> [(Word8, ByteString)] -> SimpleFontEncoding
- Pdf.Toolbox.Content.FontInfo: [cidFontWidthsChars] :: CIDFontWidths -> Map Int Double
- Pdf.Toolbox.Content.FontInfo: [cidFontWidthsRanges] :: CIDFontWidths -> [(Int, Int, Double)]
- Pdf.Toolbox.Content.FontInfo: [fiCompositeDefaultWidth] :: FIComposite -> Double
- Pdf.Toolbox.Content.FontInfo: [fiCompositeUnicodeCMap] :: FIComposite -> Maybe UnicodeCMap
- Pdf.Toolbox.Content.FontInfo: [fiCompositeWidths] :: FIComposite -> CIDFontWidths
- Pdf.Toolbox.Content.FontInfo: [fiSimpleEncoding] :: FISimple -> Maybe SimpleFontEncoding
- Pdf.Toolbox.Content.FontInfo: [fiSimpleFontMatrix] :: FISimple -> Transform Double
- Pdf.Toolbox.Content.FontInfo: [fiSimpleUnicodeCMap] :: FISimple -> Maybe UnicodeCMap
- Pdf.Toolbox.Content.FontInfo: [fiSimpleWidths] :: FISimple -> Maybe (Int, Int, [Double])
- Pdf.Toolbox.Content.FontInfo: [simpleFontBaseEncoding] :: SimpleFontEncoding -> FontBaseEncoding
- Pdf.Toolbox.Content.FontInfo: [simpleFontDifferences] :: SimpleFontEncoding -> [(Word8, ByteString)]
- Pdf.Toolbox.Content.FontInfo: cidFontGetWidth :: CIDFontWidths -> Int -> Maybe Double
- Pdf.Toolbox.Content.FontInfo: data CIDFontWidths
- Pdf.Toolbox.Content.FontInfo: data FIComposite
- Pdf.Toolbox.Content.FontInfo: data FISimple
- Pdf.Toolbox.Content.FontInfo: data FontBaseEncoding
- Pdf.Toolbox.Content.FontInfo: data FontInfo
- Pdf.Toolbox.Content.FontInfo: data SimpleFontEncoding
- Pdf.Toolbox.Content.FontInfo: fontInfoDecodeGlyphs :: FontInfo -> Str -> [(Glyph, Double)]
- Pdf.Toolbox.Content.FontInfo: instance GHC.Base.Monoid Pdf.Toolbox.Content.FontInfo.CIDFontWidths
- Pdf.Toolbox.Content.FontInfo: instance GHC.Show.Show Pdf.Toolbox.Content.FontInfo.CIDFontWidths
- Pdf.Toolbox.Content.FontInfo: instance GHC.Show.Show Pdf.Toolbox.Content.FontInfo.FIComposite
- Pdf.Toolbox.Content.FontInfo: instance GHC.Show.Show Pdf.Toolbox.Content.FontInfo.FISimple
- Pdf.Toolbox.Content.FontInfo: instance GHC.Show.Show Pdf.Toolbox.Content.FontInfo.FontBaseEncoding
- Pdf.Toolbox.Content.FontInfo: instance GHC.Show.Show Pdf.Toolbox.Content.FontInfo.FontInfo
- Pdf.Toolbox.Content.FontInfo: instance GHC.Show.Show Pdf.Toolbox.Content.FontInfo.SimpleFontEncoding
- Pdf.Toolbox.Content.FontInfo: makeCIDFontWidths :: Monad m => Array -> PdfE m CIDFontWidths
- Pdf.Toolbox.Content.GlyphList: adobeGlyphList :: Map ByteString Char
- Pdf.Toolbox.Content.Ops: Obj :: (Object ()) -> Expr
- Pdf.Toolbox.Content.Ops: Op :: Op -> Expr
- Pdf.Toolbox.Content.Ops: Op_B :: Op
- Pdf.Toolbox.Content.Ops: Op_BDC :: Op
- Pdf.Toolbox.Content.Ops: Op_BI :: Op
- Pdf.Toolbox.Content.Ops: Op_BMC :: Op
- Pdf.Toolbox.Content.Ops: Op_BT :: Op
- Pdf.Toolbox.Content.Ops: Op_BX :: Op
- Pdf.Toolbox.Content.Ops: Op_B_star :: Op
- Pdf.Toolbox.Content.Ops: Op_CS :: Op
- Pdf.Toolbox.Content.Ops: Op_DP :: Op
- Pdf.Toolbox.Content.Ops: Op_Do :: Op
- Pdf.Toolbox.Content.Ops: Op_EI :: Op
- Pdf.Toolbox.Content.Ops: Op_EMC :: Op
- Pdf.Toolbox.Content.Ops: Op_ET :: Op
- Pdf.Toolbox.Content.Ops: Op_EX :: Op
- Pdf.Toolbox.Content.Ops: Op_F :: Op
- Pdf.Toolbox.Content.Ops: Op_G :: Op
- Pdf.Toolbox.Content.Ops: Op_ID :: Op
- Pdf.Toolbox.Content.Ops: Op_J :: Op
- Pdf.Toolbox.Content.Ops: Op_K :: Op
- Pdf.Toolbox.Content.Ops: Op_M :: Op
- Pdf.Toolbox.Content.Ops: Op_MP :: Op
- Pdf.Toolbox.Content.Ops: Op_Q :: Op
- Pdf.Toolbox.Content.Ops: Op_RG :: Op
- Pdf.Toolbox.Content.Ops: Op_S :: Op
- Pdf.Toolbox.Content.Ops: Op_SC :: Op
- Pdf.Toolbox.Content.Ops: Op_SCN :: Op
- Pdf.Toolbox.Content.Ops: Op_TD :: Op
- Pdf.Toolbox.Content.Ops: Op_TJ :: Op
- Pdf.Toolbox.Content.Ops: Op_TL :: Op
- Pdf.Toolbox.Content.Ops: Op_T_star :: Op
- Pdf.Toolbox.Content.Ops: Op_Tc :: Op
- Pdf.Toolbox.Content.Ops: Op_Td :: Op
- Pdf.Toolbox.Content.Ops: Op_Tf :: Op
- Pdf.Toolbox.Content.Ops: Op_Tj :: Op
- Pdf.Toolbox.Content.Ops: Op_Tm :: Op
- Pdf.Toolbox.Content.Ops: Op_Tr :: Op
- Pdf.Toolbox.Content.Ops: Op_Ts :: Op
- Pdf.Toolbox.Content.Ops: Op_Tw :: Op
- Pdf.Toolbox.Content.Ops: Op_Tz :: Op
- Pdf.Toolbox.Content.Ops: Op_W :: Op
- Pdf.Toolbox.Content.Ops: Op_W_star :: Op
- Pdf.Toolbox.Content.Ops: Op_apostrophe :: Op
- Pdf.Toolbox.Content.Ops: Op_b :: Op
- Pdf.Toolbox.Content.Ops: Op_b_star :: Op
- Pdf.Toolbox.Content.Ops: Op_c :: Op
- Pdf.Toolbox.Content.Ops: Op_cm :: Op
- Pdf.Toolbox.Content.Ops: Op_cs :: Op
- Pdf.Toolbox.Content.Ops: Op_d :: Op
- Pdf.Toolbox.Content.Ops: Op_d0 :: Op
- Pdf.Toolbox.Content.Ops: Op_d1 :: Op
- Pdf.Toolbox.Content.Ops: Op_f :: Op
- Pdf.Toolbox.Content.Ops: Op_f_star :: Op
- Pdf.Toolbox.Content.Ops: Op_g :: Op
- Pdf.Toolbox.Content.Ops: Op_gs :: Op
- Pdf.Toolbox.Content.Ops: Op_h :: Op
- Pdf.Toolbox.Content.Ops: Op_i :: Op
- Pdf.Toolbox.Content.Ops: Op_j :: Op
- Pdf.Toolbox.Content.Ops: Op_k :: Op
- Pdf.Toolbox.Content.Ops: Op_l :: Op
- Pdf.Toolbox.Content.Ops: Op_m :: Op
- Pdf.Toolbox.Content.Ops: Op_n :: Op
- Pdf.Toolbox.Content.Ops: Op_q :: Op
- Pdf.Toolbox.Content.Ops: Op_quote :: Op
- Pdf.Toolbox.Content.Ops: Op_re :: Op
- Pdf.Toolbox.Content.Ops: Op_rg :: Op
- Pdf.Toolbox.Content.Ops: Op_ri :: Op
- Pdf.Toolbox.Content.Ops: Op_s :: Op
- Pdf.Toolbox.Content.Ops: Op_sc :: Op
- Pdf.Toolbox.Content.Ops: Op_scn :: Op
- Pdf.Toolbox.Content.Ops: Op_sh :: Op
- Pdf.Toolbox.Content.Ops: Op_v :: Op
- Pdf.Toolbox.Content.Ops: Op_w :: Op
- Pdf.Toolbox.Content.Ops: Op_y :: Op
- Pdf.Toolbox.Content.Ops: UnknownOp :: ByteString -> Op
- Pdf.Toolbox.Content.Ops: data Expr
- Pdf.Toolbox.Content.Ops: data Op
- Pdf.Toolbox.Content.Ops: instance GHC.Classes.Eq Pdf.Toolbox.Content.Ops.Expr
- Pdf.Toolbox.Content.Ops: instance GHC.Classes.Eq Pdf.Toolbox.Content.Ops.Op
- Pdf.Toolbox.Content.Ops: instance GHC.Show.Show Pdf.Toolbox.Content.Ops.Expr
- Pdf.Toolbox.Content.Ops: instance GHC.Show.Show Pdf.Toolbox.Content.Ops.Op
- Pdf.Toolbox.Content.Ops: toOp :: ByteString -> Op
- Pdf.Toolbox.Content.Ops: type Operator = (Op, [Object ()])
- Pdf.Toolbox.Content.Parser: parseContent :: Parser (Maybe Expr)
- Pdf.Toolbox.Content.Parser: parseContentStream :: MonadIO m => RIS -> [StreamFilter] -> (Ref -> IS -> IO IS) -> [(Stream Int64, Ref, Int)] -> PdfE m (InputStream Expr)
- Pdf.Toolbox.Content.Parser: readNextOperator :: MonadIO m => InputStream Expr -> PdfE m (Maybe Operator)
- Pdf.Toolbox.Content.Processor: Glyph :: Int -> Vector Double -> Vector Double -> Maybe Text -> Glyph
- Pdf.Toolbox.Content.Processor: GraphicsState :: Bool -> Transform Double -> Maybe Name -> Maybe Double -> Transform Double -> Transform Double -> Double -> Double -> Double -> GraphicsState
- Pdf.Toolbox.Content.Processor: Processor :: GraphicsState -> [GraphicsState] -> GlyphDecoder -> [[Glyph]] -> Processor
- Pdf.Toolbox.Content.Processor: [glyphBottomRight] :: Glyph -> Vector Double
- Pdf.Toolbox.Content.Processor: [glyphCode] :: Glyph -> Int
- Pdf.Toolbox.Content.Processor: [glyphText] :: Glyph -> Maybe Text
- Pdf.Toolbox.Content.Processor: [glyphTopLeft] :: Glyph -> Vector Double
- Pdf.Toolbox.Content.Processor: [gsCurrentTransformMatrix] :: GraphicsState -> Transform Double
- Pdf.Toolbox.Content.Processor: [gsFontSize] :: GraphicsState -> Maybe Double
- Pdf.Toolbox.Content.Processor: [gsFont] :: GraphicsState -> Maybe Name
- Pdf.Toolbox.Content.Processor: [gsInText] :: GraphicsState -> Bool
- Pdf.Toolbox.Content.Processor: [gsTextCharSpacing] :: GraphicsState -> Double
- Pdf.Toolbox.Content.Processor: [gsTextLeading] :: GraphicsState -> Double
- Pdf.Toolbox.Content.Processor: [gsTextLineMatrix] :: GraphicsState -> Transform Double
- Pdf.Toolbox.Content.Processor: [gsTextMatrix] :: GraphicsState -> Transform Double
- Pdf.Toolbox.Content.Processor: [gsTextWordSpacing] :: GraphicsState -> Double
- Pdf.Toolbox.Content.Processor: [prGlyphDecoder] :: Processor -> GlyphDecoder
- Pdf.Toolbox.Content.Processor: [prGlyphs] :: Processor -> [[Glyph]]
- Pdf.Toolbox.Content.Processor: [prStateStack] :: Processor -> [GraphicsState]
- Pdf.Toolbox.Content.Processor: [prState] :: Processor -> GraphicsState
- Pdf.Toolbox.Content.Processor: data Glyph
- Pdf.Toolbox.Content.Processor: data GraphicsState
- Pdf.Toolbox.Content.Processor: data Processor
- Pdf.Toolbox.Content.Processor: initialGraphicsState :: GraphicsState
- Pdf.Toolbox.Content.Processor: instance GHC.Show.Show Pdf.Toolbox.Content.Processor.Glyph
- Pdf.Toolbox.Content.Processor: instance GHC.Show.Show Pdf.Toolbox.Content.Processor.GraphicsState
- Pdf.Toolbox.Content.Processor: mkProcessor :: Processor
- Pdf.Toolbox.Content.Processor: processOp :: Monad m => Operator -> Processor -> PdfE m Processor
- Pdf.Toolbox.Content.Processor: type GlyphDecoder = Name -> Str -> [(Glyph, Double)]
- Pdf.Toolbox.Content.TexGlyphList: texGlyphList :: Map ByteString Char
- Pdf.Toolbox.Content.Transform: Transform :: a -> a -> a -> a -> a -> a -> Transform a
- Pdf.Toolbox.Content.Transform: Vector :: a -> a -> Vector a
- Pdf.Toolbox.Content.Transform: data Transform a
- Pdf.Toolbox.Content.Transform: data Vector a
- Pdf.Toolbox.Content.Transform: identity :: Num a => Transform a
- Pdf.Toolbox.Content.Transform: instance GHC.Show.Show a => GHC.Show.Show (Pdf.Toolbox.Content.Transform.Transform a)
- Pdf.Toolbox.Content.Transform: instance GHC.Show.Show a => GHC.Show.Show (Pdf.Toolbox.Content.Transform.Vector a)
- Pdf.Toolbox.Content.Transform: multiply :: Num a => Transform a -> Transform a -> Transform a
- Pdf.Toolbox.Content.Transform: scale :: Num a => a -> a -> Transform a
- Pdf.Toolbox.Content.Transform: transform :: Num a => Transform a -> Vector a -> Vector a
- Pdf.Toolbox.Content.Transform: translate :: Num a => a -> a -> Transform a -> Transform a
- Pdf.Toolbox.Content.Transform: translation :: Num a => a -> a -> Transform a
- Pdf.Toolbox.Content.UnicodeCMap: UnicodeCMap :: [(ByteString, ByteString)] -> Map Int Text -> [(Int, Int, Char)] -> UnicodeCMap
- Pdf.Toolbox.Content.UnicodeCMap: [unicodeCMapChars] :: UnicodeCMap -> Map Int Text
- Pdf.Toolbox.Content.UnicodeCMap: [unicodeCMapCodeRanges] :: UnicodeCMap -> [(ByteString, ByteString)]
- Pdf.Toolbox.Content.UnicodeCMap: [unicodeCMapRanges] :: UnicodeCMap -> [(Int, Int, Char)]
- Pdf.Toolbox.Content.UnicodeCMap: data UnicodeCMap
- Pdf.Toolbox.Content.UnicodeCMap: instance GHC.Show.Show Pdf.Toolbox.Content.UnicodeCMap.UnicodeCMap
- Pdf.Toolbox.Content.UnicodeCMap: parseUnicodeCMap :: ByteString -> Either String UnicodeCMap
- Pdf.Toolbox.Content.UnicodeCMap: unicodeCMapDecodeGlyph :: UnicodeCMap -> Int -> Maybe Text
- Pdf.Toolbox.Content.UnicodeCMap: unicodeCMapNextGlyph :: UnicodeCMap -> ByteString -> Maybe (Int, ByteString)
+ Pdf.Content.Encoding.MacRoman: encoding :: Map Word8 Text
+ Pdf.Content.Encoding.PdfDoc: encoding :: Map Word8 Text
+ Pdf.Content.Encoding.WinAnsi: encoding :: Map Word8 Text
+ Pdf.Content.FontDescriptor: AllCap :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: FixedPitch :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: FontDescriptor :: ByteString -> Maybe ByteString -> Maybe ByteString -> Maybe Int -> Int64 -> Maybe (Rectangle Double) -> Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe Double -> Maybe ByteString -> FontDescriptor
+ Pdf.Content.FontDescriptor: ForceBold :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: Italic :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: NonSymbolic :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: Script :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: Serif :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: SmallCap :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: Symbolic :: FontDescriptorFlag
+ Pdf.Content.FontDescriptor: [fdAscent] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdAvgWidth] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdCapHeight] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdCharSet] :: FontDescriptor -> Maybe ByteString
+ Pdf.Content.FontDescriptor: [fdDescent] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdFlags] :: FontDescriptor -> Int64
+ Pdf.Content.FontDescriptor: [fdFontBBox] :: FontDescriptor -> Maybe (Rectangle Double)
+ Pdf.Content.FontDescriptor: [fdFontFamily] :: FontDescriptor -> Maybe ByteString
+ Pdf.Content.FontDescriptor: [fdFontName] :: FontDescriptor -> ByteString
+ Pdf.Content.FontDescriptor: [fdFontStretch] :: FontDescriptor -> Maybe ByteString
+ Pdf.Content.FontDescriptor: [fdFontWeight] :: FontDescriptor -> Maybe Int
+ Pdf.Content.FontDescriptor: [fdItalicAngle] :: FontDescriptor -> Double
+ Pdf.Content.FontDescriptor: [fdLeading] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdMaxWidth] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdMissingWidth] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdStemH] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdStemV] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: [fdXHeight] :: FontDescriptor -> Maybe Double
+ Pdf.Content.FontDescriptor: data FontDescriptor
+ Pdf.Content.FontDescriptor: data FontDescriptorFlag
+ Pdf.Content.FontDescriptor: flagSet :: FontDescriptor -> FontDescriptorFlag -> Bool
+ Pdf.Content.FontDescriptor: instance GHC.Show.Show Pdf.Content.FontDescriptor.FontDescriptor
+ Pdf.Content.FontInfo: CIDFontWidths :: Map Int Double -> [(Int, Int, Double)] -> CIDFontWidths
+ Pdf.Content.FontInfo: FIComposite :: Maybe UnicodeCMap -> CIDFontWidths -> Double -> Maybe FontDescriptor -> FIComposite
+ Pdf.Content.FontInfo: FISimple :: Maybe UnicodeCMap -> Maybe SimpleFontEncoding -> Maybe (Int, Int, [Double]) -> Transform Double -> Maybe FontDescriptor -> FISimple
+ Pdf.Content.FontInfo: FontBaseEncodingMacRoman :: FontBaseEncoding
+ Pdf.Content.FontInfo: FontBaseEncodingWinAnsi :: FontBaseEncoding
+ Pdf.Content.FontInfo: FontInfoComposite :: FIComposite -> FontInfo
+ Pdf.Content.FontInfo: FontInfoSimple :: FISimple -> FontInfo
+ Pdf.Content.FontInfo: SimpleFontEncoding :: FontBaseEncoding -> [(Word8, ByteString)] -> SimpleFontEncoding
+ Pdf.Content.FontInfo: [cidFontWidthsChars] :: CIDFontWidths -> Map Int Double
+ Pdf.Content.FontInfo: [cidFontWidthsRanges] :: CIDFontWidths -> [(Int, Int, Double)]
+ Pdf.Content.FontInfo: [fiCompositeDefaultWidth] :: FIComposite -> Double
+ Pdf.Content.FontInfo: [fiCompositeFontDescriptor] :: FIComposite -> Maybe FontDescriptor
+ Pdf.Content.FontInfo: [fiCompositeUnicodeCMap] :: FIComposite -> Maybe UnicodeCMap
+ Pdf.Content.FontInfo: [fiCompositeWidths] :: FIComposite -> CIDFontWidths
+ Pdf.Content.FontInfo: [fiSimpleEncoding] :: FISimple -> Maybe SimpleFontEncoding
+ Pdf.Content.FontInfo: [fiSimpleFontDescriptor] :: FISimple -> Maybe FontDescriptor
+ Pdf.Content.FontInfo: [fiSimpleFontMatrix] :: FISimple -> Transform Double
+ Pdf.Content.FontInfo: [fiSimpleUnicodeCMap] :: FISimple -> Maybe UnicodeCMap
+ Pdf.Content.FontInfo: [fiSimpleWidths] :: FISimple -> Maybe (Int, Int, [Double])
+ Pdf.Content.FontInfo: [simpleFontBaseEncoding] :: SimpleFontEncoding -> FontBaseEncoding
+ Pdf.Content.FontInfo: [simpleFontDifferences] :: SimpleFontEncoding -> [(Word8, ByteString)]
+ Pdf.Content.FontInfo: cidFontGetWidth :: CIDFontWidths -> Int -> Maybe Double
+ Pdf.Content.FontInfo: data CIDFontWidths
+ Pdf.Content.FontInfo: data FIComposite
+ Pdf.Content.FontInfo: data FISimple
+ Pdf.Content.FontInfo: data FontBaseEncoding
+ Pdf.Content.FontInfo: data FontInfo
+ Pdf.Content.FontInfo: data SimpleFontEncoding
+ Pdf.Content.FontInfo: fontInfoDecodeGlyphs :: FontInfo -> ByteString -> [(Glyph, Double)]
+ Pdf.Content.FontInfo: instance GHC.Base.Monoid Pdf.Content.FontInfo.CIDFontWidths
+ Pdf.Content.FontInfo: instance GHC.Base.Semigroup Pdf.Content.FontInfo.CIDFontWidths
+ Pdf.Content.FontInfo: instance GHC.Show.Show Pdf.Content.FontInfo.CIDFontWidths
+ Pdf.Content.FontInfo: instance GHC.Show.Show Pdf.Content.FontInfo.FIComposite
+ Pdf.Content.FontInfo: instance GHC.Show.Show Pdf.Content.FontInfo.FISimple
+ Pdf.Content.FontInfo: instance GHC.Show.Show Pdf.Content.FontInfo.FontBaseEncoding
+ Pdf.Content.FontInfo: instance GHC.Show.Show Pdf.Content.FontInfo.FontInfo
+ Pdf.Content.FontInfo: instance GHC.Show.Show Pdf.Content.FontInfo.SimpleFontEncoding
+ Pdf.Content.FontInfo: makeCIDFontWidths :: Array -> Either String CIDFontWidths
+ Pdf.Content.GlyphList: adobeGlyphList :: Map ByteString Char
+ Pdf.Content.Ops: Obj :: Object -> Expr
+ Pdf.Content.Ops: Op :: Op -> Expr
+ Pdf.Content.Ops: Op_B :: Op
+ Pdf.Content.Ops: Op_BDC :: Op
+ Pdf.Content.Ops: Op_BI :: Op
+ Pdf.Content.Ops: Op_BMC :: Op
+ Pdf.Content.Ops: Op_BT :: Op
+ Pdf.Content.Ops: Op_BX :: Op
+ Pdf.Content.Ops: Op_B_star :: Op
+ Pdf.Content.Ops: Op_CS :: Op
+ Pdf.Content.Ops: Op_DP :: Op
+ Pdf.Content.Ops: Op_Do :: Op
+ Pdf.Content.Ops: Op_EI :: Op
+ Pdf.Content.Ops: Op_EMC :: Op
+ Pdf.Content.Ops: Op_ET :: Op
+ Pdf.Content.Ops: Op_EX :: Op
+ Pdf.Content.Ops: Op_F :: Op
+ Pdf.Content.Ops: Op_G :: Op
+ Pdf.Content.Ops: Op_ID :: Op
+ Pdf.Content.Ops: Op_J :: Op
+ Pdf.Content.Ops: Op_K :: Op
+ Pdf.Content.Ops: Op_M :: Op
+ Pdf.Content.Ops: Op_MP :: Op
+ Pdf.Content.Ops: Op_Q :: Op
+ Pdf.Content.Ops: Op_RG :: Op
+ Pdf.Content.Ops: Op_S :: Op
+ Pdf.Content.Ops: Op_SC :: Op
+ Pdf.Content.Ops: Op_SCN :: Op
+ Pdf.Content.Ops: Op_TD :: Op
+ Pdf.Content.Ops: Op_TJ :: Op
+ Pdf.Content.Ops: Op_TL :: Op
+ Pdf.Content.Ops: Op_T_star :: Op
+ Pdf.Content.Ops: Op_Tc :: Op
+ Pdf.Content.Ops: Op_Td :: Op
+ Pdf.Content.Ops: Op_Tf :: Op
+ Pdf.Content.Ops: Op_Tj :: Op
+ Pdf.Content.Ops: Op_Tm :: Op
+ Pdf.Content.Ops: Op_Tr :: Op
+ Pdf.Content.Ops: Op_Ts :: Op
+ Pdf.Content.Ops: Op_Tw :: Op
+ Pdf.Content.Ops: Op_Tz :: Op
+ Pdf.Content.Ops: Op_W :: Op
+ Pdf.Content.Ops: Op_W_star :: Op
+ Pdf.Content.Ops: Op_apostrophe :: Op
+ Pdf.Content.Ops: Op_b :: Op
+ Pdf.Content.Ops: Op_b_star :: Op
+ Pdf.Content.Ops: Op_c :: Op
+ Pdf.Content.Ops: Op_cm :: Op
+ Pdf.Content.Ops: Op_cs :: Op
+ Pdf.Content.Ops: Op_d :: Op
+ Pdf.Content.Ops: Op_d0 :: Op
+ Pdf.Content.Ops: Op_d1 :: Op
+ Pdf.Content.Ops: Op_f :: Op
+ Pdf.Content.Ops: Op_f_star :: Op
+ Pdf.Content.Ops: Op_g :: Op
+ Pdf.Content.Ops: Op_gs :: Op
+ Pdf.Content.Ops: Op_h :: Op
+ Pdf.Content.Ops: Op_i :: Op
+ Pdf.Content.Ops: Op_j :: Op
+ Pdf.Content.Ops: Op_k :: Op
+ Pdf.Content.Ops: Op_l :: Op
+ Pdf.Content.Ops: Op_m :: Op
+ Pdf.Content.Ops: Op_n :: Op
+ Pdf.Content.Ops: Op_q :: Op
+ Pdf.Content.Ops: Op_quote :: Op
+ Pdf.Content.Ops: Op_re :: Op
+ Pdf.Content.Ops: Op_rg :: Op
+ Pdf.Content.Ops: Op_ri :: Op
+ Pdf.Content.Ops: Op_s :: Op
+ Pdf.Content.Ops: Op_sc :: Op
+ Pdf.Content.Ops: Op_scn :: Op
+ Pdf.Content.Ops: Op_sh :: Op
+ Pdf.Content.Ops: Op_v :: Op
+ Pdf.Content.Ops: Op_w :: Op
+ Pdf.Content.Ops: Op_y :: Op
+ Pdf.Content.Ops: UnknownOp :: ByteString -> Op
+ Pdf.Content.Ops: data Expr
+ Pdf.Content.Ops: data Op
+ Pdf.Content.Ops: instance GHC.Classes.Eq Pdf.Content.Ops.Expr
+ Pdf.Content.Ops: instance GHC.Classes.Eq Pdf.Content.Ops.Op
+ Pdf.Content.Ops: instance GHC.Show.Show Pdf.Content.Ops.Expr
+ Pdf.Content.Ops: instance GHC.Show.Show Pdf.Content.Ops.Op
+ Pdf.Content.Ops: toOp :: ByteString -> Op
+ Pdf.Content.Ops: type Operator = (Op, [Object])
+ Pdf.Content.Parser: parseContent :: Parser (Maybe Expr)
+ Pdf.Content.Parser: readNextOperator :: InputStream Expr -> IO (Maybe Operator)
+ Pdf.Content.Processor: Glyph :: Int -> Vector Double -> Vector Double -> Maybe Text -> Glyph
+ Pdf.Content.Processor: GraphicsState :: Bool -> Transform Double -> Maybe Name -> Maybe Double -> Transform Double -> Transform Double -> Double -> Double -> Double -> GraphicsState
+ Pdf.Content.Processor: Processor :: GraphicsState -> [GraphicsState] -> GlyphDecoder -> [Span] -> Processor
+ Pdf.Content.Processor: Span :: [Glyph] -> Name -> Span
+ Pdf.Content.Processor: [glyphBottomRight] :: Glyph -> Vector Double
+ Pdf.Content.Processor: [glyphCode] :: Glyph -> Int
+ Pdf.Content.Processor: [glyphText] :: Glyph -> Maybe Text
+ Pdf.Content.Processor: [glyphTopLeft] :: Glyph -> Vector Double
+ Pdf.Content.Processor: [gsCurrentTransformMatrix] :: GraphicsState -> Transform Double
+ Pdf.Content.Processor: [gsFontSize] :: GraphicsState -> Maybe Double
+ Pdf.Content.Processor: [gsFont] :: GraphicsState -> Maybe Name
+ Pdf.Content.Processor: [gsInText] :: GraphicsState -> Bool
+ Pdf.Content.Processor: [gsTextCharSpacing] :: GraphicsState -> Double
+ Pdf.Content.Processor: [gsTextLeading] :: GraphicsState -> Double
+ Pdf.Content.Processor: [gsTextLineMatrix] :: GraphicsState -> Transform Double
+ Pdf.Content.Processor: [gsTextMatrix] :: GraphicsState -> Transform Double
+ Pdf.Content.Processor: [gsTextWordSpacing] :: GraphicsState -> Double
+ Pdf.Content.Processor: [prGlyphDecoder] :: Processor -> GlyphDecoder
+ Pdf.Content.Processor: [prSpans] :: Processor -> [Span]
+ Pdf.Content.Processor: [prStateStack] :: Processor -> [GraphicsState]
+ Pdf.Content.Processor: [prState] :: Processor -> GraphicsState
+ Pdf.Content.Processor: [spFontName] :: Span -> Name
+ Pdf.Content.Processor: [spGlyphs] :: Span -> [Glyph]
+ Pdf.Content.Processor: data Glyph
+ Pdf.Content.Processor: data GraphicsState
+ Pdf.Content.Processor: data Processor
+ Pdf.Content.Processor: data Span
+ Pdf.Content.Processor: initialGraphicsState :: GraphicsState
+ Pdf.Content.Processor: instance GHC.Show.Show Pdf.Content.Processor.Glyph
+ Pdf.Content.Processor: instance GHC.Show.Show Pdf.Content.Processor.GraphicsState
+ Pdf.Content.Processor: mkProcessor :: Processor
+ Pdf.Content.Processor: processOp :: Operator -> Processor -> Either String Processor
+ Pdf.Content.Processor: type GlyphDecoder = Name -> ByteString -> [(Glyph, Double)]
+ Pdf.Content.TexGlyphList: texGlyphList :: Map ByteString Char
+ Pdf.Content.Transform: Transform :: a -> a -> a -> a -> a -> a -> Transform a
+ Pdf.Content.Transform: Vector :: a -> a -> Vector a
+ Pdf.Content.Transform: data Transform a
+ Pdf.Content.Transform: data Vector a
+ Pdf.Content.Transform: identity :: Num a => Transform a
+ Pdf.Content.Transform: instance GHC.Show.Show a => GHC.Show.Show (Pdf.Content.Transform.Transform a)
+ Pdf.Content.Transform: instance GHC.Show.Show a => GHC.Show.Show (Pdf.Content.Transform.Vector a)
+ Pdf.Content.Transform: multiply :: Num a => Transform a -> Transform a -> Transform a
+ Pdf.Content.Transform: scale :: Num a => a -> a -> Transform a
+ Pdf.Content.Transform: transform :: Num a => Transform a -> Vector a -> Vector a
+ Pdf.Content.Transform: translate :: Num a => a -> a -> Transform a -> Transform a
+ Pdf.Content.Transform: translation :: Num a => a -> a -> Transform a
+ Pdf.Content.UnicodeCMap: UnicodeCMap :: [(ByteString, ByteString)] -> Map Int Text -> [(Int, Int, Char)] -> UnicodeCMap
+ Pdf.Content.UnicodeCMap: [unicodeCMapChars] :: UnicodeCMap -> Map Int Text
+ Pdf.Content.UnicodeCMap: [unicodeCMapCodeRanges] :: UnicodeCMap -> [(ByteString, ByteString)]
+ Pdf.Content.UnicodeCMap: [unicodeCMapRanges] :: UnicodeCMap -> [(Int, Int, Char)]
+ Pdf.Content.UnicodeCMap: data UnicodeCMap
+ Pdf.Content.UnicodeCMap: instance GHC.Show.Show Pdf.Content.UnicodeCMap.UnicodeCMap
+ Pdf.Content.UnicodeCMap: parseUnicodeCMap :: ByteString -> Either String UnicodeCMap
+ Pdf.Content.UnicodeCMap: unicodeCMapDecodeGlyph :: UnicodeCMap -> Int -> Maybe Text
+ Pdf.Content.UnicodeCMap: unicodeCMapNextGlyph :: UnicodeCMap -> ByteString -> Maybe (Int, ByteString)

Files

changelog.md view
@@ -1,23 +1,10 @@-0.0.5.1--* fix compilation on ghc 7.4, 7.6 and 7.8--0.0.5.0--* add support for multiple bfrange and bfchars sections in CMap-* support spaces inside hex numbers in CMap--0.0.4.0--* switch to errors-2.0-* workaround for parse error on inline image in content stream--0.0.3.3--* support ghc-7.10.1+unreleased -0.0.3.2+0.1.1 +* rework API+* support ghc from 8.0 to 8.10 and drop older versions+* lots of improvements to text extraction * support array ranges in unicode cmap (#15) * support Op\_apostrophe content operator (#16) 
compat/Prelude.hs view
@@ -5,24 +5,16 @@ (   module P, -#if MIN_VERSION_base(4,8,0)+#if MIN_VERSION_base(4,11,0) #else-  (<$>),-  Monoid(..),-  Applicative(..),+  Semigroup(..), #endif ) where -#if MIN_VERSION_base(4,6,0) import "base" Prelude as P-#else-import "base" Prelude as P hiding (catch)-#endif -#if MIN_VERSION_base(4,8,0)+#if MIN_VERSION_base(4,11,0) #else-import Data.Functor ((<$>))-import Data.Monoid(Monoid(..))-import Control.Applicative (Applicative(..))+import Data.Semigroup(Semigroup(..)) #endif
+ lib/Pdf/Content.hs view
@@ -0,0 +1,21 @@++-- | Low level tools for processing PDF page content stream.++module Pdf.Content+( module Pdf.Content.Ops+, module Pdf.Content.Parser+, module Pdf.Content.UnicodeCMap+, module Pdf.Content.Processor+, module Pdf.Content.Transform+, module Pdf.Content.FontInfo+, module Pdf.Content.FontDescriptor+)+where++import Pdf.Content.Ops+import Pdf.Content.Parser+import Pdf.Content.UnicodeCMap+import Pdf.Content.Processor+import Pdf.Content.Transform+import Pdf.Content.FontInfo+import Pdf.Content.FontDescriptor
+ lib/Pdf/Content/Encoding/MacRoman.hs view
@@ -0,0 +1,437 @@+{-# LANGUAGE OverloadedStrings #-}++module Pdf.Content.Encoding.MacRoman+(+  encoding+)+where++import Data.Word+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Text (Text)++encoding :: Map Word8 Text+encoding = Map.fromList $ zip codes chars++chars :: [Text]+chars = [+  "A",+  "Æ",+  "Á",+  "Â",+  "Ä",+  "À",+  "Å",+  "Ã",+  "B",+  "C",+  "Ç",+  "D",+  "E",+  "É",+  "Ê",+  "Ë",+  "È",+  "F",+  "G",+  "H",+  "I",+  "Í",+  "Î",+  "Ï",+  "Ì",+  "J",+  "K",+  "L",+  "M",+  "N",+  "Ñ",+  "O",+  "Œ",+  "Ó",+  "Ô",+  "Ö",+  "Ò",+  "Ø",+  "Õ",+  "P",+  "Q",+  "R",+  "S",+  "T",+  "U",+  "Ú",+  "Û",+  "Ü",+  "Ù",+  "V",+  "W",+  "X",+  "Y",+  "Ÿ",+  "Z",+  "a",+  "á",+  "â",+  "´",+  "ä",+  "æ",+  "à",+  "&",+  "å",+  "^",+  "~",+  "*",+  "@",+  "ã",+  "b",+  "\\",+  "|",+  "{",+  "}",+  "[",+  "]",+  "˘",+  "•",+  "c",+  "ˇ",+  "ç",+  " ̧",+  "¢",+  "ˆ",+  ":",+  ",",+  "©",+  "¤",+  "d",+  "†",+  "‡",+  "°",+  "¨",+  "÷",+  "$",+  "˙",+  "ı",+  "e",+  "é",+  "ê",+  "ë",+  "è",+  "8",+  "…",+  "—",+  "–",+  "=",+  "!",+  "¡",+  "f",+  "fi",+  "5",+  "fl",+  "ƒ",+  "4",+  "⁄",+  "g",+  "ß",+  "`",+  ">",+  "«",+  "»",+  "‹",+  "›",+  "h",+  "˝",+  "-",+  "i",+  "í",+  "î",+  "ï",+  "ì",+  "j",+  "k",+  "l",+  "<",+  "¬",+  "m",+  " ̄",+  "μ",+  "n",+  "9",+  "ñ",+  "#",+  "o",+  "ó",+  "ô",+  "ö",+  "œ",+  "˛",+  "ò",+  "1",+  "ª",+  "º",+  "ø",+  "õ",+  "p",+  "¶",+  "(",+  ")",+  "%",+  ".",+  "·",+  "‰",+  "+",+  "±",+  "q",+  "?",+  "¿",+  "\"",+  "„",+  "“",+  "”",+  "‘",+  "’",+  "‚",+  "'",+  "r",+  "®",+  "∘",+  "s",+  "§",+  ";",+  "7",+  "6",+  "/",+  " ",+  "£",+  "t",+  "3",+  "~",+  "™",+  "2",+  "u",+  "ú",+  "û",+  "ü",+  "ù",+  "_",+  "v",+  "w",+  "x",+  "y",+  "ÿ",+  "¥",+  "z",+  "0"+  ]++codes :: [Word8]+codes = [+  0o101,+  0o256,+  0o347,+  0o345,+  0o200,+  0o313,+  0o201,+  0o314,+  0o102,+  0o103,+  0o202,+  0o104,+  0o105,+  0o203,+  0o346,+  0o350,+  0o351,+  0o106,+  0o107,+  0o110,+  0o111,+  0o352,+  0o353,+  0o354,+  0o355,+  0o112,+  0o113,+  0o114,+  0o115,+  0o116,+  0o204,+  0o117,+  0o316,+  0o356,+  0o357,+  0o205,+  0o361,+  0o257,+  0o315,+  0o120,+  0o121,+  0o122,+  0o123,+  0o124,+  0o125,+  0o362,+  0o363,+  0o206,+  0o364,+  0o126,+  0o127,+  0o130,+  0o131,+  0o331,+  0o132,+  0o141,+  0o207,+  0o211,+  0o253,+  0o212,+  0o276,+  0o210,+  0o046,+  0o214,+  0o136,+  0o176,+  0o052,+  0o100,+  0o213,+  0o142,+  0o134,+  0o174,+  0o173,+  0o175,+  0o133,+  0o135,+  0o371,+  0o245,+  0o143,+  0o377,+  0o215,+  0o374,+  0o242,+  0o366,+  0o072,+  0o054,+  0o251,+  0o333,+  0o144,+  0o240,+  0o340,+  0o241,+  0o254,+  0o326,+  0o044,+  0o372,+  0o365,+  0o145,+  0o216,+  0o220,+  0o221,+  0o217,+  0o070,+  0o311,+  0o321,+  0o320,+  0o075,+  0o041,+  0o301,+  0o146,+  0o336,+  0o065,+  0o337,+  0o304,+  0o064,+  0o332,+  0o147,+  0o247,+  0o140,+  0o076,+  0o307,+  0o310,+  0o334,+  0o335,+  0o150,+  0o375,+  0o055,+  0o151,+  0o222,+  0o224,+  0o225,+  0o223,+  0o152,+  0o153,+  0o154,+  0o074,+  0o302,+  0o155,+  0o370,+  0o265,+  0o156,+  0o071,+  0o226,+  0o043,+  0o157,+  0o227,+  0o231,+  0o232,+  0o317,+  0o376,+  0o230,+  0o061,+  0o273,+  0o274,+  0o277,+  0o233,+  0o160,+  0o246,+  0o050,+  0o051,+  0o045,+  0o056,+  0o341,+  0o344,+  0o053,+  0o261,+  0o161,+  0o077,+  0o300,+  0o042,+  0o343,+  0o322,+  0o323,+  0o324,+  0o325,+  0o342,+  0o047,+  0o162,+  0o250,+  0o373,+  0o163,+  0o244,+  0o073,+  0o067,+  0o066,+  0o057,+  0o040,+  0o243,+  0o164,+  0o063,+  0o367,+  0o252,+  0o062,+  0o165,+  0o234,+  0o236,+  0o237,+  0o235,+  0o137,+  0o166,+  0o167,+  0o170,+  0o171,+  0o330,+  0o264,+  0o172,+  0o060+  ]
+ lib/Pdf/Content/Encoding/PdfDoc.hs view
@@ -0,0 +1,271 @@+{-# LANGUAGE OverloadedStrings #-}++module Pdf.Content.Encoding.PdfDoc+( encoding+)+where++import Data.Word+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Text (Text)++encoding :: Map Word8 Text+encoding = Map.fromList+  [ (0, "\x0000")+  , (1, "\x0001")+  , (2, "\x0002")+  , (3, "\x0003")+  , (4, "\x0004")+  , (5, "\x0005")+  , (6, "\x0006")+  , (7, "\x0007")+  , (8, "\x0008")+  , (9, "\x0009")+  , (10, "\x000A")+  , (11, "\x000B")+  , (12, "\x000C")+  , (13, "\x000D")+  , (14, "\x000E")+  , (15, "\x000F")+  , (16, "\x0010")+  , (17, "\x0011")+  , (18, "\x0012")+  , (19, "\x0013")+  , (20, "\x0014")+  , (21, "\x0015")+  , (22, "\x0017")+  , (23, "\x0017")+  , (24, "\x02D8")+  , (25, "\x02C7")+  , (26, "\x02C6")+  , (27, "\x02D9")+  , (28, "\x02DD")+  , (29, "\x02DB")+  , (30, "\x02DA")+  , (31, "\x02DC")+  , (32, "\x0020")+  , (33, "\x0021")+  , (34, "\x0022")+  , (35, "\x0023")+  , (36, "\x0024")+  , (37, "\x0025")+  , (38, "\x0026")+  , (39, "\x0027")+  , (40, "\x0028")+  , (41, "\x0029")+  , (42, "\x002A")+  , (43, "\x002B")+  , (44, "\x002C")+  , (45, "\x002D")+  , (46, "\x002E")+  , (47, "\x002F")+  , (48, "\x0030")+  , (49, "\x0031")+  , (50, "\x0032")+  , (51, "\x0033")+  , (52, "\x0034")+  , (53, "\x0035")+  , (54, "\x0036")+  , (55, "\x0037")+  , (56, "\x0038")+  , (57, "\x0039")+  , (58, "\x003A")+  , (59, "\x003B")+  , (60, "\x003C")+  , (61, "\x003D")+  , (62, "\x003E")+  , (63, "\x003F")+  , (64, "\x0040")+  , (65, "\x0041")+  , (66, "\x0042")+  , (67, "\x0043")+  , (68, "\x0044")+  , (69, "\x0045")+  , (70, "\x0046")+  , (71, "\x0047")+  , (72, "\x0048")+  , (73, "\x0049")+  , (74, "\x004A")+  , (75, "\x004B")+  , (76, "\x004C")+  , (77, "\x004D")+  , (78, "\x004E")+  , (79, "\x004F")+  , (80, "\x0050")+  , (81, "\x0051")+  , (82, "\x0052")+  , (83, "\x0053")+  , (84, "\x0054")+  , (85, "\x0055")+  , (86, "\x0056")+  , (87, "\x0057")+  , (88, "\x0058")+  , (89, "\x0059")+  , (90, "\x005A")+  , (91, "\x005B")+  , (92, "\x005C")+  , (93, "\x005D")+  , (94, "\x005E")+  , (95, "\x005F")+  , (96, "\x0060")+  , (97, "\x0061")+  , (98, "\x0062")+  , (99, "\x0063")+  , (100, "\x0064")+  , (101, "\x0065")+  , (102, "\x0066")+  , (103, "\x0067")+  , (104, "\x0068")+  , (105, "\x0069")+  , (106, "\x006A")+  , (107, "\x006B")+  , (108, "\x006C")+  , (109, "\x006D")+  , (110, "\x006E")+  , (111, "\x006F")+  , (112, "\x0070")+  , (113, "\x0071")+  , (114, "\x0072")+  , (115, "\x0073")+  , (116, "\x0074")+  , (117, "\x0075")+  , (118, "\x0076")+  , (119, "\x0077")+  , (120, "\x0078")+  , (121, "\x0079")+  , (122, "\x007A")+  , (123, "\x007B")+  , (124, "\x007C")+  , (125, "\x007D")+  , (126, "\x007E")+  -- there is no 127+  , (128, "\x2022")+  , (129, "\x2020")+  , (130, "\x2021")+  , (131, "\x2026")+  , (132, "\x2014")+  , (133, "\x2013")+  , (134, "\x0192")+  , (135, "\x2044")+  , (136, "\x2039")+  , (137, "\x203A")+  , (138, "\x2212")+  , (139, "\x2030")+  , (140, "\x201E")+  , (141, "\x201C")+  , (142, "\x201D")+  , (143, "\x2018")+  , (144, "\x2019")+  , (145, "\x201A")+  , (146, "\x2122")+  , (147, "\xFB01")+  , (148, "\xFB02")+  , (149, "\x0141")+  , (150, "\x0152")+  , (151, "\x0160")+  , (152, "\x0178")+  , (153, "\x017D")+  , (154, "\x0131")+  , (155, "\x0142")+  , (156, "\x0153")+  , (157, "\x0161")+  , (158, "\x017E")+  -- there is no 159+  , (160, "\x20AC")+  , (161, "\x00A1")+  , (162, "\x00A2")+  , (163, "\x00A3")+  , (164, "\x00A4")+  , (165, "\x00A5")+  , (166, "\x00A6")+  , (167, "\x00A7")+  , (168, "\x00A8")+  , (169, "\x00A9")+  , (170, "\x00AA")+  , (171, "\x00AB")+  , (172, "\x00AC")+  -- there is no 173+  , (174, "\x00AE")+  , (175, "\x00AF")+  , (176, "\x00B0")+  , (177, "\x00B1")+  , (178, "\x00B2")+  , (179, "\x00B3")+  , (180, "\x00B4")+  , (181, "\x00B5")+  , (182, "\x00B6")+  , (183, "\x00B7")+  , (184, "\x00B8")+  , (185, "\x00B9")+  , (186, "\x00BA")+  , (187, "\x00BB")+  , (188, "\x00BC")+  , (189, "\x00BD")+  , (190, "\x00BE")+  , (191, "\x00BF")+  , (192, "\x00C0")+  , (193, "\x00C1")+  , (194, "\x00C2")+  , (195, "\x00C3")+  , (196, "\x00C4")+  , (197, "\x00C5")+  , (198, "\x00C6")+  , (199, "\x00C7")+  , (200, "\x00C8")+  , (201, "\x00C9")+  , (202, "\x00CA")+  , (203, "\x00CB")+  , (204, "\x00CC")+  , (205, "\x00CD")+  , (206, "\x00CE")+  , (207, "\x00CF")+  , (208, "\x00D0")+  , (209, "\x00D1")+  , (210, "\x00D2")+  , (211, "\x00D3")+  , (212, "\x00D4")+  , (213, "\x00D5")+  , (214, "\x00D6")+  , (215, "\x00D7")+  , (216, "\x00D8")+  , (217, "\x00D9")+  , (218, "\x00DA")+  , (219, "\x00DB")+  , (220, "\x00DC")+  , (221, "\x00DD")+  , (222, "\x00DE")+  , (223, "\x00DF")+  , (224, "\x00E0")+  , (225, "\x00E1")+  , (226, "\x00E2")+  , (227, "\x00E3")+  , (228, "\x00E4")+  , (229, "\x00E5")+  , (230, "\x00E6")+  , (231, "\x00E7")+  , (232, "\x00E8")+  , (233, "\x00E9")+  , (234, "\x00EA")+  , (235, "\x00EB")+  , (236, "\x00EC")+  , (237, "\x00ED")+  , (238, "\x00EE")+  , (239, "\x00EF")+  , (240, "\x00F0")+  , (241, "\x00F1")+  , (242, "\x00F2")+  , (243, "\x00F3")+  , (244, "\x00F4")+  , (245, "\x00F5")+  , (246, "\x00F6")+  , (247, "\x00F7")+  , (248, "\x00F8")+  , (249, "\x00F9")+  , (250, "\x00FA")+  , (251, "\x00FB")+  , (252, "\x00FC")+  , (253, "\x00FD")+  , (254, "\x00FE")+  , (255, "\x00FF")+  ]
+ lib/Pdf/Content/Encoding/WinAnsi.hs view
@@ -0,0 +1,455 @@+{-# LANGUAGE OverloadedStrings #-}++module Pdf.Content.Encoding.WinAnsi+(+  encoding+)+where++import Data.Word+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Text (Text)++encoding :: Map Word8 Text+encoding = Map.fromList $ zip codes chars++chars :: [Text]+chars = [+  "A",+  "Æ",+  "Á",+  "Â",+  "Ä",+  "À",+  "Å",+  "Ã",+  "B",+  "C",+  "Ç",+  "D",+  "E",+  "É",+  "Ê",+  "Ë",+  "È",+  "Ð",+  "€",+  "F",+  "G",+  "H",+  "I",+  "Í",+  "Î",+  "Ï",+  "Ì",+  "J",+  "K",+  "L",+  "M",+  "N",+  "Ñ",+  "O",+  "Œ",+  "Ó",+  "Ô",+  "Ö",+  "Ò",+  "Ø",+  "Õ",+  "P",+  "Q",+  "R",+  "S",+  "Š",+  "T",+  "Þ",+  "U",+  "Ú",+  "Û",+  "Ü",+  "Ù",+  "V",+  "W",+  "X",+  "Y",+  "Ý",+  "Ÿ",+  "Z",+  "Ž",+  "a",+  "á",+  "â",+  "´",+  "ä",+  "æ",+  "à",+  "&",+  "å",+  "^",+  "~",+  "*",+  "@",+  "ã",+  "b",+  "\\",+  "|",+  "{",+  "}",+  "[",+  "]",+  "¦",+  "•",+  "c",+  "ç",+  " ̧",+  "¢",+  "ˆ",+  ":",+  ",",+  "©",+  "¤",+  "d",+  "†",+  "‡",+  "°",+  "¨",+  "÷",+  "$",+  "e",+  "é",+  "ê",+  "ë",+  "è",+  "8",+  "…",+  "—",+  "–",+  "=",+  "ð",+  "!",+  "¡",+  "f",+  "5",+  "ƒ",+  "4",+  "g",+  "ß",+  "`",+  ">",+  "«",+  "»",+  "‹",+  "›",+  "h",+  "-",+  "i",+  "í",+  "î",+  "ï",+  "ì",+  "j",+  "k",+  "l",+  "<",+  "¬",+  "m",+  " ̄",+  "μ",+  "×",+  "n",+  "9",+  "ñ",+  "#",+  "o",+  "ó",+  "ô",+  "ö",+  "œ",+  "ò",+  "1",+  "½",+  "¼",+  "¹",+  "ª",+  "º",+  "ø",+  "õ",+  "p",+  "¶",+  "(",+  ")",+  "%",+  ".",+  "·",+  "‰",+  "+",+  "±",+  "q",+  "?",+  "¿",+  "\"",+  "„",+  "“",+  "”",+  "‘",+  "’",+  "‚",+  "'",+  "r",+  "®",+  "s",+  "š",+  "§",+  ";",+  "7",+  "6",+  "/",+  " ",+  "£",+  "t",+  "þ",+  "3",+  "¾",+  "³",+  "~",+  "™",+  "2",+  "²",+  "u",+  "ú",+  "û",+  "ü",+  "ù",+  "_",+  "v",+  "w",+  "x",+  "y",+  "ý",+  "ÿ",+  "¥",+  "z",+  "ž",+  "0"+  ]++codes :: [Word8]+codes = [+  0o101,+  0o306,+  0o301,+  0o302,+  0o304,+  0o300,+  0o305,+  0o303,+  0o102,+  0o103,+  0o307,+  0o104,+  0o105,+  0o311,+  0o312,+  0o313,+  0o310,+  0o320,+  0o200,+  0o106,+  0o107,+  0o110,+  0o111,+  0o315,+  0o316,+  0o317,+  0o314,+  0o112,+  0o113,+  0o114,+  0o115,+  0o116,+  0o321,+  0o117,+  0o214,+  0o323,+  0o324,+  0o326,+  0o322,+  0o330,+  0o325,+  0o120,+  0o121,+  0o122,+  0o123,+  0o212,+  0o124,+  0o336,+  0o125,+  0o332,+  0o333,+  0o334,+  0o331,+  0o126,+  0o127,+  0o130,+  0o131,+  0o335,+  0o237,+  0o132,+  0o216,+  0o141,+  0o341,+  0o342,+  0o264,+  0o344,+  0o346,+  0o340,+  0o046,+  0o345,+  0o136,+  0o176,+  0o052,+  0o100,+  0o343,+  0o142,+  0o134,+  0o174,+  0o173,+  0o175,+  0o133,+  0o135,+  0o246,+  0o225,+  0o143,+  0o347,+  0o270,+  0o242,+  0o210,+  0o072,+  0o054,+  0o251,+  0o244,+  0o144,+  0o206,+  0o207,+  0o260,+  0o250,+  0o367,+  0o044,+  0o145,+  0o351,+  0o352,+  0o353,+  0o350,+  0o070,+  0o205,+  0o227,+  0o226,+  0o075,+  0o360,+  0o041,+  0o241,+  0o146,+  0o065,+  0o203,+  0o064,+  0o147,+  0o337,+  0o140,+  0o076,+  0o253,+  0o273,+  0o213,+  0o233,+  0o150,+  0o055,+  0o151,+  0o355,+  0o356,+  0o357,+  0o354,+  0o152,+  0o153,+  0o154,+  0o074,+  0o254,+  0o155,+  0o257,+  0o265,+  0o327,+  0o156,+  0o071,+  0o361,+  0o043,+  0o157,+  0o363,+  0o364,+  0o366,+  0o234,+  0o362,+  0o061,+  0o275,+  0o274,+  0o271,+  0o252,+  0o272,+  0o370,+  0o365,+  0o160,+  0o266,+  0o050,+  0o051,+  0o045,+  0o056,+  0o267,+  0o211,+  0o053,+  0o261,+  0o161,+  0o077,+  0o277,+  0o042,+  0o204,+  0o223,+  0o224,+  0o221,+  0o222,+  0o202,+  0o047,+  0o162,+  0o256,+  0o163,+  0o232,+  0o247,+  0o073,+  0o067,+  0o066,+  0o057,+  0o040,+  0o243,+  0o164,+  0o376,+  0o063,+  0o276,+  0o263,+  0o230,+  0o231,+  0o062,+  0o262,+  0o165,+  0o372,+  0o373,+  0o374,+  0o371,+  0o137,+  0o166,+  0o167,+  0o170,+  0o171,+  0o375,+  0o377,+  0o245,+  0o172,+  0o236,+  0o060+  ]
+ lib/Pdf/Content/FontDescriptor.hs view
@@ -0,0 +1,60 @@++-- | The FontDescriptor describes a font's other metrics than it's+-- widths, see chap. 9.8 of PDF32000:2008++module Pdf.Content.FontDescriptor+  ( FontDescriptor(..)+  , FontDescriptorFlag(..)+  , flagSet+  )+where++import Pdf.Core.Types++import Data.Int+import Data.ByteString (ByteString)++data FontDescriptor = FontDescriptor {+  fdFontName :: ByteString,+  fdFontFamily :: Maybe ByteString,+  fdFontStretch :: Maybe ByteString,+  fdFontWeight :: Maybe Int,+  fdFlags :: Int64, -- must hold at least 32 bit unsigned integers+  fdFontBBox :: Maybe (Rectangle Double),+  fdItalicAngle :: Double,+  fdAscent :: Maybe Double,+  fdDescent :: Maybe Double,+  fdLeading :: Maybe Double,+  fdCapHeight :: Maybe Double,+  fdXHeight :: Maybe Double,+  fdStemV :: Maybe Double,+  fdStemH :: Maybe Double,+  fdAvgWidth :: Maybe Double,+  fdMaxWidth :: Maybe Double,+  fdMissingWidth :: Maybe Double,+  -- FIXME: add FontFile*+  fdCharSet :: Maybe ByteString+  -- FIXME: add special fields for CIDFonts+  } deriving (Show)+++data FontDescriptorFlag =+  FixedPitch | Serif | Symbolic | Script | NonSymbolic | Italic | AllCap | SmallCap | ForceBold+++flagSet :: FontDescriptor -> FontDescriptorFlag -> Bool+flagSet fd FixedPitch = flagSet' 1 (fdFlags fd) 0+flagSet fd Serif = flagSet' 2 (fdFlags fd) 0+flagSet fd Symbolic = flagSet' 3 (fdFlags fd) 0+flagSet fd Script = flagSet' 4 (fdFlags fd) 0+flagSet fd NonSymbolic = flagSet' 6 (fdFlags fd) 0+flagSet fd Italic = flagSet' 7 (fdFlags fd) 0+flagSet fd AllCap = flagSet' 17 (fdFlags fd) 0+flagSet fd SmallCap = flagSet' 18 (fdFlags fd) 0+flagSet fd ForceBold = flagSet' 19 (fdFlags fd) 0++flagSet' :: Int -> Int64 -> Int -> Bool+flagSet' pos val expnt+  | expnt == pos - 1 = val `mod` 2 == 1+  | val == 0 = False+  | otherwise = flagSet' pos (val `div` 2) (expnt+1)
+ lib/Pdf/Content/FontInfo.hs view
@@ -0,0 +1,277 @@++-- | Font info contains information, extracted from font,+-- that may be needed when processing content stream++module Pdf.Content.FontInfo+(+  FontInfo(..),+  FISimple(..),+  FontBaseEncoding(..),+  SimpleFontEncoding(..),+  FIComposite(..),+  CIDFontWidths(..),+  makeCIDFontWidths,+  cidFontGetWidth,+  fontInfoDecodeGlyphs+)+where++import Pdf.Core+import Pdf.Core.Util+import Pdf.Core.Object.Util+import Pdf.Core.Types++import Pdf.Content.UnicodeCMap+import Pdf.Content.Transform+import Pdf.Content.Processor (Glyph(..))+import Pdf.Content.GlyphList+import Pdf.Content.TexGlyphList+import Pdf.Content.FontDescriptor+import qualified Pdf.Content.Encoding.WinAnsi as WinAnsi+import qualified Pdf.Content.Encoding.MacRoman as MacRoman++import Data.List+import Data.Maybe+import Data.Word+import Data.Map (Map)+import qualified Data.Map as Map+import Data.ByteString (ByteString)+import qualified Data.ByteString as BS+import Data.Text (Text)+import qualified Data.Text as Text+import qualified Data.Text.Encoding as Text+import qualified Data.Vector as Vector+import Control.Monad++-- | Font info+data FontInfo+  = FontInfoSimple FISimple+  | FontInfoComposite FIComposite+  deriving (Show)++-- | Font info for simple fonts+data FISimple = FISimple {+  fiSimpleUnicodeCMap :: Maybe UnicodeCMap,+  fiSimpleEncoding :: Maybe SimpleFontEncoding,+  fiSimpleWidths :: Maybe (Int, Int, [Double]),+  -- ^ FirstChar, LastChar, list of widths+  fiSimpleFontMatrix :: Transform Double,+  -- FIXME: no Maybe as soon as this library provides metrics for the+  -- 14 standard fonts+  fiSimpleFontDescriptor :: Maybe FontDescriptor+  }+  deriving (Show)++-- | Standard encoding, other encodings are based on them+data FontBaseEncoding+  = FontBaseEncodingWinAnsi+  | FontBaseEncodingMacRoman+  deriving (Show)++-- | Encoding fo simple font+data SimpleFontEncoding = SimpleFontEncoding {+  simpleFontBaseEncoding :: FontBaseEncoding,+  -- | Mapping from glyph code to glyph name for cases when it is different+  -- from base encoding+  simpleFontDifferences :: [(Word8, ByteString)]+  }+  deriving (Show)++-- | Font info for Type0 font+data FIComposite = FIComposite {+  fiCompositeUnicodeCMap :: Maybe UnicodeCMap,+  fiCompositeWidths :: CIDFontWidths,+  fiCompositeDefaultWidth :: Double,+  -- FontDescriptor is present in CIDFonts, but according to specs+  -- shall not be used with Type0 fonts+  fiCompositeFontDescriptor :: Maybe FontDescriptor+  }+  deriving (Show)++-- | Glyph widths for CID fonts+data CIDFontWidths = CIDFontWidths {+  cidFontWidthsChars :: Map Int Double,+  cidFontWidthsRanges :: [(Int, Int, Double)]+  }+  deriving (Show)++instance Monoid CIDFontWidths where+  mempty = CIDFontWidths {+    cidFontWidthsChars = mempty,+    cidFontWidthsRanges = mempty+    }+  w1 `mappend` w2 = CIDFontWidths {+    cidFontWidthsChars = cidFontWidthsChars w1+        `mappend` cidFontWidthsChars w2,+    cidFontWidthsRanges = cidFontWidthsRanges w1+        `mappend` cidFontWidthsRanges w2+    }++instance Semigroup CIDFontWidths where+  (<>) = mappend++-- | Returns the Y coordinates for a bbox of a glyph of a font, in+-- text space units. Defaults to (0,1) if no FontDescriptor is+-- present.+--+-- Maybe for vertical scripts, there are individual heights for the+-- glyphs, so this takes a glyph code as second argument.+getGlyphYCoordinates :: FontInfo -> Int -> (Double, Double)+getGlyphYCoordinates (FontInfoComposite fi) =+  const $ fromMaybe (0,1) $ join $ fmap (fdYCoordinates 1000) $ fiCompositeFontDescriptor fi+getGlyphYCoordinates (FontInfoSimple fi) =+  const $ fromMaybe (0,1) $ join $ fmap (fdYCoordinates 1000) $ fiSimpleFontDescriptor fi++fdYCoordinates :: Double -> FontDescriptor -> Maybe (Double, Double)+fdYCoordinates scaling fd =+  maybe cap Just $          -- third: try CapHeight+  maybe descAsc Just $      -- second: try Descent and Ascent+  fmap bbox $ fdFontBBox fd -- first: try FontBBox+  where+    bbox (Rectangle _ b _ t) = (b / scaling, t / scaling)+    descAsc = (,) <$> (fmap (/scaling) $ fdDescent fd) <*> (fmap (/scaling) $ fdAscent fd)+    cap = (,) <$> (Just 0.0) <*> (fmap (/scaling) $ fdCapHeight fd)++simpleFontEncodingDecode :: SimpleFontEncoding -> Word8 -> Maybe Text+simpleFontEncodingDecode enc code =+  case lookup code (simpleFontDifferences enc) of+    Nothing ->+      case simpleFontBaseEncoding enc of+        FontBaseEncodingWinAnsi -> Map.lookup code WinAnsi.encoding+        FontBaseEncodingMacRoman -> Map.lookup code MacRoman.encoding+    Just glyphName ->+      case Map.lookup glyphName adobeGlyphList of+        Just c -> Just $ Text.pack [c]+        Nothing ->+          case Map.lookup glyphName texGlyphList of+            Nothing-> Nothing+            Just c -> Just $ Text.pack [c]++-- | Make `CIDFontWidths` from value of \"W\" key in descendant font+makeCIDFontWidths :: Array -> Either String CIDFontWidths+makeCIDFontWidths vals = go mempty (Vector.toList vals)+  `notice` ("Can't parse CIDFont width " ++ show vals)+  where+  go res [] = return res+  go res (x1@Number{} : x2@Number{} : x3@Number{} : xs) = do+    n1 <- intValue x1+    n2 <- intValue x2+    n3 <- realValue x3+    go res {cidFontWidthsRanges = (n1, n2, n3) : cidFontWidthsRanges res} xs+  go res (x : Array arr : xs) = do+    n <- intValue x+    ws <- forM (Vector.toList arr) realValue+    go res {cidFontWidthsChars = Map.fromList (zip [n ..] ws)+        `mappend` cidFontWidthsChars res} xs+  go _ _ = Nothing++-- | Get glyph width by glyph code+cidFontGetWidth :: CIDFontWidths -> Int -> Maybe Double+cidFontGetWidth w code =+  case Map.lookup code (cidFontWidthsChars w) of+    Just width -> Just width+    Nothing -> case find (\(start, end, _) -> code >= start && code <= end)+                         (cidFontWidthsRanges w) of+                 Just (_, _, width) -> Just width+                 _ -> Nothing++-- | Decode string into list of glyphs and their widths+fontInfoDecodeGlyphs :: FontInfo -> ByteString -> [(Glyph, Double)]+fontInfoDecodeGlyphs fInfo@(FontInfoSimple fi) = \bs ->+  flip map (BS.unpack bs) $ \c ->+    let code = fromIntegral c+        txt =+          case fiSimpleUnicodeCMap fi of+            Nothing ->+              case fiSimpleEncoding fi of+                Nothing ->+                  case Text.decodeUtf8' (BS.pack [c]) of+                    Right t -> Just t+                    _ -> Nothing+                Just enc ->+                  case simpleFontEncodingDecode enc c of+                    Just t -> Just t+                    Nothing ->+                      case Text.decodeUtf8' (BS.pack [c]) of+                        Right t -> Just t+                        _ -> Nothing+            Just toUnicode ->+              case unicodeCMapDecodeGlyph toUnicode code of+                Just t -> Just t+                Nothing ->+                  case fiSimpleEncoding fi of+                    Nothing -> Nothing+                    Just enc ->+                      case simpleFontEncodingDecode enc c of+                        Just t -> Just t+                        Nothing ->+                          case Text.decodeUtf8' (BS.pack [c]) of+                            Right t -> Just t+                            _ -> Nothing+        width =+          case fiSimpleWidths fi of+            Nothing -> 0+            Just (firstChar, lastChar, widths) ->+              if code >= firstChar && code <= lastChar+                  && (code - firstChar) < length widths+                 then let Vector w _ = transform (fiSimpleFontMatrix fi) $+                            Vector (widths !! (code - firstChar)) 0+                      in w+                 else 0+        (yBottom, yTop) = getGlyphYCoordinates fInfo code+    in (Glyph {+      glyphCode = code,+      glyphTopLeft = Vector 0 yBottom,+      glyphBottomRight = Vector width yTop,+      glyphText = txt+      }, width)+fontInfoDecodeGlyphs fInfo@(FontInfoComposite fi) = \bs ->+  case fiCompositeUnicodeCMap fi of+    Nothing ->  -- XXX: use encoding here+      tryDecode2byte $ BS.unpack bs+    Just toUnicode ->+      let getWidth = fromMaybe (fiCompositeDefaultWidth fi)+                   . cidFontGetWidth (fiCompositeWidths fi)+      in cmapDecodeString getWidth toUnicode fInfo bs+  where+  -- Most of the time composite fonts have 2-byte encoding,+  -- so lets try that for now.+  tryDecode2byte (b1:b2:rest) =+    let code = fromIntegral b1 * 255 + fromIntegral b2+        width = (/ 1000) $ fromMaybe (fiCompositeDefaultWidth fi)+                         $ cidFontGetWidth (fiCompositeWidths fi) code+        txt =+          case Text.decodeUtf8' (BS.pack [b1, b2]) of+            Right t -> Just t+            _ -> Nothing+        (yBottom, yTop) = getGlyphYCoordinates fInfo code+        g = Glyph {+          glyphCode = code,+          glyphTopLeft = Vector 0 yBottom,+          glyphBottomRight = Vector width yTop,+          glyphText = txt+          }+    in (g, width) : tryDecode2byte rest+  tryDecode2byte _ = []++cmapDecodeString+  :: (Int -> Double)+  -> UnicodeCMap+  -> FontInfo+  -> ByteString+  -> [(Glyph, Double)]+cmapDecodeString getWidth cmap fInfo str = go str+  where+  go s =+    case unicodeCMapNextGlyph cmap s of+      Nothing -> []+      Just (g, rest) ->+        let width = getWidth g / 1000+            (yBottom, yTop) = getGlyphYCoordinates fInfo g+            glyph = Glyph {+          glyphCode = g,+          glyphTopLeft = Vector 0 yBottom,+          glyphBottomRight = Vector width yTop,+          glyphText = unicodeCMapDecodeGlyph cmap g+          }+        in (glyph, width) : go rest
+ lib/Pdf/Content/GlyphList.hs view
@@ -0,0 +1,4299 @@+{-# LANGUAGE OverloadedStrings #-}++-- | Mapping from glyph names to unicode characters++module Pdf.Content.GlyphList+(+    adobeGlyphList+)+where++import Data.ByteString (ByteString)+import Data.Map (Map)+import qualified Data.Map as Map++-- | Glyph list+adobeGlyphList :: Map ByteString Char+adobeGlyphList = Map.fromList+  [("A", '\x0041')+  ,("AE", '\x00C6')+  ,("AEacute", '\x01FC')+  ,("AEmacron", '\x01E2')+  ,("AEsmall", '\xF7E6')+  ,("Aacute", '\x00C1')+  ,("Aacutesmall", '\xF7E1')+  ,("Abreve", '\x0102')+  ,("Abreveacute", '\x1EAE')+  ,("Abrevecyrillic", '\x04D0')+  ,("Abrevedotbelow", '\x1EB6')+  ,("Abrevegrave", '\x1EB0')+  ,("Abrevehookabove", '\x1EB2')+  ,("Abrevetilde", '\x1EB4')+  ,("Acaron", '\x01CD')+  ,("Acircle", '\x24B6')+  ,("Acircumflex", '\x00C2')+  ,("Acircumflexacute", '\x1EA4')+  ,("Acircumflexdotbelow", '\x1EAC')+  ,("Acircumflexgrave", '\x1EA6')+  ,("Acircumflexhookabove", '\x1EA8')+  ,("Acircumflexsmall", '\xF7E2')+  ,("Acircumflextilde", '\x1EAA')+  ,("Acute", '\xF6C9')+  ,("Acutesmall", '\xF7B4')+  ,("Acyrillic", '\x0410')+  ,("Adblgrave", '\x0200')+  ,("Adieresis", '\x00C4')+  ,("Adieresiscyrillic", '\x04D2')+  ,("Adieresismacron", '\x01DE')+  ,("Adieresissmall", '\xF7E4')+  ,("Adotbelow", '\x1EA0')+  ,("Adotmacron", '\x01E0')+  ,("Agrave", '\x00C0')+  ,("Agravesmall", '\xF7E0')+  ,("Ahookabove", '\x1EA2')+  ,("Aiecyrillic", '\x04D4')+  ,("Ainvertedbreve", '\x0202')+  ,("Alpha", '\x0391')+  ,("Alphatonos", '\x0386')+  ,("Amacron", '\x0100')+  ,("Amonospace", '\xFF21')+  ,("Aogonek", '\x0104')+  ,("Aring", '\x00C5')+  ,("Aringacute", '\x01FA')+  ,("Aringbelow", '\x1E00')+  ,("Aringsmall", '\xF7E5')+  ,("Asmall", '\xF761')+  ,("Atilde", '\x00C3')+  ,("Atildesmall", '\xF7E3')+  ,("Aybarmenian", '\x0531')+  ,("B", '\x0042')+  ,("Bcircle", '\x24B7')+  ,("Bdotaccent", '\x1E02')+  ,("Bdotbelow", '\x1E04')+  ,("Becyrillic", '\x0411')+  ,("Benarmenian", '\x0532')+  ,("Beta", '\x0392')+  ,("Bhook", '\x0181')+  ,("Blinebelow", '\x1E06')+  ,("Bmonospace", '\xFF22')+  ,("Brevesmall", '\xF6F4')+  ,("Bsmall", '\xF762')+  ,("Btopbar", '\x0182')+  ,("C", '\x0043')+  ,("Caarmenian", '\x053E')+  ,("Cacute", '\x0106')+  ,("Caron", '\xF6CA')+  ,("Caronsmall", '\xF6F5')+  ,("Ccaron", '\x010C')+  ,("Ccedilla", '\x00C7')+  ,("Ccedillaacute", '\x1E08')+  ,("Ccedillasmall", '\xF7E7')+  ,("Ccircle", '\x24B8')+  ,("Ccircumflex", '\x0108')+  ,("Cdot", '\x010A')+  ,("Cdotaccent", '\x010A')+  ,("Cedillasmall", '\xF7B8')+  ,("Chaarmenian", '\x0549')+  ,("Cheabkhasiancyrillic", '\x04BC')+  ,("Checyrillic", '\x0427')+  ,("Chedescenderabkhasiancyrillic", '\x04BE')+  ,("Chedescendercyrillic", '\x04B6')+  ,("Chedieresiscyrillic", '\x04F4')+  ,("Cheharmenian", '\x0543')+  ,("Chekhakassiancyrillic", '\x04CB')+  ,("Cheverticalstrokecyrillic", '\x04B8')+  ,("Chi", '\x03A7')+  ,("Chook", '\x0187')+  ,("Circumflexsmall", '\xF6F6')+  ,("Cmonospace", '\xFF23')+  ,("Coarmenian", '\x0551')+  ,("Csmall", '\xF763')+  ,("D", '\x0044')+  ,("DZ", '\x01F1')+  ,("DZcaron", '\x01C4')+  ,("Daarmenian", '\x0534')+  ,("Dafrican", '\x0189')+  ,("Dcaron", '\x010E')+  ,("Dcedilla", '\x1E10')+  ,("Dcircle", '\x24B9')+  ,("Dcircumflexbelow", '\x1E12')+  ,("Dcroat", '\x0110')+  ,("Ddotaccent", '\x1E0A')+  ,("Ddotbelow", '\x1E0C')+  ,("Decyrillic", '\x0414')+  ,("Deicoptic", '\x03EE')+  ,("Delta", '\x2206')+  ,("Deltagreek", '\x0394')+  ,("Dhook", '\x018A')+  ,("Dieresis", '\xF6CB')+  ,("DieresisAcute", '\xF6CC')+  ,("DieresisGrave", '\xF6CD')+  ,("Dieresissmall", '\xF7A8')+  ,("Digammagreek", '\x03DC')+  ,("Djecyrillic", '\x0402')+  ,("Dlinebelow", '\x1E0E')+  ,("Dmonospace", '\xFF24')+  ,("Dotaccentsmall", '\xF6F7')+  ,("Dslash", '\x0110')+  ,("Dsmall", '\xF764')+  ,("Dtopbar", '\x018B')+  ,("Dz", '\x01F2')+  ,("Dzcaron", '\x01C5')+  ,("Dzeabkhasiancyrillic", '\x04E0')+  ,("Dzecyrillic", '\x0405')+  ,("Dzhecyrillic", '\x040F')+  ,("E", '\x0045')+  ,("Eacute", '\x00C9')+  ,("Eacutesmall", '\xF7E9')+  ,("Ebreve", '\x0114')+  ,("Ecaron", '\x011A')+  ,("Ecedillabreve", '\x1E1C')+  ,("Echarmenian", '\x0535')+  ,("Ecircle", '\x24BA')+  ,("Ecircumflex", '\x00CA')+  ,("Ecircumflexacute", '\x1EBE')+  ,("Ecircumflexbelow", '\x1E18')+  ,("Ecircumflexdotbelow", '\x1EC6')+  ,("Ecircumflexgrave", '\x1EC0')+  ,("Ecircumflexhookabove", '\x1EC2')+  ,("Ecircumflexsmall", '\xF7EA')+  ,("Ecircumflextilde", '\x1EC4')+  ,("Ecyrillic", '\x0404')+  ,("Edblgrave", '\x0204')+  ,("Edieresis", '\x00CB')+  ,("Edieresissmall", '\xF7EB')+  ,("Edot", '\x0116')+  ,("Edotaccent", '\x0116')+  ,("Edotbelow", '\x1EB8')+  ,("Efcyrillic", '\x0424')+  ,("Egrave", '\x00C8')+  ,("Egravesmall", '\xF7E8')+  ,("Eharmenian", '\x0537')+  ,("Ehookabove", '\x1EBA')+  ,("Eightroman", '\x2167')+  ,("Einvertedbreve", '\x0206')+  ,("Eiotifiedcyrillic", '\x0464')+  ,("Elcyrillic", '\x041B')+  ,("Elevenroman", '\x216A')+  ,("Emacron", '\x0112')+  ,("Emacronacute", '\x1E16')+  ,("Emacrongrave", '\x1E14')+  ,("Emcyrillic", '\x041C')+  ,("Emonospace", '\xFF25')+  ,("Encyrillic", '\x041D')+  ,("Endescendercyrillic", '\x04A2')+  ,("Eng", '\x014A')+  ,("Enghecyrillic", '\x04A4')+  ,("Enhookcyrillic", '\x04C7')+  ,("Eogonek", '\x0118')+  ,("Eopen", '\x0190')+  ,("Epsilon", '\x0395')+  ,("Epsilontonos", '\x0388')+  ,("Ercyrillic", '\x0420')+  ,("Ereversed", '\x018E')+  ,("Ereversedcyrillic", '\x042D')+  ,("Escyrillic", '\x0421')+  ,("Esdescendercyrillic", '\x04AA')+  ,("Esh", '\x01A9')+  ,("Esmall", '\xF765')+  ,("Eta", '\x0397')+  ,("Etarmenian", '\x0538')+  ,("Etatonos", '\x0389')+  ,("Eth", '\x00D0')+  ,("Ethsmall", '\xF7F0')+  ,("Etilde", '\x1EBC')+  ,("Etildebelow", '\x1E1A')+  ,("Euro", '\x20AC')+  ,("Ezh", '\x01B7')+  ,("Ezhcaron", '\x01EE')+  ,("Ezhreversed", '\x01B8')+  ,("F", '\x0046')+  ,("Fcircle", '\x24BB')+  ,("Fdotaccent", '\x1E1E')+  ,("Feharmenian", '\x0556')+  ,("Feicoptic", '\x03E4')+  ,("Fhook", '\x0191')+  ,("Fitacyrillic", '\x0472')+  ,("Fiveroman", '\x2164')+  ,("Fmonospace", '\xFF26')+  ,("Fourroman", '\x2163')+  ,("Fsmall", '\xF766')+  ,("G", '\x0047')+  ,("GBsquare", '\x3387')+  ,("Gacute", '\x01F4')+  ,("Gamma", '\x0393')+  ,("Gammaafrican", '\x0194')+  ,("Gangiacoptic", '\x03EA')+  ,("Gbreve", '\x011E')+  ,("Gcaron", '\x01E6')+  ,("Gcedilla", '\x0122')+  ,("Gcircle", '\x24BC')+  ,("Gcircumflex", '\x011C')+  ,("Gcommaaccent", '\x0122')+  ,("Gdot", '\x0120')+  ,("Gdotaccent", '\x0120')+  ,("Gecyrillic", '\x0413')+  ,("Ghadarmenian", '\x0542')+  ,("Ghemiddlehookcyrillic", '\x0494')+  ,("Ghestrokecyrillic", '\x0492')+  ,("Gheupturncyrillic", '\x0490')+  ,("Ghook", '\x0193')+  ,("Gimarmenian", '\x0533')+  ,("Gjecyrillic", '\x0403')+  ,("Gmacron", '\x1E20')+  ,("Gmonospace", '\xFF27')+  ,("Grave", '\xF6CE')+  ,("Gravesmall", '\xF760')+  ,("Gsmall", '\xF767')+  ,("Gsmallhook", '\x029B')+  ,("Gstroke", '\x01E4')+  ,("H", '\x0048')+  ,("H18533", '\x25CF')+  ,("H18543", '\x25AA')+  ,("H18551", '\x25AB')+  ,("H22073", '\x25A1')+  ,("HPsquare", '\x33CB')+  ,("Haabkhasiancyrillic", '\x04A8')+  ,("Hadescendercyrillic", '\x04B2')+  ,("Hardsigncyrillic", '\x042A')+  ,("Hbar", '\x0126')+  ,("Hbrevebelow", '\x1E2A')+  ,("Hcedilla", '\x1E28')+  ,("Hcircle", '\x24BD')+  ,("Hcircumflex", '\x0124')+  ,("Hdieresis", '\x1E26')+  ,("Hdotaccent", '\x1E22')+  ,("Hdotbelow", '\x1E24')+  ,("Hmonospace", '\xFF28')+  ,("Hoarmenian", '\x0540')+  ,("Horicoptic", '\x03E8')+  ,("Hsmall", '\xF768')+  ,("Hungarumlaut", '\xF6CF')+  ,("Hungarumlautsmall", '\xF6F8')+  ,("Hzsquare", '\x3390')+  ,("I", '\x0049')+  ,("IAcyrillic", '\x042F')+  ,("IJ", '\x0132')+  ,("IUcyrillic", '\x042E')+  ,("Iacute", '\x00CD')+  ,("Iacutesmall", '\xF7ED')+  ,("Ibreve", '\x012C')+  ,("Icaron", '\x01CF')+  ,("Icircle", '\x24BE')+  ,("Icircumflex", '\x00CE')+  ,("Icircumflexsmall", '\xF7EE')+  ,("Icyrillic", '\x0406')+  ,("Idblgrave", '\x0208')+  ,("Idieresis", '\x00CF')+  ,("Idieresisacute", '\x1E2E')+  ,("Idieresiscyrillic", '\x04E4')+  ,("Idieresissmall", '\xF7EF')+  ,("Idot", '\x0130')+  ,("Idotaccent", '\x0130')+  ,("Idotbelow", '\x1ECA')+  ,("Iebrevecyrillic", '\x04D6')+  ,("Iecyrillic", '\x0415')+  ,("Ifraktur", '\x2111')+  ,("Igrave", '\x00CC')+  ,("Igravesmall", '\xF7EC')+  ,("Ihookabove", '\x1EC8')+  ,("Iicyrillic", '\x0418')+  ,("Iinvertedbreve", '\x020A')+  ,("Iishortcyrillic", '\x0419')+  ,("Imacron", '\x012A')+  ,("Imacroncyrillic", '\x04E2')+  ,("Imonospace", '\xFF29')+  ,("Iniarmenian", '\x053B')+  ,("Iocyrillic", '\x0401')+  ,("Iogonek", '\x012E')+  ,("Iota", '\x0399')+  ,("Iotaafrican", '\x0196')+  ,("Iotadieresis", '\x03AA')+  ,("Iotatonos", '\x038A')+  ,("Ismall", '\xF769')+  ,("Istroke", '\x0197')+  ,("Itilde", '\x0128')+  ,("Itildebelow", '\x1E2C')+  ,("Izhitsacyrillic", '\x0474')+  ,("Izhitsadblgravecyrillic", '\x0476')+  ,("J", '\x004A')+  ,("Jaarmenian", '\x0541')+  ,("Jcircle", '\x24BF')+  ,("Jcircumflex", '\x0134')+  ,("Jecyrillic", '\x0408')+  ,("Jheharmenian", '\x054B')+  ,("Jmonospace", '\xFF2A')+  ,("Jsmall", '\xF76A')+  ,("K", '\x004B')+  ,("KBsquare", '\x3385')+  ,("KKsquare", '\x33CD')+  ,("Kabashkircyrillic", '\x04A0')+  ,("Kacute", '\x1E30')+  ,("Kacyrillic", '\x041A')+  ,("Kadescendercyrillic", '\x049A')+  ,("Kahookcyrillic", '\x04C3')+  ,("Kappa", '\x039A')+  ,("Kastrokecyrillic", '\x049E')+  ,("Kaverticalstrokecyrillic", '\x049C')+  ,("Kcaron", '\x01E8')+  ,("Kcedilla", '\x0136')+  ,("Kcircle", '\x24C0')+  ,("Kcommaaccent", '\x0136')+  ,("Kdotbelow", '\x1E32')+  ,("Keharmenian", '\x0554')+  ,("Kenarmenian", '\x053F')+  ,("Khacyrillic", '\x0425')+  ,("Kheicoptic", '\x03E6')+  ,("Khook", '\x0198')+  ,("Kjecyrillic", '\x040C')+  ,("Klinebelow", '\x1E34')+  ,("Kmonospace", '\xFF2B')+  ,("Koppacyrillic", '\x0480')+  ,("Koppagreek", '\x03DE')+  ,("Ksicyrillic", '\x046E')+  ,("Ksmall", '\xF76B')+  ,("L", '\x004C')+  ,("LJ", '\x01C7')+  ,("LL", '\xF6BF')+  ,("Lacute", '\x0139')+  ,("Lambda", '\x039B')+  ,("Lcaron", '\x013D')+  ,("Lcedilla", '\x013B')+  ,("Lcircle", '\x24C1')+  ,("Lcircumflexbelow", '\x1E3C')+  ,("Lcommaaccent", '\x013B')+  ,("Ldot", '\x013F')+  ,("Ldotaccent", '\x013F')+  ,("Ldotbelow", '\x1E36')+  ,("Ldotbelowmacron", '\x1E38')+  ,("Liwnarmenian", '\x053C')+  ,("Lj", '\x01C8')+  ,("Ljecyrillic", '\x0409')+  ,("Llinebelow", '\x1E3A')+  ,("Lmonospace", '\xFF2C')+  ,("Lslash", '\x0141')+  ,("Lslashsmall", '\xF6F9')+  ,("Lsmall", '\xF76C')+  ,("M", '\x004D')+  ,("MBsquare", '\x3386')+  ,("Macron", '\xF6D0')+  ,("Macronsmall", '\xF7AF')+  ,("Macute", '\x1E3E')+  ,("Mcircle", '\x24C2')+  ,("Mdotaccent", '\x1E40')+  ,("Mdotbelow", '\x1E42')+  ,("Menarmenian", '\x0544')+  ,("Mmonospace", '\xFF2D')+  ,("Msmall", '\xF76D')+  ,("Mturned", '\x019C')+  ,("Mu", '\x039C')+  ,("N", '\x004E')+  ,("NJ", '\x01CA')+  ,("Nacute", '\x0143')+  ,("Ncaron", '\x0147')+  ,("Ncedilla", '\x0145')+  ,("Ncircle", '\x24C3')+  ,("Ncircumflexbelow", '\x1E4A')+  ,("Ncommaaccent", '\x0145')+  ,("Ndotaccent", '\x1E44')+  ,("Ndotbelow", '\x1E46')+  ,("Nhookleft", '\x019D')+  ,("Nineroman", '\x2168')+  ,("Nj", '\x01CB')+  ,("Njecyrillic", '\x040A')+  ,("Nlinebelow", '\x1E48')+  ,("Nmonospace", '\xFF2E')+  ,("Nowarmenian", '\x0546')+  ,("Nsmall", '\xF76E')+  ,("Ntilde", '\x00D1')+  ,("Ntildesmall", '\xF7F1')+  ,("Nu", '\x039D')+  ,("O", '\x004F')+  ,("OE", '\x0152')+  ,("OEsmall", '\xF6FA')+  ,("Oacute", '\x00D3')+  ,("Oacutesmall", '\xF7F3')+  ,("Obarredcyrillic", '\x04E8')+  ,("Obarreddieresiscyrillic", '\x04EA')+  ,("Obreve", '\x014E')+  ,("Ocaron", '\x01D1')+  ,("Ocenteredtilde", '\x019F')+  ,("Ocircle", '\x24C4')+  ,("Ocircumflex", '\x00D4')+  ,("Ocircumflexacute", '\x1ED0')+  ,("Ocircumflexdotbelow", '\x1ED8')+  ,("Ocircumflexgrave", '\x1ED2')+  ,("Ocircumflexhookabove", '\x1ED4')+  ,("Ocircumflexsmall", '\xF7F4')+  ,("Ocircumflextilde", '\x1ED6')+  ,("Ocyrillic", '\x041E')+  ,("Odblacute", '\x0150')+  ,("Odblgrave", '\x020C')+  ,("Odieresis", '\x00D6')+  ,("Odieresiscyrillic", '\x04E6')+  ,("Odieresissmall", '\xF7F6')+  ,("Odotbelow", '\x1ECC')+  ,("Ogoneksmall", '\xF6FB')+  ,("Ograve", '\x00D2')+  ,("Ogravesmall", '\xF7F2')+  ,("Oharmenian", '\x0555')+  ,("Ohm", '\x2126')+  ,("Ohookabove", '\x1ECE')+  ,("Ohorn", '\x01A0')+  ,("Ohornacute", '\x1EDA')+  ,("Ohorndotbelow", '\x1EE2')+  ,("Ohorngrave", '\x1EDC')+  ,("Ohornhookabove", '\x1EDE')+  ,("Ohorntilde", '\x1EE0')+  ,("Ohungarumlaut", '\x0150')+  ,("Oi", '\x01A2')+  ,("Oinvertedbreve", '\x020E')+  ,("Omacron", '\x014C')+  ,("Omacronacute", '\x1E52')+  ,("Omacrongrave", '\x1E50')+  ,("Omega", '\x2126')+  ,("Omegacyrillic", '\x0460')+  ,("Omegagreek", '\x03A9')+  ,("Omegaroundcyrillic", '\x047A')+  ,("Omegatitlocyrillic", '\x047C')+  ,("Omegatonos", '\x038F')+  ,("Omicron", '\x039F')+  ,("Omicrontonos", '\x038C')+  ,("Omonospace", '\xFF2F')+  ,("Oneroman", '\x2160')+  ,("Oogonek", '\x01EA')+  ,("Oogonekmacron", '\x01EC')+  ,("Oopen", '\x0186')+  ,("Oslash", '\x00D8')+  ,("Oslashacute", '\x01FE')+  ,("Oslashsmall", '\xF7F8')+  ,("Osmall", '\xF76F')+  ,("Ostrokeacute", '\x01FE')+  ,("Otcyrillic", '\x047E')+  ,("Otilde", '\x00D5')+  ,("Otildeacute", '\x1E4C')+  ,("Otildedieresis", '\x1E4E')+  ,("Otildesmall", '\xF7F5')+  ,("P", '\x0050')+  ,("Pacute", '\x1E54')+  ,("Pcircle", '\x24C5')+  ,("Pdotaccent", '\x1E56')+  ,("Pecyrillic", '\x041F')+  ,("Peharmenian", '\x054A')+  ,("Pemiddlehookcyrillic", '\x04A6')+  ,("Phi", '\x03A6')+  ,("Phook", '\x01A4')+  ,("Pi", '\x03A0')+  ,("Piwrarmenian", '\x0553')+  ,("Pmonospace", '\xFF30')+  ,("Psi", '\x03A8')+  ,("Psicyrillic", '\x0470')+  ,("Psmall", '\xF770')+  ,("Q", '\x0051')+  ,("Qcircle", '\x24C6')+  ,("Qmonospace", '\xFF31')+  ,("Qsmall", '\xF771')+  ,("R", '\x0052')+  ,("Raarmenian", '\x054C')+  ,("Racute", '\x0154')+  ,("Rcaron", '\x0158')+  ,("Rcedilla", '\x0156')+  ,("Rcircle", '\x24C7')+  ,("Rcommaaccent", '\x0156')+  ,("Rdblgrave", '\x0210')+  ,("Rdotaccent", '\x1E58')+  ,("Rdotbelow", '\x1E5A')+  ,("Rdotbelowmacron", '\x1E5C')+  ,("Reharmenian", '\x0550')+  ,("Rfraktur", '\x211C')+  ,("Rho", '\x03A1')+  ,("Ringsmall", '\xF6FC')+  ,("Rinvertedbreve", '\x0212')+  ,("Rlinebelow", '\x1E5E')+  ,("Rmonospace", '\xFF32')+  ,("Rsmall", '\xF772')+  ,("Rsmallinverted", '\x0281')+  ,("Rsmallinvertedsuperior", '\x02B6')+  ,("S", '\x0053')+  ,("SF010000", '\x250C')+  ,("SF020000", '\x2514')+  ,("SF030000", '\x2510')+  ,("SF040000", '\x2518')+  ,("SF050000", '\x253C')+  ,("SF060000", '\x252C')+  ,("SF070000", '\x2534')+  ,("SF080000", '\x251C')+  ,("SF090000", '\x2524')+  ,("SF100000", '\x2500')+  ,("SF110000", '\x2502')+  ,("SF190000", '\x2561')+  ,("SF200000", '\x2562')+  ,("SF210000", '\x2556')+  ,("SF220000", '\x2555')+  ,("SF230000", '\x2563')+  ,("SF240000", '\x2551')+  ,("SF250000", '\x2557')+  ,("SF260000", '\x255D')+  ,("SF270000", '\x255C')+  ,("SF280000", '\x255B')+  ,("SF360000", '\x255E')+  ,("SF370000", '\x255F')+  ,("SF380000", '\x255A')+  ,("SF390000", '\x2554')+  ,("SF400000", '\x2569')+  ,("SF410000", '\x2566')+  ,("SF420000", '\x2560')+  ,("SF430000", '\x2550')+  ,("SF440000", '\x256C')+  ,("SF450000", '\x2567')+  ,("SF460000", '\x2568')+  ,("SF470000", '\x2564')+  ,("SF480000", '\x2565')+  ,("SF490000", '\x2559')+  ,("SF500000", '\x2558')+  ,("SF510000", '\x2552')+  ,("SF520000", '\x2553')+  ,("SF530000", '\x256B')+  ,("SF540000", '\x256A')+  ,("Sacute", '\x015A')+  ,("Sacutedotaccent", '\x1E64')+  ,("Sampigreek", '\x03E0')+  ,("Scaron", '\x0160')+  ,("Scarondotaccent", '\x1E66')+  ,("Scaronsmall", '\xF6FD')+  ,("Scedilla", '\x015E')+  ,("Schwa", '\x018F')+  ,("Schwacyrillic", '\x04D8')+  ,("Schwadieresiscyrillic", '\x04DA')+  ,("Scircle", '\x24C8')+  ,("Scircumflex", '\x015C')+  ,("Scommaaccent", '\x0218')+  ,("Sdotaccent", '\x1E60')+  ,("Sdotbelow", '\x1E62')+  ,("Sdotbelowdotaccent", '\x1E68')+  ,("Seharmenian", '\x054D')+  ,("Sevenroman", '\x2166')+  ,("Shaarmenian", '\x0547')+  ,("Shacyrillic", '\x0428')+  ,("Shchacyrillic", '\x0429')+  ,("Sheicoptic", '\x03E2')+  ,("Shhacyrillic", '\x04BA')+  ,("Shimacoptic", '\x03EC')+  ,("Sigma", '\x03A3')+  ,("Sixroman", '\x2165')+  ,("Smonospace", '\xFF33')+  ,("Softsigncyrillic", '\x042C')+  ,("Ssmall", '\xF773')+  ,("Stigmagreek", '\x03DA')+  ,("T", '\x0054')+  ,("Tau", '\x03A4')+  ,("Tbar", '\x0166')+  ,("Tcaron", '\x0164')+  ,("Tcedilla", '\x0162')+  ,("Tcircle", '\x24C9')+  ,("Tcircumflexbelow", '\x1E70')+  ,("Tcommaaccent", '\x0162')+  ,("Tdotaccent", '\x1E6A')+  ,("Tdotbelow", '\x1E6C')+  ,("Tecyrillic", '\x0422')+  ,("Tedescendercyrillic", '\x04AC')+  ,("Tenroman", '\x2169')+  ,("Tetsecyrillic", '\x04B4')+  ,("Theta", '\x0398')+  ,("Thook", '\x01AC')+  ,("Thorn", '\x00DE')+  ,("Thornsmall", '\xF7FE')+  ,("Threeroman", '\x2162')+  ,("Tildesmall", '\xF6FE')+  ,("Tiwnarmenian", '\x054F')+  ,("Tlinebelow", '\x1E6E')+  ,("Tmonospace", '\xFF34')+  ,("Toarmenian", '\x0539')+  ,("Tonefive", '\x01BC')+  ,("Tonesix", '\x0184')+  ,("Tonetwo", '\x01A7')+  ,("Tretroflexhook", '\x01AE')+  ,("Tsecyrillic", '\x0426')+  ,("Tshecyrillic", '\x040B')+  ,("Tsmall", '\xF774')+  ,("Twelveroman", '\x216B')+  ,("Tworoman", '\x2161')+  ,("U", '\x0055')+  ,("Uacute", '\x00DA')+  ,("Uacutesmall", '\xF7FA')+  ,("Ubreve", '\x016C')+  ,("Ucaron", '\x01D3')+  ,("Ucircle", '\x24CA')+  ,("Ucircumflex", '\x00DB')+  ,("Ucircumflexbelow", '\x1E76')+  ,("Ucircumflexsmall", '\xF7FB')+  ,("Ucyrillic", '\x0423')+  ,("Udblacute", '\x0170')+  ,("Udblgrave", '\x0214')+  ,("Udieresis", '\x00DC')+  ,("Udieresisacute", '\x01D7')+  ,("Udieresisbelow", '\x1E72')+  ,("Udieresiscaron", '\x01D9')+  ,("Udieresiscyrillic", '\x04F0')+  ,("Udieresisgrave", '\x01DB')+  ,("Udieresismacron", '\x01D5')+  ,("Udieresissmall", '\xF7FC')+  ,("Udotbelow", '\x1EE4')+  ,("Ugrave", '\x00D9')+  ,("Ugravesmall", '\xF7F9')+  ,("Uhookabove", '\x1EE6')+  ,("Uhorn", '\x01AF')+  ,("Uhornacute", '\x1EE8')+  ,("Uhorndotbelow", '\x1EF0')+  ,("Uhorngrave", '\x1EEA')+  ,("Uhornhookabove", '\x1EEC')+  ,("Uhorntilde", '\x1EEE')+  ,("Uhungarumlaut", '\x0170')+  ,("Uhungarumlautcyrillic", '\x04F2')+  ,("Uinvertedbreve", '\x0216')+  ,("Ukcyrillic", '\x0478')+  ,("Umacron", '\x016A')+  ,("Umacroncyrillic", '\x04EE')+  ,("Umacrondieresis", '\x1E7A')+  ,("Umonospace", '\xFF35')+  ,("Uogonek", '\x0172')+  ,("Upsilon", '\x03A5')+  ,("Upsilon1", '\x03D2')+  ,("Upsilonacutehooksymbolgreek", '\x03D3')+  ,("Upsilonafrican", '\x01B1')+  ,("Upsilondieresis", '\x03AB')+  ,("Upsilondieresishooksymbolgreek", '\x03D4')+  ,("Upsilonhooksymbol", '\x03D2')+  ,("Upsilontonos", '\x038E')+  ,("Uring", '\x016E')+  ,("Ushortcyrillic", '\x040E')+  ,("Usmall", '\xF775')+  ,("Ustraightcyrillic", '\x04AE')+  ,("Ustraightstrokecyrillic", '\x04B0')+  ,("Utilde", '\x0168')+  ,("Utildeacute", '\x1E78')+  ,("Utildebelow", '\x1E74')+  ,("V", '\x0056')+  ,("Vcircle", '\x24CB')+  ,("Vdotbelow", '\x1E7E')+  ,("Vecyrillic", '\x0412')+  ,("Vewarmenian", '\x054E')+  ,("Vhook", '\x01B2')+  ,("Vmonospace", '\xFF36')+  ,("Voarmenian", '\x0548')+  ,("Vsmall", '\xF776')+  ,("Vtilde", '\x1E7C')+  ,("W", '\x0057')+  ,("Wacute", '\x1E82')+  ,("Wcircle", '\x24CC')+  ,("Wcircumflex", '\x0174')+  ,("Wdieresis", '\x1E84')+  ,("Wdotaccent", '\x1E86')+  ,("Wdotbelow", '\x1E88')+  ,("Wgrave", '\x1E80')+  ,("Wmonospace", '\xFF37')+  ,("Wsmall", '\xF777')+  ,("X", '\x0058')+  ,("Xcircle", '\x24CD')+  ,("Xdieresis", '\x1E8C')+  ,("Xdotaccent", '\x1E8A')+  ,("Xeharmenian", '\x053D')+  ,("Xi", '\x039E')+  ,("Xmonospace", '\xFF38')+  ,("Xsmall", '\xF778')+  ,("Y", '\x0059')+  ,("Yacute", '\x00DD')+  ,("Yacutesmall", '\xF7FD')+  ,("Yatcyrillic", '\x0462')+  ,("Ycircle", '\x24CE')+  ,("Ycircumflex", '\x0176')+  ,("Ydieresis", '\x0178')+  ,("Ydieresissmall", '\xF7FF')+  ,("Ydotaccent", '\x1E8E')+  ,("Ydotbelow", '\x1EF4')+  ,("Yericyrillic", '\x042B')+  ,("Yerudieresiscyrillic", '\x04F8')+  ,("Ygrave", '\x1EF2')+  ,("Yhook", '\x01B3')+  ,("Yhookabove", '\x1EF6')+  ,("Yiarmenian", '\x0545')+  ,("Yicyrillic", '\x0407')+  ,("Yiwnarmenian", '\x0552')+  ,("Ymonospace", '\xFF39')+  ,("Ysmall", '\xF779')+  ,("Ytilde", '\x1EF8')+  ,("Yusbigcyrillic", '\x046A')+  ,("Yusbigiotifiedcyrillic", '\x046C')+  ,("Yuslittlecyrillic", '\x0466')+  ,("Yuslittleiotifiedcyrillic", '\x0468')+  ,("Z", '\x005A')+  ,("Zaarmenian", '\x0536')+  ,("Zacute", '\x0179')+  ,("Zcaron", '\x017D')+  ,("Zcaronsmall", '\xF6FF')+  ,("Zcircle", '\x24CF')+  ,("Zcircumflex", '\x1E90')+  ,("Zdot", '\x017B')+  ,("Zdotaccent", '\x017B')+  ,("Zdotbelow", '\x1E92')+  ,("Zecyrillic", '\x0417')+  ,("Zedescendercyrillic", '\x0498')+  ,("Zedieresiscyrillic", '\x04DE')+  ,("Zeta", '\x0396')+  ,("Zhearmenian", '\x053A')+  ,("Zhebrevecyrillic", '\x04C1')+  ,("Zhecyrillic", '\x0416')+  ,("Zhedescendercyrillic", '\x0496')+  ,("Zhedieresiscyrillic", '\x04DC')+  ,("Zlinebelow", '\x1E94')+  ,("Zmonospace", '\xFF3A')+  ,("Zsmall", '\xF77A')+  ,("Zstroke", '\x01B5')+  ,("a", '\x0061')+  ,("aabengali", '\x0986')+  ,("aacute", '\x00E1')+  ,("aadeva", '\x0906')+  ,("aagujarati", '\x0A86')+  ,("aagurmukhi", '\x0A06')+  ,("aamatragurmukhi", '\x0A3E')+  ,("aarusquare", '\x3303')+  ,("aavowelsignbengali", '\x09BE')+  ,("aavowelsigndeva", '\x093E')+  ,("aavowelsigngujarati", '\x0ABE')+  ,("abbreviationmarkarmenian", '\x055F')+  ,("abbreviationsigndeva", '\x0970')+  ,("abengali", '\x0985')+  ,("abopomofo", '\x311A')+  ,("abreve", '\x0103')+  ,("abreveacute", '\x1EAF')+  ,("abrevecyrillic", '\x04D1')+  ,("abrevedotbelow", '\x1EB7')+  ,("abrevegrave", '\x1EB1')+  ,("abrevehookabove", '\x1EB3')+  ,("abrevetilde", '\x1EB5')+  ,("acaron", '\x01CE')+  ,("acircle", '\x24D0')+  ,("acircumflex", '\x00E2')+  ,("acircumflexacute", '\x1EA5')+  ,("acircumflexdotbelow", '\x1EAD')+  ,("acircumflexgrave", '\x1EA7')+  ,("acircumflexhookabove", '\x1EA9')+  ,("acircumflextilde", '\x1EAB')+  ,("acute", '\x00B4')+  ,("acutebelowcmb", '\x0317')+  ,("acutecmb", '\x0301')+  ,("acutecomb", '\x0301')+  ,("acutedeva", '\x0954')+  ,("acutelowmod", '\x02CF')+  ,("acutetonecmb", '\x0341')+  ,("acyrillic", '\x0430')+  ,("adblgrave", '\x0201')+  ,("addakgurmukhi", '\x0A71')+  ,("adeva", '\x0905')+  ,("adieresis", '\x00E4')+  ,("adieresiscyrillic", '\x04D3')+  ,("adieresismacron", '\x01DF')+  ,("adotbelow", '\x1EA1')+  ,("adotmacron", '\x01E1')+  ,("ae", '\x00E6')+  ,("aeacute", '\x01FD')+  ,("aekorean", '\x3150')+  ,("aemacron", '\x01E3')+  ,("afii00208", '\x2015')+  ,("afii08941", '\x20A4')+  ,("afii10017", '\x0410')+  ,("afii10018", '\x0411')+  ,("afii10019", '\x0412')+  ,("afii10020", '\x0413')+  ,("afii10021", '\x0414')+  ,("afii10022", '\x0415')+  ,("afii10023", '\x0401')+  ,("afii10024", '\x0416')+  ,("afii10025", '\x0417')+  ,("afii10026", '\x0418')+  ,("afii10027", '\x0419')+  ,("afii10028", '\x041A')+  ,("afii10029", '\x041B')+  ,("afii10030", '\x041C')+  ,("afii10031", '\x041D')+  ,("afii10032", '\x041E')+  ,("afii10033", '\x041F')+  ,("afii10034", '\x0420')+  ,("afii10035", '\x0421')+  ,("afii10036", '\x0422')+  ,("afii10037", '\x0423')+  ,("afii10038", '\x0424')+  ,("afii10039", '\x0425')+  ,("afii10040", '\x0426')+  ,("afii10041", '\x0427')+  ,("afii10042", '\x0428')+  ,("afii10043", '\x0429')+  ,("afii10044", '\x042A')+  ,("afii10045", '\x042B')+  ,("afii10046", '\x042C')+  ,("afii10047", '\x042D')+  ,("afii10048", '\x042E')+  ,("afii10049", '\x042F')+  ,("afii10050", '\x0490')+  ,("afii10051", '\x0402')+  ,("afii10052", '\x0403')+  ,("afii10053", '\x0404')+  ,("afii10054", '\x0405')+  ,("afii10055", '\x0406')+  ,("afii10056", '\x0407')+  ,("afii10057", '\x0408')+  ,("afii10058", '\x0409')+  ,("afii10059", '\x040A')+  ,("afii10060", '\x040B')+  ,("afii10061", '\x040C')+  ,("afii10062", '\x040E')+  ,("afii10063", '\xF6C4')+  ,("afii10064", '\xF6C5')+  ,("afii10065", '\x0430')+  ,("afii10066", '\x0431')+  ,("afii10067", '\x0432')+  ,("afii10068", '\x0433')+  ,("afii10069", '\x0434')+  ,("afii10070", '\x0435')+  ,("afii10071", '\x0451')+  ,("afii10072", '\x0436')+  ,("afii10073", '\x0437')+  ,("afii10074", '\x0438')+  ,("afii10075", '\x0439')+  ,("afii10076", '\x043A')+  ,("afii10077", '\x043B')+  ,("afii10078", '\x043C')+  ,("afii10079", '\x043D')+  ,("afii10080", '\x043E')+  ,("afii10081", '\x043F')+  ,("afii10082", '\x0440')+  ,("afii10083", '\x0441')+  ,("afii10084", '\x0442')+  ,("afii10085", '\x0443')+  ,("afii10086", '\x0444')+  ,("afii10087", '\x0445')+  ,("afii10088", '\x0446')+  ,("afii10089", '\x0447')+  ,("afii10090", '\x0448')+  ,("afii10091", '\x0449')+  ,("afii10092", '\x044A')+  ,("afii10093", '\x044B')+  ,("afii10094", '\x044C')+  ,("afii10095", '\x044D')+  ,("afii10096", '\x044E')+  ,("afii10097", '\x044F')+  ,("afii10098", '\x0491')+  ,("afii10099", '\x0452')+  ,("afii10100", '\x0453')+  ,("afii10101", '\x0454')+  ,("afii10102", '\x0455')+  ,("afii10103", '\x0456')+  ,("afii10104", '\x0457')+  ,("afii10105", '\x0458')+  ,("afii10106", '\x0459')+  ,("afii10107", '\x045A')+  ,("afii10108", '\x045B')+  ,("afii10109", '\x045C')+  ,("afii10110", '\x045E')+  ,("afii10145", '\x040F')+  ,("afii10146", '\x0462')+  ,("afii10147", '\x0472')+  ,("afii10148", '\x0474')+  ,("afii10192", '\xF6C6')+  ,("afii10193", '\x045F')+  ,("afii10194", '\x0463')+  ,("afii10195", '\x0473')+  ,("afii10196", '\x0475')+  ,("afii10831", '\xF6C7')+  ,("afii10832", '\xF6C8')+  ,("afii10846", '\x04D9')+  ,("afii299", '\x200E')+  ,("afii300", '\x200F')+  ,("afii301", '\x200D')+  ,("afii57381", '\x066A')+  ,("afii57388", '\x060C')+  ,("afii57392", '\x0660')+  ,("afii57393", '\x0661')+  ,("afii57394", '\x0662')+  ,("afii57395", '\x0663')+  ,("afii57396", '\x0664')+  ,("afii57397", '\x0665')+  ,("afii57398", '\x0666')+  ,("afii57399", '\x0667')+  ,("afii57400", '\x0668')+  ,("afii57401", '\x0669')+  ,("afii57403", '\x061B')+  ,("afii57407", '\x061F')+  ,("afii57409", '\x0621')+  ,("afii57410", '\x0622')+  ,("afii57411", '\x0623')+  ,("afii57412", '\x0624')+  ,("afii57413", '\x0625')+  ,("afii57414", '\x0626')+  ,("afii57415", '\x0627')+  ,("afii57416", '\x0628')+  ,("afii57417", '\x0629')+  ,("afii57418", '\x062A')+  ,("afii57419", '\x062B')+  ,("afii57420", '\x062C')+  ,("afii57421", '\x062D')+  ,("afii57422", '\x062E')+  ,("afii57423", '\x062F')+  ,("afii57424", '\x0630')+  ,("afii57425", '\x0631')+  ,("afii57426", '\x0632')+  ,("afii57427", '\x0633')+  ,("afii57428", '\x0634')+  ,("afii57429", '\x0635')+  ,("afii57430", '\x0636')+  ,("afii57431", '\x0637')+  ,("afii57432", '\x0638')+  ,("afii57433", '\x0639')+  ,("afii57434", '\x063A')+  ,("afii57440", '\x0640')+  ,("afii57441", '\x0641')+  ,("afii57442", '\x0642')+  ,("afii57443", '\x0643')+  ,("afii57444", '\x0644')+  ,("afii57445", '\x0645')+  ,("afii57446", '\x0646')+  ,("afii57448", '\x0648')+  ,("afii57449", '\x0649')+  ,("afii57450", '\x064A')+  ,("afii57451", '\x064B')+  ,("afii57452", '\x064C')+  ,("afii57453", '\x064D')+  ,("afii57454", '\x064E')+  ,("afii57455", '\x064F')+  ,("afii57456", '\x0650')+  ,("afii57457", '\x0651')+  ,("afii57458", '\x0652')+  ,("afii57470", '\x0647')+  ,("afii57505", '\x06A4')+  ,("afii57506", '\x067E')+  ,("afii57507", '\x0686')+  ,("afii57508", '\x0698')+  ,("afii57509", '\x06AF')+  ,("afii57511", '\x0679')+  ,("afii57512", '\x0688')+  ,("afii57513", '\x0691')+  ,("afii57514", '\x06BA')+  ,("afii57519", '\x06D2')+  ,("afii57534", '\x06D5')+  ,("afii57636", '\x20AA')+  ,("afii57645", '\x05BE')+  ,("afii57658", '\x05C3')+  ,("afii57664", '\x05D0')+  ,("afii57665", '\x05D1')+  ,("afii57666", '\x05D2')+  ,("afii57667", '\x05D3')+  ,("afii57668", '\x05D4')+  ,("afii57669", '\x05D5')+  ,("afii57670", '\x05D6')+  ,("afii57671", '\x05D7')+  ,("afii57672", '\x05D8')+  ,("afii57673", '\x05D9')+  ,("afii57674", '\x05DA')+  ,("afii57675", '\x05DB')+  ,("afii57676", '\x05DC')+  ,("afii57677", '\x05DD')+  ,("afii57678", '\x05DE')+  ,("afii57679", '\x05DF')+  ,("afii57680", '\x05E0')+  ,("afii57681", '\x05E1')+  ,("afii57682", '\x05E2')+  ,("afii57683", '\x05E3')+  ,("afii57684", '\x05E4')+  ,("afii57685", '\x05E5')+  ,("afii57686", '\x05E6')+  ,("afii57687", '\x05E7')+  ,("afii57688", '\x05E8')+  ,("afii57689", '\x05E9')+  ,("afii57690", '\x05EA')+  ,("afii57694", '\xFB2A')+  ,("afii57695", '\xFB2B')+  ,("afii57700", '\xFB4B')+  ,("afii57705", '\xFB1F')+  ,("afii57716", '\x05F0')+  ,("afii57717", '\x05F1')+  ,("afii57718", '\x05F2')+  ,("afii57723", '\xFB35')+  ,("afii57793", '\x05B4')+  ,("afii57794", '\x05B5')+  ,("afii57795", '\x05B6')+  ,("afii57796", '\x05BB')+  ,("afii57797", '\x05B8')+  ,("afii57798", '\x05B7')+  ,("afii57799", '\x05B0')+  ,("afii57800", '\x05B2')+  ,("afii57801", '\x05B1')+  ,("afii57802", '\x05B3')+  ,("afii57803", '\x05C2')+  ,("afii57804", '\x05C1')+  ,("afii57806", '\x05B9')+  ,("afii57807", '\x05BC')+  ,("afii57839", '\x05BD')+  ,("afii57841", '\x05BF')+  ,("afii57842", '\x05C0')+  ,("afii57929", '\x02BC')+  ,("afii61248", '\x2105')+  ,("afii61289", '\x2113')+  ,("afii61352", '\x2116')+  ,("afii61573", '\x202C')+  ,("afii61574", '\x202D')+  ,("afii61575", '\x202E')+  ,("afii61664", '\x200C')+  ,("afii63167", '\x066D')+  ,("afii64937", '\x02BD')+  ,("agrave", '\x00E0')+  ,("agujarati", '\x0A85')+  ,("agurmukhi", '\x0A05')+  ,("ahiragana", '\x3042')+  ,("ahookabove", '\x1EA3')+  ,("aibengali", '\x0990')+  ,("aibopomofo", '\x311E')+  ,("aideva", '\x0910')+  ,("aiecyrillic", '\x04D5')+  ,("aigujarati", '\x0A90')+  ,("aigurmukhi", '\x0A10')+  ,("aimatragurmukhi", '\x0A48')+  ,("ainarabic", '\x0639')+  ,("ainfinalarabic", '\xFECA')+  ,("aininitialarabic", '\xFECB')+  ,("ainmedialarabic", '\xFECC')+  ,("ainvertedbreve", '\x0203')+  ,("aivowelsignbengali", '\x09C8')+  ,("aivowelsigndeva", '\x0948')+  ,("aivowelsigngujarati", '\x0AC8')+  ,("akatakana", '\x30A2')+  ,("akatakanahalfwidth", '\xFF71')+  ,("akorean", '\x314F')+  ,("alef", '\x05D0')+  ,("alefarabic", '\x0627')+  ,("alefdageshhebrew", '\xFB30')+  ,("aleffinalarabic", '\xFE8E')+  ,("alefhamzaabovearabic", '\x0623')+  ,("alefhamzaabovefinalarabic", '\xFE84')+  ,("alefhamzabelowarabic", '\x0625')+  ,("alefhamzabelowfinalarabic", '\xFE88')+  ,("alefhebrew", '\x05D0')+  ,("aleflamedhebrew", '\xFB4F')+  ,("alefmaddaabovearabic", '\x0622')+  ,("alefmaddaabovefinalarabic", '\xFE82')+  ,("alefmaksuraarabic", '\x0649')+  ,("alefmaksurafinalarabic", '\xFEF0')+  ,("alefmaksurainitialarabic", '\xFEF3')+  ,("alefmaksuramedialarabic", '\xFEF4')+  ,("alefpatahhebrew", '\xFB2E')+  ,("alefqamatshebrew", '\xFB2F')+  ,("aleph", '\x2135')+  ,("allequal", '\x224C')+  ,("alpha", '\x03B1')+  ,("alphatonos", '\x03AC')+  ,("amacron", '\x0101')+  ,("amonospace", '\xFF41')+  ,("ampersand", '\x0026')+  ,("ampersandmonospace", '\xFF06')+  ,("ampersandsmall", '\xF726')+  ,("amsquare", '\x33C2')+  ,("anbopomofo", '\x3122')+  ,("angbopomofo", '\x3124')+  ,("angkhankhuthai", '\x0E5A')+  ,("angle", '\x2220')+  ,("anglebracketleft", '\x3008')+  ,("anglebracketleftvertical", '\xFE3F')+  ,("anglebracketright", '\x3009')+  ,("anglebracketrightvertical", '\xFE40')+  ,("angleleft", '\x2329')+  ,("angleright", '\x232A')+  ,("angstrom", '\x212B')+  ,("anoteleia", '\x0387')+  ,("anudattadeva", '\x0952')+  ,("anusvarabengali", '\x0982')+  ,("anusvaradeva", '\x0902')+  ,("anusvaragujarati", '\x0A82')+  ,("aogonek", '\x0105')+  ,("apaatosquare", '\x3300')+  ,("aparen", '\x249C')+  ,("apostrophearmenian", '\x055A')+  ,("apostrophemod", '\x02BC')+  ,("apple", '\xF8FF')+  ,("approaches", '\x2250')+  ,("approxequal", '\x2248')+  ,("approxequalorimage", '\x2252')+  ,("approximatelyequal", '\x2245')+  ,("araeaekorean", '\x318E')+  ,("araeakorean", '\x318D')+  ,("arc", '\x2312')+  ,("arighthalfring", '\x1E9A')+  ,("aring", '\x00E5')+  ,("aringacute", '\x01FB')+  ,("aringbelow", '\x1E01')+  ,("arrowboth", '\x2194')+  ,("arrowdashdown", '\x21E3')+  ,("arrowdashleft", '\x21E0')+  ,("arrowdashright", '\x21E2')+  ,("arrowdashup", '\x21E1')+  ,("arrowdblboth", '\x21D4')+  ,("arrowdbldown", '\x21D3')+  ,("arrowdblleft", '\x21D0')+  ,("arrowdblright", '\x21D2')+  ,("arrowdblup", '\x21D1')+  ,("arrowdown", '\x2193')+  ,("arrowdownleft", '\x2199')+  ,("arrowdownright", '\x2198')+  ,("arrowdownwhite", '\x21E9')+  ,("arrowheaddownmod", '\x02C5')+  ,("arrowheadleftmod", '\x02C2')+  ,("arrowheadrightmod", '\x02C3')+  ,("arrowheadupmod", '\x02C4')+  ,("arrowhorizex", '\xF8E7')+  ,("arrowleft", '\x2190')+  ,("arrowleftdbl", '\x21D0')+  ,("arrowleftdblstroke", '\x21CD')+  ,("arrowleftoverright", '\x21C6')+  ,("arrowleftwhite", '\x21E6')+  ,("arrowright", '\x2192')+  ,("arrowrightdblstroke", '\x21CF')+  ,("arrowrightheavy", '\x279E')+  ,("arrowrightoverleft", '\x21C4')+  ,("arrowrightwhite", '\x21E8')+  ,("arrowtableft", '\x21E4')+  ,("arrowtabright", '\x21E5')+  ,("arrowup", '\x2191')+  ,("arrowupdn", '\x2195')+  ,("arrowupdnbse", '\x21A8')+  ,("arrowupdownbase", '\x21A8')+  ,("arrowupleft", '\x2196')+  ,("arrowupleftofdown", '\x21C5')+  ,("arrowupright", '\x2197')+  ,("arrowupwhite", '\x21E7')+  ,("arrowvertex", '\xF8E6')+  ,("asciicircum", '\x005E')+  ,("asciicircummonospace", '\xFF3E')+  ,("asciitilde", '\x007E')+  ,("asciitildemonospace", '\xFF5E')+  ,("ascript", '\x0251')+  ,("ascriptturned", '\x0252')+  ,("asmallhiragana", '\x3041')+  ,("asmallkatakana", '\x30A1')+  ,("asmallkatakanahalfwidth", '\xFF67')+  ,("asterisk", '\x002A')+  ,("asteriskaltonearabic", '\x066D')+  ,("asteriskarabic", '\x066D')+  ,("asteriskmath", '\x2217')+  ,("asteriskmonospace", '\xFF0A')+  ,("asterisksmall", '\xFE61')+  ,("asterism", '\x2042')+  ,("asuperior", '\xF6E9')+  ,("asymptoticallyequal", '\x2243')+  ,("at", '\x0040')+  ,("atilde", '\x00E3')+  ,("atmonospace", '\xFF20')+  ,("atsmall", '\xFE6B')+  ,("aturned", '\x0250')+  ,("aubengali", '\x0994')+  ,("aubopomofo", '\x3120')+  ,("audeva", '\x0914')+  ,("augujarati", '\x0A94')+  ,("augurmukhi", '\x0A14')+  ,("aulengthmarkbengali", '\x09D7')+  ,("aumatragurmukhi", '\x0A4C')+  ,("auvowelsignbengali", '\x09CC')+  ,("auvowelsigndeva", '\x094C')+  ,("auvowelsigngujarati", '\x0ACC')+  ,("avagrahadeva", '\x093D')+  ,("aybarmenian", '\x0561')+  ,("ayin", '\x05E2')+  ,("ayinaltonehebrew", '\xFB20')+  ,("ayinhebrew", '\x05E2')+  ,("b", '\x0062')+  ,("babengali", '\x09AC')+  ,("backslash", '\x005C')+  ,("backslashmonospace", '\xFF3C')+  ,("badeva", '\x092C')+  ,("bagujarati", '\x0AAC')+  ,("bagurmukhi", '\x0A2C')+  ,("bahiragana", '\x3070')+  ,("bahtthai", '\x0E3F')+  ,("bakatakana", '\x30D0')+  ,("bar", '\x007C')+  ,("barmonospace", '\xFF5C')+  ,("bbopomofo", '\x3105')+  ,("bcircle", '\x24D1')+  ,("bdotaccent", '\x1E03')+  ,("bdotbelow", '\x1E05')+  ,("beamedsixteenthnotes", '\x266C')+  ,("because", '\x2235')+  ,("becyrillic", '\x0431')+  ,("beharabic", '\x0628')+  ,("behfinalarabic", '\xFE90')+  ,("behinitialarabic", '\xFE91')+  ,("behiragana", '\x3079')+  ,("behmedialarabic", '\xFE92')+  ,("behmeeminitialarabic", '\xFC9F')+  ,("behmeemisolatedarabic", '\xFC08')+  ,("behnoonfinalarabic", '\xFC6D')+  ,("bekatakana", '\x30D9')+  ,("benarmenian", '\x0562')+  ,("bet", '\x05D1')+  ,("beta", '\x03B2')+  ,("betasymbolgreek", '\x03D0')+  ,("betdagesh", '\xFB31')+  ,("betdageshhebrew", '\xFB31')+  ,("bethebrew", '\x05D1')+  ,("betrafehebrew", '\xFB4C')+  ,("bhabengali", '\x09AD')+  ,("bhadeva", '\x092D')+  ,("bhagujarati", '\x0AAD')+  ,("bhagurmukhi", '\x0A2D')+  ,("bhook", '\x0253')+  ,("bihiragana", '\x3073')+  ,("bikatakana", '\x30D3')+  ,("bilabialclick", '\x0298')+  ,("bindigurmukhi", '\x0A02')+  ,("birusquare", '\x3331')+  ,("blackcircle", '\x25CF')+  ,("blackdiamond", '\x25C6')+  ,("blackdownpointingtriangle", '\x25BC')+  ,("blackleftpointingpointer", '\x25C4')+  ,("blackleftpointingtriangle", '\x25C0')+  ,("blacklenticularbracketleft", '\x3010')+  ,("blacklenticularbracketleftvertical", '\xFE3B')+  ,("blacklenticularbracketright", '\x3011')+  ,("blacklenticularbracketrightvertical", '\xFE3C')+  ,("blacklowerlefttriangle", '\x25E3')+  ,("blacklowerrighttriangle", '\x25E2')+  ,("blackrectangle", '\x25AC')+  ,("blackrightpointingpointer", '\x25BA')+  ,("blackrightpointingtriangle", '\x25B6')+  ,("blacksmallsquare", '\x25AA')+  ,("blacksmilingface", '\x263B')+  ,("blacksquare", '\x25A0')+  ,("blackstar", '\x2605')+  ,("blackupperlefttriangle", '\x25E4')+  ,("blackupperrighttriangle", '\x25E5')+  ,("blackuppointingsmalltriangle", '\x25B4')+  ,("blackuppointingtriangle", '\x25B2')+  ,("blank", '\x2423')+  ,("blinebelow", '\x1E07')+  ,("block", '\x2588')+  ,("bmonospace", '\xFF42')+  ,("bobaimaithai", '\x0E1A')+  ,("bohiragana", '\x307C')+  ,("bokatakana", '\x30DC')+  ,("bparen", '\x249D')+  ,("bqsquare", '\x33C3')+  ,("braceex", '\xF8F4')+  ,("braceleft", '\x007B')+  ,("braceleftbt", '\xF8F3')+  ,("braceleftmid", '\xF8F2')+  ,("braceleftmonospace", '\xFF5B')+  ,("braceleftsmall", '\xFE5B')+  ,("bracelefttp", '\xF8F1')+  ,("braceleftvertical", '\xFE37')+  ,("braceright", '\x007D')+  ,("bracerightbt", '\xF8FE')+  ,("bracerightmid", '\xF8FD')+  ,("bracerightmonospace", '\xFF5D')+  ,("bracerightsmall", '\xFE5C')+  ,("bracerighttp", '\xF8FC')+  ,("bracerightvertical", '\xFE38')+  ,("bracketleft", '\x005B')+  ,("bracketleftbt", '\xF8F0')+  ,("bracketleftex", '\xF8EF')+  ,("bracketleftmonospace", '\xFF3B')+  ,("bracketlefttp", '\xF8EE')+  ,("bracketright", '\x005D')+  ,("bracketrightbt", '\xF8FB')+  ,("bracketrightex", '\xF8FA')+  ,("bracketrightmonospace", '\xFF3D')+  ,("bracketrighttp", '\xF8F9')+  ,("breve", '\x02D8')+  ,("brevebelowcmb", '\x032E')+  ,("brevecmb", '\x0306')+  ,("breveinvertedbelowcmb", '\x032F')+  ,("breveinvertedcmb", '\x0311')+  ,("breveinverteddoublecmb", '\x0361')+  ,("bridgebelowcmb", '\x032A')+  ,("bridgeinvertedbelowcmb", '\x033A')+  ,("brokenbar", '\x00A6')+  ,("bstroke", '\x0180')+  ,("bsuperior", '\xF6EA')+  ,("btopbar", '\x0183')+  ,("buhiragana", '\x3076')+  ,("bukatakana", '\x30D6')+  ,("bullet", '\x2022')+  ,("bulletinverse", '\x25D8')+  ,("bulletoperator", '\x2219')+  ,("bullseye", '\x25CE')+  ,("c", '\x0063')+  ,("caarmenian", '\x056E')+  ,("cabengali", '\x099A')+  ,("cacute", '\x0107')+  ,("cadeva", '\x091A')+  ,("cagujarati", '\x0A9A')+  ,("cagurmukhi", '\x0A1A')+  ,("calsquare", '\x3388')+  ,("candrabindubengali", '\x0981')+  ,("candrabinducmb", '\x0310')+  ,("candrabindudeva", '\x0901')+  ,("candrabindugujarati", '\x0A81')+  ,("capslock", '\x21EA')+  ,("careof", '\x2105')+  ,("caron", '\x02C7')+  ,("caronbelowcmb", '\x032C')+  ,("caroncmb", '\x030C')+  ,("carriagereturn", '\x21B5')+  ,("cbopomofo", '\x3118')+  ,("ccaron", '\x010D')+  ,("ccedilla", '\x00E7')+  ,("ccedillaacute", '\x1E09')+  ,("ccircle", '\x24D2')+  ,("ccircumflex", '\x0109')+  ,("ccurl", '\x0255')+  ,("cdot", '\x010B')+  ,("cdotaccent", '\x010B')+  ,("cdsquare", '\x33C5')+  ,("cedilla", '\x00B8')+  ,("cedillacmb", '\x0327')+  ,("cent", '\x00A2')+  ,("centigrade", '\x2103')+  ,("centinferior", '\xF6DF')+  ,("centmonospace", '\xFFE0')+  ,("centoldstyle", '\xF7A2')+  ,("centsuperior", '\xF6E0')+  ,("chaarmenian", '\x0579')+  ,("chabengali", '\x099B')+  ,("chadeva", '\x091B')+  ,("chagujarati", '\x0A9B')+  ,("chagurmukhi", '\x0A1B')+  ,("chbopomofo", '\x3114')+  ,("cheabkhasiancyrillic", '\x04BD')+  ,("checkmark", '\x2713')+  ,("checyrillic", '\x0447')+  ,("chedescenderabkhasiancyrillic", '\x04BF')+  ,("chedescendercyrillic", '\x04B7')+  ,("chedieresiscyrillic", '\x04F5')+  ,("cheharmenian", '\x0573')+  ,("chekhakassiancyrillic", '\x04CC')+  ,("cheverticalstrokecyrillic", '\x04B9')+  ,("chi", '\x03C7')+  ,("chieuchacirclekorean", '\x3277')+  ,("chieuchaparenkorean", '\x3217')+  ,("chieuchcirclekorean", '\x3269')+  ,("chieuchkorean", '\x314A')+  ,("chieuchparenkorean", '\x3209')+  ,("chochangthai", '\x0E0A')+  ,("chochanthai", '\x0E08')+  ,("chochingthai", '\x0E09')+  ,("chochoethai", '\x0E0C')+  ,("chook", '\x0188')+  ,("cieucacirclekorean", '\x3276')+  ,("cieucaparenkorean", '\x3216')+  ,("cieuccirclekorean", '\x3268')+  ,("cieuckorean", '\x3148')+  ,("cieucparenkorean", '\x3208')+  ,("cieucuparenkorean", '\x321C')+  ,("circle", '\x25CB')+  ,("circlemultiply", '\x2297')+  ,("circleot", '\x2299')+  ,("circleplus", '\x2295')+  ,("circlepostalmark", '\x3036')+  ,("circlewithlefthalfblack", '\x25D0')+  ,("circlewithrighthalfblack", '\x25D1')+  ,("circumflex", '\x02C6')+  ,("circumflexbelowcmb", '\x032D')+  ,("circumflexcmb", '\x0302')+  ,("clear", '\x2327')+  ,("clickalveolar", '\x01C2')+  ,("clickdental", '\x01C0')+  ,("clicklateral", '\x01C1')+  ,("clickretroflex", '\x01C3')+  ,("club", '\x2663')+  ,("clubsuitblack", '\x2663')+  ,("clubsuitwhite", '\x2667')+  ,("cmcubedsquare", '\x33A4')+  ,("cmonospace", '\xFF43')+  ,("cmsquaredsquare", '\x33A0')+  ,("coarmenian", '\x0581')+  ,("colon", '\x003A')+  ,("colonmonetary", '\x20A1')+  ,("colonmonospace", '\xFF1A')+  ,("colonsign", '\x20A1')+  ,("colonsmall", '\xFE55')+  ,("colontriangularhalfmod", '\x02D1')+  ,("colontriangularmod", '\x02D0')+  ,("comma", '\x002C')+  ,("commaabovecmb", '\x0313')+  ,("commaaboverightcmb", '\x0315')+  ,("commaaccent", '\xF6C3')+  ,("commaarabic", '\x060C')+  ,("commaarmenian", '\x055D')+  ,("commainferior", '\xF6E1')+  ,("commamonospace", '\xFF0C')+  ,("commareversedabovecmb", '\x0314')+  ,("commareversedmod", '\x02BD')+  ,("commasmall", '\xFE50')+  ,("commasuperior", '\xF6E2')+  ,("commaturnedabovecmb", '\x0312')+  ,("commaturnedmod", '\x02BB')+  ,("compass", '\x263C')+  ,("congruent", '\x2245')+  ,("contourintegral", '\x222E')+  ,("control", '\x2303')+  ,("controlACK", '\x0006')+  ,("controlBEL", '\x0007')+  ,("controlBS", '\x0008')+  ,("controlCAN", '\x0018')+  ,("controlCR", '\x000D')+  ,("controlDC1", '\x0011')+  ,("controlDC2", '\x0012')+  ,("controlDC3", '\x0013')+  ,("controlDC4", '\x0014')+  ,("controlDEL", '\x007F')+  ,("controlDLE", '\x0010')+  ,("controlEM", '\x0019')+  ,("controlENQ", '\x0005')+  ,("controlEOT", '\x0004')+  ,("controlESC", '\x001B')+  ,("controlETB", '\x0017')+  ,("controlETX", '\x0003')+  ,("controlFF", '\x000C')+  ,("controlFS", '\x001C')+  ,("controlGS", '\x001D')+  ,("controlHT", '\x0009')+  ,("controlLF", '\x000A')+  ,("controlNAK", '\x0015')+  ,("controlRS", '\x001E')+  ,("controlSI", '\x000F')+  ,("controlSO", '\x000E')+  ,("controlSOT", '\x0002')+  ,("controlSTX", '\x0001')+  ,("controlSUB", '\x001A')+  ,("controlSYN", '\x0016')+  ,("controlUS", '\x001F')+  ,("controlVT", '\x000B')+  ,("copyright", '\x00A9')+  ,("copyrightsans", '\xF8E9')+  ,("copyrightserif", '\xF6D9')+  ,("cornerbracketleft", '\x300C')+  ,("cornerbracketlefthalfwidth", '\xFF62')+  ,("cornerbracketleftvertical", '\xFE41')+  ,("cornerbracketright", '\x300D')+  ,("cornerbracketrighthalfwidth", '\xFF63')+  ,("cornerbracketrightvertical", '\xFE42')+  ,("corporationsquare", '\x337F')+  ,("cosquare", '\x33C7')+  ,("coverkgsquare", '\x33C6')+  ,("cparen", '\x249E')+  ,("cruzeiro", '\x20A2')+  ,("cstretched", '\x0297')+  ,("curlyand", '\x22CF')+  ,("curlyor", '\x22CE')+  ,("currency", '\x00A4')+  ,("cyrBreve", '\xF6D1')+  ,("cyrFlex", '\xF6D2')+  ,("cyrbreve", '\xF6D4')+  ,("cyrflex", '\xF6D5')+  ,("d", '\x0064')+  ,("daarmenian", '\x0564')+  ,("dabengali", '\x09A6')+  ,("dadarabic", '\x0636')+  ,("dadeva", '\x0926')+  ,("dadfinalarabic", '\xFEBE')+  ,("dadinitialarabic", '\xFEBF')+  ,("dadmedialarabic", '\xFEC0')+  ,("dagesh", '\x05BC')+  ,("dageshhebrew", '\x05BC')+  ,("dagger", '\x2020')+  ,("daggerdbl", '\x2021')+  ,("dagujarati", '\x0AA6')+  ,("dagurmukhi", '\x0A26')+  ,("dahiragana", '\x3060')+  ,("dakatakana", '\x30C0')+  ,("dalarabic", '\x062F')+  ,("dalet", '\x05D3')+  ,("daletdagesh", '\xFB33')+  ,("daletdageshhebrew", '\xFB33')+  ,("dalethatafpatah", '\x05D3')+  ,("dalethatafpatahhebrew", '\x05D3')+  ,("dalethatafsegol", '\x05D3')+  ,("dalethatafsegolhebrew", '\x05D3')+  ,("dalethebrew", '\x05D3')+  ,("dalethiriq", '\x05D3')+  ,("dalethiriqhebrew", '\x05D3')+  ,("daletholam", '\x05D3')+  ,("daletholamhebrew", '\x05D3')+  ,("daletpatah", '\x05D3')+  ,("daletpatahhebrew", '\x05D3')+  ,("daletqamats", '\x05D3')+  ,("daletqamatshebrew", '\x05D3')+  ,("daletqubuts", '\x05D3')+  ,("daletqubutshebrew", '\x05D3')+  ,("daletsegol", '\x05D3')+  ,("daletsegolhebrew", '\x05D3')+  ,("daletsheva", '\x05D3')+  ,("daletshevahebrew", '\x05D3')+  ,("dalettsere", '\x05D3')+  ,("dalettserehebrew", '\x05D3')+  ,("dalfinalarabic", '\xFEAA')+  ,("dammaarabic", '\x064F')+  ,("dammalowarabic", '\x064F')+  ,("dammatanaltonearabic", '\x064C')+  ,("dammatanarabic", '\x064C')+  ,("danda", '\x0964')+  ,("dargahebrew", '\x05A7')+  ,("dargalefthebrew", '\x05A7')+  ,("dasiapneumatacyrilliccmb", '\x0485')+  ,("dblGrave", '\xF6D3')+  ,("dblanglebracketleft", '\x300A')+  ,("dblanglebracketleftvertical", '\xFE3D')+  ,("dblanglebracketright", '\x300B')+  ,("dblanglebracketrightvertical", '\xFE3E')+  ,("dblarchinvertedbelowcmb", '\x032B')+  ,("dblarrowleft", '\x21D4')+  ,("dblarrowright", '\x21D2')+  ,("dbldanda", '\x0965')+  ,("dblgrave", '\xF6D6')+  ,("dblgravecmb", '\x030F')+  ,("dblintegral", '\x222C')+  ,("dbllowline", '\x2017')+  ,("dbllowlinecmb", '\x0333')+  ,("dbloverlinecmb", '\x033F')+  ,("dblprimemod", '\x02BA')+  ,("dblverticalbar", '\x2016')+  ,("dblverticallineabovecmb", '\x030E')+  ,("dbopomofo", '\x3109')+  ,("dbsquare", '\x33C8')+  ,("dcaron", '\x010F')+  ,("dcedilla", '\x1E11')+  ,("dcircle", '\x24D3')+  ,("dcircumflexbelow", '\x1E13')+  ,("dcroat", '\x0111')+  ,("ddabengali", '\x09A1')+  ,("ddadeva", '\x0921')+  ,("ddagujarati", '\x0AA1')+  ,("ddagurmukhi", '\x0A21')+  ,("ddalarabic", '\x0688')+  ,("ddalfinalarabic", '\xFB89')+  ,("dddhadeva", '\x095C')+  ,("ddhabengali", '\x09A2')+  ,("ddhadeva", '\x0922')+  ,("ddhagujarati", '\x0AA2')+  ,("ddhagurmukhi", '\x0A22')+  ,("ddotaccent", '\x1E0B')+  ,("ddotbelow", '\x1E0D')+  ,("decimalseparatorarabic", '\x066B')+  ,("decimalseparatorpersian", '\x066B')+  ,("decyrillic", '\x0434')+  ,("degree", '\x00B0')+  ,("dehihebrew", '\x05AD')+  ,("dehiragana", '\x3067')+  ,("deicoptic", '\x03EF')+  ,("dekatakana", '\x30C7')+  ,("deleteleft", '\x232B')+  ,("deleteright", '\x2326')+  ,("delta", '\x03B4')+  ,("deltaturned", '\x018D')+  ,("denominatorminusonenumeratorbengali", '\x09F8')+  ,("dezh", '\x02A4')+  ,("dhabengali", '\x09A7')+  ,("dhadeva", '\x0927')+  ,("dhagujarati", '\x0AA7')+  ,("dhagurmukhi", '\x0A27')+  ,("dhook", '\x0257')+  ,("dialytikatonos", '\x0385')+  ,("dialytikatonoscmb", '\x0344')+  ,("diamond", '\x2666')+  ,("diamondsuitwhite", '\x2662')+  ,("dieresis", '\x00A8')+  ,("dieresisacute", '\xF6D7')+  ,("dieresisbelowcmb", '\x0324')+  ,("dieresiscmb", '\x0308')+  ,("dieresisgrave", '\xF6D8')+  ,("dieresistonos", '\x0385')+  ,("dihiragana", '\x3062')+  ,("dikatakana", '\x30C2')+  ,("dittomark", '\x3003')+  ,("divide", '\x00F7')+  ,("divides", '\x2223')+  ,("divisionslash", '\x2215')+  ,("djecyrillic", '\x0452')+  ,("dkshade", '\x2593')+  ,("dlinebelow", '\x1E0F')+  ,("dlsquare", '\x3397')+  ,("dmacron", '\x0111')+  ,("dmonospace", '\xFF44')+  ,("dnblock", '\x2584')+  ,("dochadathai", '\x0E0E')+  ,("dodekthai", '\x0E14')+  ,("dohiragana", '\x3069')+  ,("dokatakana", '\x30C9')+  ,("dollar", '\x0024')+  ,("dollarinferior", '\xF6E3')+  ,("dollarmonospace", '\xFF04')+  ,("dollaroldstyle", '\xF724')+  ,("dollarsmall", '\xFE69')+  ,("dollarsuperior", '\xF6E4')+  ,("dong", '\x20AB')+  ,("dorusquare", '\x3326')+  ,("dotaccent", '\x02D9')+  ,("dotaccentcmb", '\x0307')+  ,("dotbelowcmb", '\x0323')+  ,("dotbelowcomb", '\x0323')+  ,("dotkatakana", '\x30FB')+  ,("dotlessi", '\x0131')+  ,("dotlessj", '\xF6BE')+  ,("dotlessjstrokehook", '\x0284')+  ,("dotmath", '\x22C5')+  ,("dottedcircle", '\x25CC')+  ,("doubleyodpatah", '\xFB1F')+  ,("doubleyodpatahhebrew", '\xFB1F')+  ,("downtackbelowcmb", '\x031E')+  ,("downtackmod", '\x02D5')+  ,("dparen", '\x249F')+  ,("dsuperior", '\xF6EB')+  ,("dtail", '\x0256')+  ,("dtopbar", '\x018C')+  ,("duhiragana", '\x3065')+  ,("dukatakana", '\x30C5')+  ,("dz", '\x01F3')+  ,("dzaltone", '\x02A3')+  ,("dzcaron", '\x01C6')+  ,("dzcurl", '\x02A5')+  ,("dzeabkhasiancyrillic", '\x04E1')+  ,("dzecyrillic", '\x0455')+  ,("dzhecyrillic", '\x045F')+  ,("e", '\x0065')+  ,("eacute", '\x00E9')+  ,("earth", '\x2641')+  ,("ebengali", '\x098F')+  ,("ebopomofo", '\x311C')+  ,("ebreve", '\x0115')+  ,("ecandradeva", '\x090D')+  ,("ecandragujarati", '\x0A8D')+  ,("ecandravowelsigndeva", '\x0945')+  ,("ecandravowelsigngujarati", '\x0AC5')+  ,("ecaron", '\x011B')+  ,("ecedillabreve", '\x1E1D')+  ,("echarmenian", '\x0565')+  ,("echyiwnarmenian", '\x0587')+  ,("ecircle", '\x24D4')+  ,("ecircumflex", '\x00EA')+  ,("ecircumflexacute", '\x1EBF')+  ,("ecircumflexbelow", '\x1E19')+  ,("ecircumflexdotbelow", '\x1EC7')+  ,("ecircumflexgrave", '\x1EC1')+  ,("ecircumflexhookabove", '\x1EC3')+  ,("ecircumflextilde", '\x1EC5')+  ,("ecyrillic", '\x0454')+  ,("edblgrave", '\x0205')+  ,("edeva", '\x090F')+  ,("edieresis", '\x00EB')+  ,("edot", '\x0117')+  ,("edotaccent", '\x0117')+  ,("edotbelow", '\x1EB9')+  ,("eegurmukhi", '\x0A0F')+  ,("eematragurmukhi", '\x0A47')+  ,("efcyrillic", '\x0444')+  ,("egrave", '\x00E8')+  ,("egujarati", '\x0A8F')+  ,("eharmenian", '\x0567')+  ,("ehbopomofo", '\x311D')+  ,("ehiragana", '\x3048')+  ,("ehookabove", '\x1EBB')+  ,("eibopomofo", '\x311F')+  ,("eight", '\x0038')+  ,("eightarabic", '\x0668')+  ,("eightbengali", '\x09EE')+  ,("eightcircle", '\x2467')+  ,("eightcircleinversesansserif", '\x2791')+  ,("eightdeva", '\x096E')+  ,("eighteencircle", '\x2471')+  ,("eighteenparen", '\x2485')+  ,("eighteenperiod", '\x2499')+  ,("eightgujarati", '\x0AEE')+  ,("eightgurmukhi", '\x0A6E')+  ,("eighthackarabic", '\x0668')+  ,("eighthangzhou", '\x3028')+  ,("eighthnotebeamed", '\x266B')+  ,("eightideographicparen", '\x3227')+  ,("eightinferior", '\x2088')+  ,("eightmonospace", '\xFF18')+  ,("eightoldstyle", '\xF738')+  ,("eightparen", '\x247B')+  ,("eightperiod", '\x248F')+  ,("eightpersian", '\x06F8')+  ,("eightroman", '\x2177')+  ,("eightsuperior", '\x2078')+  ,("eightthai", '\x0E58')+  ,("einvertedbreve", '\x0207')+  ,("eiotifiedcyrillic", '\x0465')+  ,("ekatakana", '\x30A8')+  ,("ekatakanahalfwidth", '\xFF74')+  ,("ekonkargurmukhi", '\x0A74')+  ,("ekorean", '\x3154')+  ,("elcyrillic", '\x043B')+  ,("element", '\x2208')+  ,("elevencircle", '\x246A')+  ,("elevenparen", '\x247E')+  ,("elevenperiod", '\x2492')+  ,("elevenroman", '\x217A')+  ,("ellipsis", '\x2026')+  ,("ellipsisvertical", '\x22EE')+  ,("emacron", '\x0113')+  ,("emacronacute", '\x1E17')+  ,("emacrongrave", '\x1E15')+  ,("emcyrillic", '\x043C')+  ,("emdash", '\x2014')+  ,("emdashvertical", '\xFE31')+  ,("emonospace", '\xFF45')+  ,("emphasismarkarmenian", '\x055B')+  ,("emptyset", '\x2205')+  ,("enbopomofo", '\x3123')+  ,("encyrillic", '\x043D')+  ,("endash", '\x2013')+  ,("endashvertical", '\xFE32')+  ,("endescendercyrillic", '\x04A3')+  ,("eng", '\x014B')+  ,("engbopomofo", '\x3125')+  ,("enghecyrillic", '\x04A5')+  ,("enhookcyrillic", '\x04C8')+  ,("enspace", '\x2002')+  ,("eogonek", '\x0119')+  ,("eokorean", '\x3153')+  ,("eopen", '\x025B')+  ,("eopenclosed", '\x029A')+  ,("eopenreversed", '\x025C')+  ,("eopenreversedclosed", '\x025E')+  ,("eopenreversedhook", '\x025D')+  ,("eparen", '\x24A0')+  ,("epsilon", '\x03B5')+  ,("epsilontonos", '\x03AD')+  ,("equal", '\x003D')+  ,("equalmonospace", '\xFF1D')+  ,("equalsmall", '\xFE66')+  ,("equalsuperior", '\x207C')+  ,("equivalence", '\x2261')+  ,("erbopomofo", '\x3126')+  ,("ercyrillic", '\x0440')+  ,("ereversed", '\x0258')+  ,("ereversedcyrillic", '\x044D')+  ,("escyrillic", '\x0441')+  ,("esdescendercyrillic", '\x04AB')+  ,("esh", '\x0283')+  ,("eshcurl", '\x0286')+  ,("eshortdeva", '\x090E')+  ,("eshortvowelsigndeva", '\x0946')+  ,("eshreversedloop", '\x01AA')+  ,("eshsquatreversed", '\x0285')+  ,("esmallhiragana", '\x3047')+  ,("esmallkatakana", '\x30A7')+  ,("esmallkatakanahalfwidth", '\xFF6A')+  ,("estimated", '\x212E')+  ,("esuperior", '\xF6EC')+  ,("eta", '\x03B7')+  ,("etarmenian", '\x0568')+  ,("etatonos", '\x03AE')+  ,("eth", '\x00F0')+  ,("etilde", '\x1EBD')+  ,("etildebelow", '\x1E1B')+  ,("etnahtafoukhhebrew", '\x0591')+  ,("etnahtafoukhlefthebrew", '\x0591')+  ,("etnahtahebrew", '\x0591')+  ,("etnahtalefthebrew", '\x0591')+  ,("eturned", '\x01DD')+  ,("eukorean", '\x3161')+  ,("euro", '\x20AC')+  ,("evowelsignbengali", '\x09C7')+  ,("evowelsigndeva", '\x0947')+  ,("evowelsigngujarati", '\x0AC7')+  ,("exclam", '\x0021')+  ,("exclamarmenian", '\x055C')+  ,("exclamdbl", '\x203C')+  ,("exclamdown", '\x00A1')+  ,("exclamdownsmall", '\xF7A1')+  ,("exclammonospace", '\xFF01')+  ,("exclamsmall", '\xF721')+  ,("existential", '\x2203')+  ,("ezh", '\x0292')+  ,("ezhcaron", '\x01EF')+  ,("ezhcurl", '\x0293')+  ,("ezhreversed", '\x01B9')+  ,("ezhtail", '\x01BA')+  ,("f", '\x0066')+  ,("fadeva", '\x095E')+  ,("fagurmukhi", '\x0A5E')+  ,("fahrenheit", '\x2109')+  ,("fathaarabic", '\x064E')+  ,("fathalowarabic", '\x064E')+  ,("fathatanarabic", '\x064B')+  ,("fbopomofo", '\x3108')+  ,("fcircle", '\x24D5')+  ,("fdotaccent", '\x1E1F')+  ,("feharabic", '\x0641')+  ,("feharmenian", '\x0586')+  ,("fehfinalarabic", '\xFED2')+  ,("fehinitialarabic", '\xFED3')+  ,("fehmedialarabic", '\xFED4')+  ,("feicoptic", '\x03E5')+  ,("female", '\x2640')+  ,("ff", '\xFB00')+  ,("ffi", '\xFB03')+  ,("ffl", '\xFB04')+  ,("fi", '\xFB01')+  ,("fifteencircle", '\x246E')+  ,("fifteenparen", '\x2482')+  ,("fifteenperiod", '\x2496')+  ,("figuredash", '\x2012')+  ,("filledbox", '\x25A0')+  ,("filledrect", '\x25AC')+  ,("finalkaf", '\x05DA')+  ,("finalkafdagesh", '\xFB3A')+  ,("finalkafdageshhebrew", '\xFB3A')+  ,("finalkafhebrew", '\x05DA')+  ,("finalkafqamats", '\x05DA')+  ,("finalkafqamatshebrew", '\x05DA')+  ,("finalkafsheva", '\x05DA')+  ,("finalkafshevahebrew", '\x05DA')+  ,("finalmem", '\x05DD')+  ,("finalmemhebrew", '\x05DD')+  ,("finalnun", '\x05DF')+  ,("finalnunhebrew", '\x05DF')+  ,("finalpe", '\x05E3')+  ,("finalpehebrew", '\x05E3')+  ,("finaltsadi", '\x05E5')+  ,("finaltsadihebrew", '\x05E5')+  ,("firsttonechinese", '\x02C9')+  ,("fisheye", '\x25C9')+  ,("fitacyrillic", '\x0473')+  ,("five", '\x0035')+  ,("fivearabic", '\x0665')+  ,("fivebengali", '\x09EB')+  ,("fivecircle", '\x2464')+  ,("fivecircleinversesansserif", '\x278E')+  ,("fivedeva", '\x096B')+  ,("fiveeighths", '\x215D')+  ,("fivegujarati", '\x0AEB')+  ,("fivegurmukhi", '\x0A6B')+  ,("fivehackarabic", '\x0665')+  ,("fivehangzhou", '\x3025')+  ,("fiveideographicparen", '\x3224')+  ,("fiveinferior", '\x2085')+  ,("fivemonospace", '\xFF15')+  ,("fiveoldstyle", '\xF735')+  ,("fiveparen", '\x2478')+  ,("fiveperiod", '\x248C')+  ,("fivepersian", '\x06F5')+  ,("fiveroman", '\x2174')+  ,("fivesuperior", '\x2075')+  ,("fivethai", '\x0E55')+  ,("fl", '\xFB02')+  ,("florin", '\x0192')+  ,("fmonospace", '\xFF46')+  ,("fmsquare", '\x3399')+  ,("fofanthai", '\x0E1F')+  ,("fofathai", '\x0E1D')+  ,("fongmanthai", '\x0E4F')+  ,("forall", '\x2200')+  ,("four", '\x0034')+  ,("fourarabic", '\x0664')+  ,("fourbengali", '\x09EA')+  ,("fourcircle", '\x2463')+  ,("fourcircleinversesansserif", '\x278D')+  ,("fourdeva", '\x096A')+  ,("fourgujarati", '\x0AEA')+  ,("fourgurmukhi", '\x0A6A')+  ,("fourhackarabic", '\x0664')+  ,("fourhangzhou", '\x3024')+  ,("fourideographicparen", '\x3223')+  ,("fourinferior", '\x2084')+  ,("fourmonospace", '\xFF14')+  ,("fournumeratorbengali", '\x09F7')+  ,("fouroldstyle", '\xF734')+  ,("fourparen", '\x2477')+  ,("fourperiod", '\x248B')+  ,("fourpersian", '\x06F4')+  ,("fourroman", '\x2173')+  ,("foursuperior", '\x2074')+  ,("fourteencircle", '\x246D')+  ,("fourteenparen", '\x2481')+  ,("fourteenperiod", '\x2495')+  ,("fourthai", '\x0E54')+  ,("fourthtonechinese", '\x02CB')+  ,("fparen", '\x24A1')+  ,("fraction", '\x2044')+  ,("franc", '\x20A3')+  ,("g", '\x0067')+  ,("gabengali", '\x0997')+  ,("gacute", '\x01F5')+  ,("gadeva", '\x0917')+  ,("gafarabic", '\x06AF')+  ,("gaffinalarabic", '\xFB93')+  ,("gafinitialarabic", '\xFB94')+  ,("gafmedialarabic", '\xFB95')+  ,("gagujarati", '\x0A97')+  ,("gagurmukhi", '\x0A17')+  ,("gahiragana", '\x304C')+  ,("gakatakana", '\x30AC')+  ,("gamma", '\x03B3')+  ,("gammalatinsmall", '\x0263')+  ,("gammasuperior", '\x02E0')+  ,("gangiacoptic", '\x03EB')+  ,("gbopomofo", '\x310D')+  ,("gbreve", '\x011F')+  ,("gcaron", '\x01E7')+  ,("gcedilla", '\x0123')+  ,("gcircle", '\x24D6')+  ,("gcircumflex", '\x011D')+  ,("gcommaaccent", '\x0123')+  ,("gdot", '\x0121')+  ,("gdotaccent", '\x0121')+  ,("gecyrillic", '\x0433')+  ,("gehiragana", '\x3052')+  ,("gekatakana", '\x30B2')+  ,("geometricallyequal", '\x2251')+  ,("gereshaccenthebrew", '\x059C')+  ,("gereshhebrew", '\x05F3')+  ,("gereshmuqdamhebrew", '\x059D')+  ,("germandbls", '\x00DF')+  ,("gershayimaccenthebrew", '\x059E')+  ,("gershayimhebrew", '\x05F4')+  ,("getamark", '\x3013')+  ,("ghabengali", '\x0998')+  ,("ghadarmenian", '\x0572')+  ,("ghadeva", '\x0918')+  ,("ghagujarati", '\x0A98')+  ,("ghagurmukhi", '\x0A18')+  ,("ghainarabic", '\x063A')+  ,("ghainfinalarabic", '\xFECE')+  ,("ghaininitialarabic", '\xFECF')+  ,("ghainmedialarabic", '\xFED0')+  ,("ghemiddlehookcyrillic", '\x0495')+  ,("ghestrokecyrillic", '\x0493')+  ,("gheupturncyrillic", '\x0491')+  ,("ghhadeva", '\x095A')+  ,("ghhagurmukhi", '\x0A5A')+  ,("ghook", '\x0260')+  ,("ghzsquare", '\x3393')+  ,("gihiragana", '\x304E')+  ,("gikatakana", '\x30AE')+  ,("gimarmenian", '\x0563')+  ,("gimel", '\x05D2')+  ,("gimeldagesh", '\xFB32')+  ,("gimeldageshhebrew", '\xFB32')+  ,("gimelhebrew", '\x05D2')+  ,("gjecyrillic", '\x0453')+  ,("glottalinvertedstroke", '\x01BE')+  ,("glottalstop", '\x0294')+  ,("glottalstopinverted", '\x0296')+  ,("glottalstopmod", '\x02C0')+  ,("glottalstopreversed", '\x0295')+  ,("glottalstopreversedmod", '\x02C1')+  ,("glottalstopreversedsuperior", '\x02E4')+  ,("glottalstopstroke", '\x02A1')+  ,("glottalstopstrokereversed", '\x02A2')+  ,("gmacron", '\x1E21')+  ,("gmonospace", '\xFF47')+  ,("gohiragana", '\x3054')+  ,("gokatakana", '\x30B4')+  ,("gparen", '\x24A2')+  ,("gpasquare", '\x33AC')+  ,("gradient", '\x2207')+  ,("grave", '\x0060')+  ,("gravebelowcmb", '\x0316')+  ,("gravecmb", '\x0300')+  ,("gravecomb", '\x0300')+  ,("gravedeva", '\x0953')+  ,("gravelowmod", '\x02CE')+  ,("gravemonospace", '\xFF40')+  ,("gravetonecmb", '\x0340')+  ,("greater", '\x003E')+  ,("greaterequal", '\x2265')+  ,("greaterequalorless", '\x22DB')+  ,("greatermonospace", '\xFF1E')+  ,("greaterorequivalent", '\x2273')+  ,("greaterorless", '\x2277')+  ,("greateroverequal", '\x2267')+  ,("greatersmall", '\xFE65')+  ,("gscript", '\x0261')+  ,("gstroke", '\x01E5')+  ,("guhiragana", '\x3050')+  ,("guillemotleft", '\x00AB')+  ,("guillemotright", '\x00BB')+  ,("guilsinglleft", '\x2039')+  ,("guilsinglright", '\x203A')+  ,("gukatakana", '\x30B0')+  ,("guramusquare", '\x3318')+  ,("gysquare", '\x33C9')+  ,("h", '\x0068')+  ,("haabkhasiancyrillic", '\x04A9')+  ,("haaltonearabic", '\x06C1')+  ,("habengali", '\x09B9')+  ,("hadescendercyrillic", '\x04B3')+  ,("hadeva", '\x0939')+  ,("hagujarati", '\x0AB9')+  ,("hagurmukhi", '\x0A39')+  ,("haharabic", '\x062D')+  ,("hahfinalarabic", '\xFEA2')+  ,("hahinitialarabic", '\xFEA3')+  ,("hahiragana", '\x306F')+  ,("hahmedialarabic", '\xFEA4')+  ,("haitusquare", '\x332A')+  ,("hakatakana", '\x30CF')+  ,("hakatakanahalfwidth", '\xFF8A')+  ,("halantgurmukhi", '\x0A4D')+  ,("hamzaarabic", '\x0621')+  ,("hamzadammaarabic", '\x0621')+  ,("hamzadammatanarabic", '\x0621')+  ,("hamzafathaarabic", '\x0621')+  ,("hamzafathatanarabic", '\x0621')+  ,("hamzalowarabic", '\x0621')+  ,("hamzalowkasraarabic", '\x0621')+  ,("hamzalowkasratanarabic", '\x0621')+  ,("hamzasukunarabic", '\x0621')+  ,("hangulfiller", '\x3164')+  ,("hardsigncyrillic", '\x044A')+  ,("harpoonleftbarbup", '\x21BC')+  ,("harpoonrightbarbup", '\x21C0')+  ,("hasquare", '\x33CA')+  ,("hatafpatah", '\x05B2')+  ,("hatafpatah16", '\x05B2')+  ,("hatafpatah23", '\x05B2')+  ,("hatafpatah2f", '\x05B2')+  ,("hatafpatahhebrew", '\x05B2')+  ,("hatafpatahnarrowhebrew", '\x05B2')+  ,("hatafpatahquarterhebrew", '\x05B2')+  ,("hatafpatahwidehebrew", '\x05B2')+  ,("hatafqamats", '\x05B3')+  ,("hatafqamats1b", '\x05B3')+  ,("hatafqamats28", '\x05B3')+  ,("hatafqamats34", '\x05B3')+  ,("hatafqamatshebrew", '\x05B3')+  ,("hatafqamatsnarrowhebrew", '\x05B3')+  ,("hatafqamatsquarterhebrew", '\x05B3')+  ,("hatafqamatswidehebrew", '\x05B3')+  ,("hatafsegol", '\x05B1')+  ,("hatafsegol17", '\x05B1')+  ,("hatafsegol24", '\x05B1')+  ,("hatafsegol30", '\x05B1')+  ,("hatafsegolhebrew", '\x05B1')+  ,("hatafsegolnarrowhebrew", '\x05B1')+  ,("hatafsegolquarterhebrew", '\x05B1')+  ,("hatafsegolwidehebrew", '\x05B1')+  ,("hbar", '\x0127')+  ,("hbopomofo", '\x310F')+  ,("hbrevebelow", '\x1E2B')+  ,("hcedilla", '\x1E29')+  ,("hcircle", '\x24D7')+  ,("hcircumflex", '\x0125')+  ,("hdieresis", '\x1E27')+  ,("hdotaccent", '\x1E23')+  ,("hdotbelow", '\x1E25')+  ,("he", '\x05D4')+  ,("heart", '\x2665')+  ,("heartsuitblack", '\x2665')+  ,("heartsuitwhite", '\x2661')+  ,("hedagesh", '\xFB34')+  ,("hedageshhebrew", '\xFB34')+  ,("hehaltonearabic", '\x06C1')+  ,("heharabic", '\x0647')+  ,("hehebrew", '\x05D4')+  ,("hehfinalaltonearabic", '\xFBA7')+  ,("hehfinalalttwoarabic", '\xFEEA')+  ,("hehfinalarabic", '\xFEEA')+  ,("hehhamzaabovefinalarabic", '\xFBA5')+  ,("hehhamzaaboveisolatedarabic", '\xFBA4')+  ,("hehinitialaltonearabic", '\xFBA8')+  ,("hehinitialarabic", '\xFEEB')+  ,("hehiragana", '\x3078')+  ,("hehmedialaltonearabic", '\xFBA9')+  ,("hehmedialarabic", '\xFEEC')+  ,("heiseierasquare", '\x337B')+  ,("hekatakana", '\x30D8')+  ,("hekatakanahalfwidth", '\xFF8D')+  ,("hekutaarusquare", '\x3336')+  ,("henghook", '\x0267')+  ,("herutusquare", '\x3339')+  ,("het", '\x05D7')+  ,("hethebrew", '\x05D7')+  ,("hhook", '\x0266')+  ,("hhooksuperior", '\x02B1')+  ,("hieuhacirclekorean", '\x327B')+  ,("hieuhaparenkorean", '\x321B')+  ,("hieuhcirclekorean", '\x326D')+  ,("hieuhkorean", '\x314E')+  ,("hieuhparenkorean", '\x320D')+  ,("hihiragana", '\x3072')+  ,("hikatakana", '\x30D2')+  ,("hikatakanahalfwidth", '\xFF8B')+  ,("hiriq", '\x05B4')+  ,("hiriq14", '\x05B4')+  ,("hiriq21", '\x05B4')+  ,("hiriq2d", '\x05B4')+  ,("hiriqhebrew", '\x05B4')+  ,("hiriqnarrowhebrew", '\x05B4')+  ,("hiriqquarterhebrew", '\x05B4')+  ,("hiriqwidehebrew", '\x05B4')+  ,("hlinebelow", '\x1E96')+  ,("hmonospace", '\xFF48')+  ,("hoarmenian", '\x0570')+  ,("hohipthai", '\x0E2B')+  ,("hohiragana", '\x307B')+  ,("hokatakana", '\x30DB')+  ,("hokatakanahalfwidth", '\xFF8E')+  ,("holam", '\x05B9')+  ,("holam19", '\x05B9')+  ,("holam26", '\x05B9')+  ,("holam32", '\x05B9')+  ,("holamhebrew", '\x05B9')+  ,("holamnarrowhebrew", '\x05B9')+  ,("holamquarterhebrew", '\x05B9')+  ,("holamwidehebrew", '\x05B9')+  ,("honokhukthai", '\x0E2E')+  ,("hookabovecomb", '\x0309')+  ,("hookcmb", '\x0309')+  ,("hookpalatalizedbelowcmb", '\x0321')+  ,("hookretroflexbelowcmb", '\x0322')+  ,("hoonsquare", '\x3342')+  ,("horicoptic", '\x03E9')+  ,("horizontalbar", '\x2015')+  ,("horncmb", '\x031B')+  ,("hotsprings", '\x2668')+  ,("house", '\x2302')+  ,("hparen", '\x24A3')+  ,("hsuperior", '\x02B0')+  ,("hturned", '\x0265')+  ,("huhiragana", '\x3075')+  ,("huiitosquare", '\x3333')+  ,("hukatakana", '\x30D5')+  ,("hukatakanahalfwidth", '\xFF8C')+  ,("hungarumlaut", '\x02DD')+  ,("hungarumlautcmb", '\x030B')+  ,("hv", '\x0195')+  ,("hyphen", '\x002D')+  ,("hypheninferior", '\xF6E5')+  ,("hyphenmonospace", '\xFF0D')+  ,("hyphensmall", '\xFE63')+  ,("hyphensuperior", '\xF6E6')+  ,("hyphentwo", '\x2010')+  ,("i", '\x0069')+  ,("iacute", '\x00ED')+  ,("iacyrillic", '\x044F')+  ,("ibengali", '\x0987')+  ,("ibopomofo", '\x3127')+  ,("ibreve", '\x012D')+  ,("icaron", '\x01D0')+  ,("icircle", '\x24D8')+  ,("icircumflex", '\x00EE')+  ,("icyrillic", '\x0456')+  ,("idblgrave", '\x0209')+  ,("ideographearthcircle", '\x328F')+  ,("ideographfirecircle", '\x328B')+  ,("ideographicallianceparen", '\x323F')+  ,("ideographiccallparen", '\x323A')+  ,("ideographiccentrecircle", '\x32A5')+  ,("ideographicclose", '\x3006')+  ,("ideographiccomma", '\x3001')+  ,("ideographiccommaleft", '\xFF64')+  ,("ideographiccongratulationparen", '\x3237')+  ,("ideographiccorrectcircle", '\x32A3')+  ,("ideographicearthparen", '\x322F')+  ,("ideographicenterpriseparen", '\x323D')+  ,("ideographicexcellentcircle", '\x329D')+  ,("ideographicfestivalparen", '\x3240')+  ,("ideographicfinancialcircle", '\x3296')+  ,("ideographicfinancialparen", '\x3236')+  ,("ideographicfireparen", '\x322B')+  ,("ideographichaveparen", '\x3232')+  ,("ideographichighcircle", '\x32A4')+  ,("ideographiciterationmark", '\x3005')+  ,("ideographiclaborcircle", '\x3298')+  ,("ideographiclaborparen", '\x3238')+  ,("ideographicleftcircle", '\x32A7')+  ,("ideographiclowcircle", '\x32A6')+  ,("ideographicmedicinecircle", '\x32A9')+  ,("ideographicmetalparen", '\x322E')+  ,("ideographicmoonparen", '\x322A')+  ,("ideographicnameparen", '\x3234')+  ,("ideographicperiod", '\x3002')+  ,("ideographicprintcircle", '\x329E')+  ,("ideographicreachparen", '\x3243')+  ,("ideographicrepresentparen", '\x3239')+  ,("ideographicresourceparen", '\x323E')+  ,("ideographicrightcircle", '\x32A8')+  ,("ideographicsecretcircle", '\x3299')+  ,("ideographicselfparen", '\x3242')+  ,("ideographicsocietyparen", '\x3233')+  ,("ideographicspace", '\x3000')+  ,("ideographicspecialparen", '\x3235')+  ,("ideographicstockparen", '\x3231')+  ,("ideographicstudyparen", '\x323B')+  ,("ideographicsunparen", '\x3230')+  ,("ideographicsuperviseparen", '\x323C')+  ,("ideographicwaterparen", '\x322C')+  ,("ideographicwoodparen", '\x322D')+  ,("ideographiczero", '\x3007')+  ,("ideographmetalcircle", '\x328E')+  ,("ideographmooncircle", '\x328A')+  ,("ideographnamecircle", '\x3294')+  ,("ideographsuncircle", '\x3290')+  ,("ideographwatercircle", '\x328C')+  ,("ideographwoodcircle", '\x328D')+  ,("ideva", '\x0907')+  ,("idieresis", '\x00EF')+  ,("idieresisacute", '\x1E2F')+  ,("idieresiscyrillic", '\x04E5')+  ,("idotbelow", '\x1ECB')+  ,("iebrevecyrillic", '\x04D7')+  ,("iecyrillic", '\x0435')+  ,("ieungacirclekorean", '\x3275')+  ,("ieungaparenkorean", '\x3215')+  ,("ieungcirclekorean", '\x3267')+  ,("ieungkorean", '\x3147')+  ,("ieungparenkorean", '\x3207')+  ,("igrave", '\x00EC')+  ,("igujarati", '\x0A87')+  ,("igurmukhi", '\x0A07')+  ,("ihiragana", '\x3044')+  ,("ihookabove", '\x1EC9')+  ,("iibengali", '\x0988')+  ,("iicyrillic", '\x0438')+  ,("iideva", '\x0908')+  ,("iigujarati", '\x0A88')+  ,("iigurmukhi", '\x0A08')+  ,("iimatragurmukhi", '\x0A40')+  ,("iinvertedbreve", '\x020B')+  ,("iishortcyrillic", '\x0439')+  ,("iivowelsignbengali", '\x09C0')+  ,("iivowelsigndeva", '\x0940')+  ,("iivowelsigngujarati", '\x0AC0')+  ,("ij", '\x0133')+  ,("ikatakana", '\x30A4')+  ,("ikatakanahalfwidth", '\xFF72')+  ,("ikorean", '\x3163')+  ,("ilde", '\x02DC')+  ,("iluyhebrew", '\x05AC')+  ,("imacron", '\x012B')+  ,("imacroncyrillic", '\x04E3')+  ,("imageorapproximatelyequal", '\x2253')+  ,("imatragurmukhi", '\x0A3F')+  ,("imonospace", '\xFF49')+  ,("increment", '\x2206')+  ,("infinity", '\x221E')+  ,("iniarmenian", '\x056B')+  ,("integral", '\x222B')+  ,("integralbottom", '\x2321')+  ,("integralbt", '\x2321')+  ,("integralex", '\xF8F5')+  ,("integraltop", '\x2320')+  ,("integraltp", '\x2320')+  ,("intersection", '\x2229')+  ,("intisquare", '\x3305')+  ,("invbullet", '\x25D8')+  ,("invcircle", '\x25D9')+  ,("invsmileface", '\x263B')+  ,("iocyrillic", '\x0451')+  ,("iogonek", '\x012F')+  ,("iota", '\x03B9')+  ,("iotadieresis", '\x03CA')+  ,("iotadieresistonos", '\x0390')+  ,("iotalatin", '\x0269')+  ,("iotatonos", '\x03AF')+  ,("iparen", '\x24A4')+  ,("irigurmukhi", '\x0A72')+  ,("ismallhiragana", '\x3043')+  ,("ismallkatakana", '\x30A3')+  ,("ismallkatakanahalfwidth", '\xFF68')+  ,("issharbengali", '\x09FA')+  ,("istroke", '\x0268')+  ,("isuperior", '\xF6ED')+  ,("iterationhiragana", '\x309D')+  ,("iterationkatakana", '\x30FD')+  ,("itilde", '\x0129')+  ,("itildebelow", '\x1E2D')+  ,("iubopomofo", '\x3129')+  ,("iucyrillic", '\x044E')+  ,("ivowelsignbengali", '\x09BF')+  ,("ivowelsigndeva", '\x093F')+  ,("ivowelsigngujarati", '\x0ABF')+  ,("izhitsacyrillic", '\x0475')+  ,("izhitsadblgravecyrillic", '\x0477')+  ,("j", '\x006A')+  ,("jaarmenian", '\x0571')+  ,("jabengali", '\x099C')+  ,("jadeva", '\x091C')+  ,("jagujarati", '\x0A9C')+  ,("jagurmukhi", '\x0A1C')+  ,("jbopomofo", '\x3110')+  ,("jcaron", '\x01F0')+  ,("jcircle", '\x24D9')+  ,("jcircumflex", '\x0135')+  ,("jcrossedtail", '\x029D')+  ,("jdotlessstroke", '\x025F')+  ,("jecyrillic", '\x0458')+  ,("jeemarabic", '\x062C')+  ,("jeemfinalarabic", '\xFE9E')+  ,("jeeminitialarabic", '\xFE9F')+  ,("jeemmedialarabic", '\xFEA0')+  ,("jeharabic", '\x0698')+  ,("jehfinalarabic", '\xFB8B')+  ,("jhabengali", '\x099D')+  ,("jhadeva", '\x091D')+  ,("jhagujarati", '\x0A9D')+  ,("jhagurmukhi", '\x0A1D')+  ,("jheharmenian", '\x057B')+  ,("jis", '\x3004')+  ,("jmonospace", '\xFF4A')+  ,("jparen", '\x24A5')+  ,("jsuperior", '\x02B2')+  ,("k", '\x006B')+  ,("kabashkircyrillic", '\x04A1')+  ,("kabengali", '\x0995')+  ,("kacute", '\x1E31')+  ,("kacyrillic", '\x043A')+  ,("kadescendercyrillic", '\x049B')+  ,("kadeva", '\x0915')+  ,("kaf", '\x05DB')+  ,("kafarabic", '\x0643')+  ,("kafdagesh", '\xFB3B')+  ,("kafdageshhebrew", '\xFB3B')+  ,("kaffinalarabic", '\xFEDA')+  ,("kafhebrew", '\x05DB')+  ,("kafinitialarabic", '\xFEDB')+  ,("kafmedialarabic", '\xFEDC')+  ,("kafrafehebrew", '\xFB4D')+  ,("kagujarati", '\x0A95')+  ,("kagurmukhi", '\x0A15')+  ,("kahiragana", '\x304B')+  ,("kahookcyrillic", '\x04C4')+  ,("kakatakana", '\x30AB')+  ,("kakatakanahalfwidth", '\xFF76')+  ,("kappa", '\x03BA')+  ,("kappasymbolgreek", '\x03F0')+  ,("kapyeounmieumkorean", '\x3171')+  ,("kapyeounphieuphkorean", '\x3184')+  ,("kapyeounpieupkorean", '\x3178')+  ,("kapyeounssangpieupkorean", '\x3179')+  ,("karoriisquare", '\x330D')+  ,("kashidaautoarabic", '\x0640')+  ,("kashidaautonosidebearingarabic", '\x0640')+  ,("kasmallkatakana", '\x30F5')+  ,("kasquare", '\x3384')+  ,("kasraarabic", '\x0650')+  ,("kasratanarabic", '\x064D')+  ,("kastrokecyrillic", '\x049F')+  ,("katahiraprolongmarkhalfwidth", '\xFF70')+  ,("kaverticalstrokecyrillic", '\x049D')+  ,("kbopomofo", '\x310E')+  ,("kcalsquare", '\x3389')+  ,("kcaron", '\x01E9')+  ,("kcedilla", '\x0137')+  ,("kcircle", '\x24DA')+  ,("kcommaaccent", '\x0137')+  ,("kdotbelow", '\x1E33')+  ,("keharmenian", '\x0584')+  ,("kehiragana", '\x3051')+  ,("kekatakana", '\x30B1')+  ,("kekatakanahalfwidth", '\xFF79')+  ,("kenarmenian", '\x056F')+  ,("kesmallkatakana", '\x30F6')+  ,("kgreenlandic", '\x0138')+  ,("khabengali", '\x0996')+  ,("khacyrillic", '\x0445')+  ,("khadeva", '\x0916')+  ,("khagujarati", '\x0A96')+  ,("khagurmukhi", '\x0A16')+  ,("khaharabic", '\x062E')+  ,("khahfinalarabic", '\xFEA6')+  ,("khahinitialarabic", '\xFEA7')+  ,("khahmedialarabic", '\xFEA8')+  ,("kheicoptic", '\x03E7')+  ,("khhadeva", '\x0959')+  ,("khhagurmukhi", '\x0A59')+  ,("khieukhacirclekorean", '\x3278')+  ,("khieukhaparenkorean", '\x3218')+  ,("khieukhcirclekorean", '\x326A')+  ,("khieukhkorean", '\x314B')+  ,("khieukhparenkorean", '\x320A')+  ,("khokhaithai", '\x0E02')+  ,("khokhonthai", '\x0E05')+  ,("khokhuatthai", '\x0E03')+  ,("khokhwaithai", '\x0E04')+  ,("khomutthai", '\x0E5B')+  ,("khook", '\x0199')+  ,("khorakhangthai", '\x0E06')+  ,("khzsquare", '\x3391')+  ,("kihiragana", '\x304D')+  ,("kikatakana", '\x30AD')+  ,("kikatakanahalfwidth", '\xFF77')+  ,("kiroguramusquare", '\x3315')+  ,("kiromeetorusquare", '\x3316')+  ,("kirosquare", '\x3314')+  ,("kiyeokacirclekorean", '\x326E')+  ,("kiyeokaparenkorean", '\x320E')+  ,("kiyeokcirclekorean", '\x3260')+  ,("kiyeokkorean", '\x3131')+  ,("kiyeokparenkorean", '\x3200')+  ,("kiyeoksioskorean", '\x3133')+  ,("kjecyrillic", '\x045C')+  ,("klinebelow", '\x1E35')+  ,("klsquare", '\x3398')+  ,("kmcubedsquare", '\x33A6')+  ,("kmonospace", '\xFF4B')+  ,("kmsquaredsquare", '\x33A2')+  ,("kohiragana", '\x3053')+  ,("kohmsquare", '\x33C0')+  ,("kokaithai", '\x0E01')+  ,("kokatakana", '\x30B3')+  ,("kokatakanahalfwidth", '\xFF7A')+  ,("kooposquare", '\x331E')+  ,("koppacyrillic", '\x0481')+  ,("koreanstandardsymbol", '\x327F')+  ,("koroniscmb", '\x0343')+  ,("kparen", '\x24A6')+  ,("kpasquare", '\x33AA')+  ,("ksicyrillic", '\x046F')+  ,("ktsquare", '\x33CF')+  ,("kturned", '\x029E')+  ,("kuhiragana", '\x304F')+  ,("kukatakana", '\x30AF')+  ,("kukatakanahalfwidth", '\xFF78')+  ,("kvsquare", '\x33B8')+  ,("kwsquare", '\x33BE')+  ,("l", '\x006C')+  ,("labengali", '\x09B2')+  ,("lacute", '\x013A')+  ,("ladeva", '\x0932')+  ,("lagujarati", '\x0AB2')+  ,("lagurmukhi", '\x0A32')+  ,("lakkhangyaothai", '\x0E45')+  ,("lamaleffinalarabic", '\xFEFC')+  ,("lamalefhamzaabovefinalarabic", '\xFEF8')+  ,("lamalefhamzaaboveisolatedarabic", '\xFEF7')+  ,("lamalefhamzabelowfinalarabic", '\xFEFA')+  ,("lamalefhamzabelowisolatedarabic", '\xFEF9')+  ,("lamalefisolatedarabic", '\xFEFB')+  ,("lamalefmaddaabovefinalarabic", '\xFEF6')+  ,("lamalefmaddaaboveisolatedarabic", '\xFEF5')+  ,("lamarabic", '\x0644')+  ,("lambda", '\x03BB')+  ,("lambdastroke", '\x019B')+  ,("lamed", '\x05DC')+  ,("lameddagesh", '\xFB3C')+  ,("lameddageshhebrew", '\xFB3C')+  ,("lamedhebrew", '\x05DC')+  ,("lamedholam", '\x05DC')+  ,("lamedholamdagesh", '\x05DC')+  ,("lamedholamdageshhebrew", '\x05DC')+  ,("lamedholamhebrew", '\x05DC')+  ,("lamfinalarabic", '\xFEDE')+  ,("lamhahinitialarabic", '\xFCCA')+  ,("laminitialarabic", '\xFEDF')+  ,("lamjeeminitialarabic", '\xFCC9')+  ,("lamkhahinitialarabic", '\xFCCB')+  ,("lamlamhehisolatedarabic", '\xFDF2')+  ,("lammedialarabic", '\xFEE0')+  ,("lammeemhahinitialarabic", '\xFD88')+  ,("lammeeminitialarabic", '\xFCCC')+  ,("lammeemjeeminitialarabic", '\xFEDF')+  ,("lammeemkhahinitialarabic", '\xFEDF')+  ,("largecircle", '\x25EF')+  ,("lbar", '\x019A')+  ,("lbelt", '\x026C')+  ,("lbopomofo", '\x310C')+  ,("lcaron", '\x013E')+  ,("lcedilla", '\x013C')+  ,("lcircle", '\x24DB')+  ,("lcircumflexbelow", '\x1E3D')+  ,("lcommaaccent", '\x013C')+  ,("ldot", '\x0140')+  ,("ldotaccent", '\x0140')+  ,("ldotbelow", '\x1E37')+  ,("ldotbelowmacron", '\x1E39')+  ,("leftangleabovecmb", '\x031A')+  ,("lefttackbelowcmb", '\x0318')+  ,("less", '\x003C')+  ,("lessequal", '\x2264')+  ,("lessequalorgreater", '\x22DA')+  ,("lessmonospace", '\xFF1C')+  ,("lessorequivalent", '\x2272')+  ,("lessorgreater", '\x2276')+  ,("lessoverequal", '\x2266')+  ,("lesssmall", '\xFE64')+  ,("lezh", '\x026E')+  ,("lfblock", '\x258C')+  ,("lhookretroflex", '\x026D')+  ,("lira", '\x20A4')+  ,("liwnarmenian", '\x056C')+  ,("lj", '\x01C9')+  ,("ljecyrillic", '\x0459')+  ,("ll", '\xF6C0')+  ,("lladeva", '\x0933')+  ,("llagujarati", '\x0AB3')+  ,("llinebelow", '\x1E3B')+  ,("llladeva", '\x0934')+  ,("llvocalicbengali", '\x09E1')+  ,("llvocalicdeva", '\x0961')+  ,("llvocalicvowelsignbengali", '\x09E3')+  ,("llvocalicvowelsigndeva", '\x0963')+  ,("lmiddletilde", '\x026B')+  ,("lmonospace", '\xFF4C')+  ,("lmsquare", '\x33D0')+  ,("lochulathai", '\x0E2C')+  ,("logicaland", '\x2227')+  ,("logicalnot", '\x00AC')+  ,("logicalnotreversed", '\x2310')+  ,("logicalor", '\x2228')+  ,("lolingthai", '\x0E25')+  ,("longs", '\x017F')+  ,("lowlinecenterline", '\xFE4E')+  ,("lowlinecmb", '\x0332')+  ,("lowlinedashed", '\xFE4D')+  ,("lozenge", '\x25CA')+  ,("lparen", '\x24A7')+  ,("lslash", '\x0142')+  ,("lsquare", '\x2113')+  ,("lsuperior", '\xF6EE')+  ,("ltshade", '\x2591')+  ,("luthai", '\x0E26')+  ,("lvocalicbengali", '\x098C')+  ,("lvocalicdeva", '\x090C')+  ,("lvocalicvowelsignbengali", '\x09E2')+  ,("lvocalicvowelsigndeva", '\x0962')+  ,("lxsquare", '\x33D3')+  ,("m", '\x006D')+  ,("mabengali", '\x09AE')+  ,("macron", '\x00AF')+  ,("macronbelowcmb", '\x0331')+  ,("macroncmb", '\x0304')+  ,("macronlowmod", '\x02CD')+  ,("macronmonospace", '\xFFE3')+  ,("macute", '\x1E3F')+  ,("madeva", '\x092E')+  ,("magujarati", '\x0AAE')+  ,("magurmukhi", '\x0A2E')+  ,("mahapakhhebrew", '\x05A4')+  ,("mahapakhlefthebrew", '\x05A4')+  ,("mahiragana", '\x307E')+  ,("maichattawalowleftthai", '\xF895')+  ,("maichattawalowrightthai", '\xF894')+  ,("maichattawathai", '\x0E4B')+  ,("maichattawaupperleftthai", '\xF893')+  ,("maieklowleftthai", '\xF88C')+  ,("maieklowrightthai", '\xF88B')+  ,("maiekthai", '\x0E48')+  ,("maiekupperleftthai", '\xF88A')+  ,("maihanakatleftthai", '\xF884')+  ,("maihanakatthai", '\x0E31')+  ,("maitaikhuleftthai", '\xF889')+  ,("maitaikhuthai", '\x0E47')+  ,("maitholowleftthai", '\xF88F')+  ,("maitholowrightthai", '\xF88E')+  ,("maithothai", '\x0E49')+  ,("maithoupperleftthai", '\xF88D')+  ,("maitrilowleftthai", '\xF892')+  ,("maitrilowrightthai", '\xF891')+  ,("maitrithai", '\x0E4A')+  ,("maitriupperleftthai", '\xF890')+  ,("maiyamokthai", '\x0E46')+  ,("makatakana", '\x30DE')+  ,("makatakanahalfwidth", '\xFF8F')+  ,("male", '\x2642')+  ,("mansyonsquare", '\x3347')+  ,("maqafhebrew", '\x05BE')+  ,("mars", '\x2642')+  ,("masoracirclehebrew", '\x05AF')+  ,("masquare", '\x3383')+  ,("mbopomofo", '\x3107')+  ,("mbsquare", '\x33D4')+  ,("mcircle", '\x24DC')+  ,("mcubedsquare", '\x33A5')+  ,("mdotaccent", '\x1E41')+  ,("mdotbelow", '\x1E43')+  ,("meemarabic", '\x0645')+  ,("meemfinalarabic", '\xFEE2')+  ,("meeminitialarabic", '\xFEE3')+  ,("meemmedialarabic", '\xFEE4')+  ,("meemmeeminitialarabic", '\xFCD1')+  ,("meemmeemisolatedarabic", '\xFC48')+  ,("meetorusquare", '\x334D')+  ,("mehiragana", '\x3081')+  ,("meizierasquare", '\x337E')+  ,("mekatakana", '\x30E1')+  ,("mekatakanahalfwidth", '\xFF92')+  ,("mem", '\x05DE')+  ,("memdagesh", '\xFB3E')+  ,("memdageshhebrew", '\xFB3E')+  ,("memhebrew", '\x05DE')+  ,("menarmenian", '\x0574')+  ,("merkhahebrew", '\x05A5')+  ,("merkhakefulahebrew", '\x05A6')+  ,("merkhakefulalefthebrew", '\x05A6')+  ,("merkhalefthebrew", '\x05A5')+  ,("mhook", '\x0271')+  ,("mhzsquare", '\x3392')+  ,("middledotkatakanahalfwidth", '\xFF65')+  ,("middot", '\x00B7')+  ,("mieumacirclekorean", '\x3272')+  ,("mieumaparenkorean", '\x3212')+  ,("mieumcirclekorean", '\x3264')+  ,("mieumkorean", '\x3141')+  ,("mieumpansioskorean", '\x3170')+  ,("mieumparenkorean", '\x3204')+  ,("mieumpieupkorean", '\x316E')+  ,("mieumsioskorean", '\x316F')+  ,("mihiragana", '\x307F')+  ,("mikatakana", '\x30DF')+  ,("mikatakanahalfwidth", '\xFF90')+  ,("minus", '\x2212')+  ,("minusbelowcmb", '\x0320')+  ,("minuscircle", '\x2296')+  ,("minusmod", '\x02D7')+  ,("minusplus", '\x2213')+  ,("minute", '\x2032')+  ,("miribaarusquare", '\x334A')+  ,("mirisquare", '\x3349')+  ,("mlonglegturned", '\x0270')+  ,("mlsquare", '\x3396')+  ,("mmcubedsquare", '\x33A3')+  ,("mmonospace", '\xFF4D')+  ,("mmsquaredsquare", '\x339F')+  ,("mohiragana", '\x3082')+  ,("mohmsquare", '\x33C1')+  ,("mokatakana", '\x30E2')+  ,("mokatakanahalfwidth", '\xFF93')+  ,("molsquare", '\x33D6')+  ,("momathai", '\x0E21')+  ,("moverssquare", '\x33A7')+  ,("moverssquaredsquare", '\x33A8')+  ,("mparen", '\x24A8')+  ,("mpasquare", '\x33AB')+  ,("mssquare", '\x33B3')+  ,("msuperior", '\xF6EF')+  ,("mturned", '\x026F')+  ,("mu", '\x00B5')+  ,("mu1", '\x00B5')+  ,("muasquare", '\x3382')+  ,("muchgreater", '\x226B')+  ,("muchless", '\x226A')+  ,("mufsquare", '\x338C')+  ,("mugreek", '\x03BC')+  ,("mugsquare", '\x338D')+  ,("muhiragana", '\x3080')+  ,("mukatakana", '\x30E0')+  ,("mukatakanahalfwidth", '\xFF91')+  ,("mulsquare", '\x3395')+  ,("multiply", '\x00D7')+  ,("mumsquare", '\x339B')+  ,("munahhebrew", '\x05A3')+  ,("munahlefthebrew", '\x05A3')+  ,("musicalnote", '\x266A')+  ,("musicalnotedbl", '\x266B')+  ,("musicflatsign", '\x266D')+  ,("musicsharpsign", '\x266F')+  ,("mussquare", '\x33B2')+  ,("muvsquare", '\x33B6')+  ,("muwsquare", '\x33BC')+  ,("mvmegasquare", '\x33B9')+  ,("mvsquare", '\x33B7')+  ,("mwmegasquare", '\x33BF')+  ,("mwsquare", '\x33BD')+  ,("n", '\x006E')+  ,("nabengali", '\x09A8')+  ,("nabla", '\x2207')+  ,("nacute", '\x0144')+  ,("nadeva", '\x0928')+  ,("nagujarati", '\x0AA8')+  ,("nagurmukhi", '\x0A28')+  ,("nahiragana", '\x306A')+  ,("nakatakana", '\x30CA')+  ,("nakatakanahalfwidth", '\xFF85')+  ,("napostrophe", '\x0149')+  ,("nasquare", '\x3381')+  ,("nbopomofo", '\x310B')+  ,("nbspace", '\x00A0')+  ,("ncaron", '\x0148')+  ,("ncedilla", '\x0146')+  ,("ncircle", '\x24DD')+  ,("ncircumflexbelow", '\x1E4B')+  ,("ncommaaccent", '\x0146')+  ,("ndotaccent", '\x1E45')+  ,("ndotbelow", '\x1E47')+  ,("nehiragana", '\x306D')+  ,("nekatakana", '\x30CD')+  ,("nekatakanahalfwidth", '\xFF88')+  ,("newsheqelsign", '\x20AA')+  ,("nfsquare", '\x338B')+  ,("ngabengali", '\x0999')+  ,("ngadeva", '\x0919')+  ,("ngagujarati", '\x0A99')+  ,("ngagurmukhi", '\x0A19')+  ,("ngonguthai", '\x0E07')+  ,("nhiragana", '\x3093')+  ,("nhookleft", '\x0272')+  ,("nhookretroflex", '\x0273')+  ,("nieunacirclekorean", '\x326F')+  ,("nieunaparenkorean", '\x320F')+  ,("nieuncieuckorean", '\x3135')+  ,("nieuncirclekorean", '\x3261')+  ,("nieunhieuhkorean", '\x3136')+  ,("nieunkorean", '\x3134')+  ,("nieunpansioskorean", '\x3168')+  ,("nieunparenkorean", '\x3201')+  ,("nieunsioskorean", '\x3167')+  ,("nieuntikeutkorean", '\x3166')+  ,("nihiragana", '\x306B')+  ,("nikatakana", '\x30CB')+  ,("nikatakanahalfwidth", '\xFF86')+  ,("nikhahitleftthai", '\xF899')+  ,("nikhahitthai", '\x0E4D')+  ,("nine", '\x0039')+  ,("ninearabic", '\x0669')+  ,("ninebengali", '\x09EF')+  ,("ninecircle", '\x2468')+  ,("ninecircleinversesansserif", '\x2792')+  ,("ninedeva", '\x096F')+  ,("ninegujarati", '\x0AEF')+  ,("ninegurmukhi", '\x0A6F')+  ,("ninehackarabic", '\x0669')+  ,("ninehangzhou", '\x3029')+  ,("nineideographicparen", '\x3228')+  ,("nineinferior", '\x2089')+  ,("ninemonospace", '\xFF19')+  ,("nineoldstyle", '\xF739')+  ,("nineparen", '\x247C')+  ,("nineperiod", '\x2490')+  ,("ninepersian", '\x06F9')+  ,("nineroman", '\x2178')+  ,("ninesuperior", '\x2079')+  ,("nineteencircle", '\x2472')+  ,("nineteenparen", '\x2486')+  ,("nineteenperiod", '\x249A')+  ,("ninethai", '\x0E59')+  ,("nj", '\x01CC')+  ,("njecyrillic", '\x045A')+  ,("nkatakana", '\x30F3')+  ,("nkatakanahalfwidth", '\xFF9D')+  ,("nlegrightlong", '\x019E')+  ,("nlinebelow", '\x1E49')+  ,("nmonospace", '\xFF4E')+  ,("nmsquare", '\x339A')+  ,("nnabengali", '\x09A3')+  ,("nnadeva", '\x0923')+  ,("nnagujarati", '\x0AA3')+  ,("nnagurmukhi", '\x0A23')+  ,("nnnadeva", '\x0929')+  ,("nohiragana", '\x306E')+  ,("nokatakana", '\x30CE')+  ,("nokatakanahalfwidth", '\xFF89')+  ,("nonbreakingspace", '\x00A0')+  ,("nonenthai", '\x0E13')+  ,("nonuthai", '\x0E19')+  ,("noonarabic", '\x0646')+  ,("noonfinalarabic", '\xFEE6')+  ,("noonghunnaarabic", '\x06BA')+  ,("noonghunnafinalarabic", '\xFB9F')+  ,("noonhehinitialarabic", '\xFEE7')+  ,("nooninitialarabic", '\xFEE7')+  ,("noonjeeminitialarabic", '\xFCD2')+  ,("noonjeemisolatedarabic", '\xFC4B')+  ,("noonmedialarabic", '\xFEE8')+  ,("noonmeeminitialarabic", '\xFCD5')+  ,("noonmeemisolatedarabic", '\xFC4E')+  ,("noonnoonfinalarabic", '\xFC8D')+  ,("notcontains", '\x220C')+  ,("notelement", '\x2209')+  ,("notelementof", '\x2209')+  ,("notequal", '\x2260')+  ,("notgreater", '\x226F')+  ,("notgreaternorequal", '\x2271')+  ,("notgreaternorless", '\x2279')+  ,("notidentical", '\x2262')+  ,("notless", '\x226E')+  ,("notlessnorequal", '\x2270')+  ,("notparallel", '\x2226')+  ,("notprecedes", '\x2280')+  ,("notsubset", '\x2284')+  ,("notsucceeds", '\x2281')+  ,("notsuperset", '\x2285')+  ,("nowarmenian", '\x0576')+  ,("nparen", '\x24A9')+  ,("nssquare", '\x33B1')+  ,("nsuperior", '\x207F')+  ,("ntilde", '\x00F1')+  ,("nu", '\x03BD')+  ,("nuhiragana", '\x306C')+  ,("nukatakana", '\x30CC')+  ,("nukatakanahalfwidth", '\xFF87')+  ,("nuktabengali", '\x09BC')+  ,("nuktadeva", '\x093C')+  ,("nuktagujarati", '\x0ABC')+  ,("nuktagurmukhi", '\x0A3C')+  ,("numbersign", '\x0023')+  ,("numbersignmonospace", '\xFF03')+  ,("numbersignsmall", '\xFE5F')+  ,("numeralsigngreek", '\x0374')+  ,("numeralsignlowergreek", '\x0375')+  ,("numero", '\x2116')+  ,("nun", '\x05E0')+  ,("nundagesh", '\xFB40')+  ,("nundageshhebrew", '\xFB40')+  ,("nunhebrew", '\x05E0')+  ,("nvsquare", '\x33B5')+  ,("nwsquare", '\x33BB')+  ,("nyabengali", '\x099E')+  ,("nyadeva", '\x091E')+  ,("nyagujarati", '\x0A9E')+  ,("nyagurmukhi", '\x0A1E')+  ,("o", '\x006F')+  ,("oacute", '\x00F3')+  ,("oangthai", '\x0E2D')+  ,("obarred", '\x0275')+  ,("obarredcyrillic", '\x04E9')+  ,("obarreddieresiscyrillic", '\x04EB')+  ,("obengali", '\x0993')+  ,("obopomofo", '\x311B')+  ,("obreve", '\x014F')+  ,("ocandradeva", '\x0911')+  ,("ocandragujarati", '\x0A91')+  ,("ocandravowelsigndeva", '\x0949')+  ,("ocandravowelsigngujarati", '\x0AC9')+  ,("ocaron", '\x01D2')+  ,("ocircle", '\x24DE')+  ,("ocircumflex", '\x00F4')+  ,("ocircumflexacute", '\x1ED1')+  ,("ocircumflexdotbelow", '\x1ED9')+  ,("ocircumflexgrave", '\x1ED3')+  ,("ocircumflexhookabove", '\x1ED5')+  ,("ocircumflextilde", '\x1ED7')+  ,("ocyrillic", '\x043E')+  ,("odblacute", '\x0151')+  ,("odblgrave", '\x020D')+  ,("odeva", '\x0913')+  ,("odieresis", '\x00F6')+  ,("odieresiscyrillic", '\x04E7')+  ,("odotbelow", '\x1ECD')+  ,("oe", '\x0153')+  ,("oekorean", '\x315A')+  ,("ogonek", '\x02DB')+  ,("ogonekcmb", '\x0328')+  ,("ograve", '\x00F2')+  ,("ogujarati", '\x0A93')+  ,("oharmenian", '\x0585')+  ,("ohiragana", '\x304A')+  ,("ohookabove", '\x1ECF')+  ,("ohorn", '\x01A1')+  ,("ohornacute", '\x1EDB')+  ,("ohorndotbelow", '\x1EE3')+  ,("ohorngrave", '\x1EDD')+  ,("ohornhookabove", '\x1EDF')+  ,("ohorntilde", '\x1EE1')+  ,("ohungarumlaut", '\x0151')+  ,("oi", '\x01A3')+  ,("oinvertedbreve", '\x020F')+  ,("okatakana", '\x30AA')+  ,("okatakanahalfwidth", '\xFF75')+  ,("okorean", '\x3157')+  ,("olehebrew", '\x05AB')+  ,("omacron", '\x014D')+  ,("omacronacute", '\x1E53')+  ,("omacrongrave", '\x1E51')+  ,("omdeva", '\x0950')+  ,("omega", '\x03C9')+  ,("omega1", '\x03D6')+  ,("omegacyrillic", '\x0461')+  ,("omegalatinclosed", '\x0277')+  ,("omegaroundcyrillic", '\x047B')+  ,("omegatitlocyrillic", '\x047D')+  ,("omegatonos", '\x03CE')+  ,("omgujarati", '\x0AD0')+  ,("omicron", '\x03BF')+  ,("omicrontonos", '\x03CC')+  ,("omonospace", '\xFF4F')+  ,("one", '\x0031')+  ,("onearabic", '\x0661')+  ,("onebengali", '\x09E7')+  ,("onecircle", '\x2460')+  ,("onecircleinversesansserif", '\x278A')+  ,("onedeva", '\x0967')+  ,("onedotenleader", '\x2024')+  ,("oneeighth", '\x215B')+  ,("onefitted", '\xF6DC')+  ,("onegujarati", '\x0AE7')+  ,("onegurmukhi", '\x0A67')+  ,("onehackarabic", '\x0661')+  ,("onehalf", '\x00BD')+  ,("onehangzhou", '\x3021')+  ,("oneideographicparen", '\x3220')+  ,("oneinferior", '\x2081')+  ,("onemonospace", '\xFF11')+  ,("onenumeratorbengali", '\x09F4')+  ,("oneoldstyle", '\xF731')+  ,("oneparen", '\x2474')+  ,("oneperiod", '\x2488')+  ,("onepersian", '\x06F1')+  ,("onequarter", '\x00BC')+  ,("oneroman", '\x2170')+  ,("onesuperior", '\x00B9')+  ,("onethai", '\x0E51')+  ,("onethird", '\x2153')+  ,("oogonek", '\x01EB')+  ,("oogonekmacron", '\x01ED')+  ,("oogurmukhi", '\x0A13')+  ,("oomatragurmukhi", '\x0A4B')+  ,("oopen", '\x0254')+  ,("oparen", '\x24AA')+  ,("openbullet", '\x25E6')+  ,("option", '\x2325')+  ,("ordfeminine", '\x00AA')+  ,("ordmasculine", '\x00BA')+  ,("orthogonal", '\x221F')+  ,("oshortdeva", '\x0912')+  ,("oshortvowelsigndeva", '\x094A')+  ,("oslash", '\x00F8')+  ,("oslashacute", '\x01FF')+  ,("osmallhiragana", '\x3049')+  ,("osmallkatakana", '\x30A9')+  ,("osmallkatakanahalfwidth", '\xFF6B')+  ,("ostrokeacute", '\x01FF')+  ,("osuperior", '\xF6F0')+  ,("otcyrillic", '\x047F')+  ,("otilde", '\x00F5')+  ,("otildeacute", '\x1E4D')+  ,("otildedieresis", '\x1E4F')+  ,("oubopomofo", '\x3121')+  ,("overline", '\x203E')+  ,("overlinecenterline", '\xFE4A')+  ,("overlinecmb", '\x0305')+  ,("overlinedashed", '\xFE49')+  ,("overlinedblwavy", '\xFE4C')+  ,("overlinewavy", '\xFE4B')+  ,("overscore", '\x00AF')+  ,("ovowelsignbengali", '\x09CB')+  ,("ovowelsigndeva", '\x094B')+  ,("ovowelsigngujarati", '\x0ACB')+  ,("p", '\x0070')+  ,("paampssquare", '\x3380')+  ,("paasentosquare", '\x332B')+  ,("pabengali", '\x09AA')+  ,("pacute", '\x1E55')+  ,("padeva", '\x092A')+  ,("pagedown", '\x21DF')+  ,("pageup", '\x21DE')+  ,("pagujarati", '\x0AAA')+  ,("pagurmukhi", '\x0A2A')+  ,("pahiragana", '\x3071')+  ,("paiyannoithai", '\x0E2F')+  ,("pakatakana", '\x30D1')+  ,("palatalizationcyrilliccmb", '\x0484')+  ,("palochkacyrillic", '\x04C0')+  ,("pansioskorean", '\x317F')+  ,("paragraph", '\x00B6')+  ,("parallel", '\x2225')+  ,("parenleft", '\x0028')+  ,("parenleftaltonearabic", '\xFD3E')+  ,("parenleftbt", '\xF8ED')+  ,("parenleftex", '\xF8EC')+  ,("parenleftinferior", '\x208D')+  ,("parenleftmonospace", '\xFF08')+  ,("parenleftsmall", '\xFE59')+  ,("parenleftsuperior", '\x207D')+  ,("parenlefttp", '\xF8EB')+  ,("parenleftvertical", '\xFE35')+  ,("parenright", '\x0029')+  ,("parenrightaltonearabic", '\xFD3F')+  ,("parenrightbt", '\xF8F8')+  ,("parenrightex", '\xF8F7')+  ,("parenrightinferior", '\x208E')+  ,("parenrightmonospace", '\xFF09')+  ,("parenrightsmall", '\xFE5A')+  ,("parenrightsuperior", '\x207E')+  ,("parenrighttp", '\xF8F6')+  ,("parenrightvertical", '\xFE36')+  ,("partialdiff", '\x2202')+  ,("paseqhebrew", '\x05C0')+  ,("pashtahebrew", '\x0599')+  ,("pasquare", '\x33A9')+  ,("patah", '\x05B7')+  ,("patah11", '\x05B7')+  ,("patah1d", '\x05B7')+  ,("patah2a", '\x05B7')+  ,("patahhebrew", '\x05B7')+  ,("patahnarrowhebrew", '\x05B7')+  ,("patahquarterhebrew", '\x05B7')+  ,("patahwidehebrew", '\x05B7')+  ,("pazerhebrew", '\x05A1')+  ,("pbopomofo", '\x3106')+  ,("pcircle", '\x24DF')+  ,("pdotaccent", '\x1E57')+  ,("pe", '\x05E4')+  ,("pecyrillic", '\x043F')+  ,("pedagesh", '\xFB44')+  ,("pedageshhebrew", '\xFB44')+  ,("peezisquare", '\x333B')+  ,("pefinaldageshhebrew", '\xFB43')+  ,("peharabic", '\x067E')+  ,("peharmenian", '\x057A')+  ,("pehebrew", '\x05E4')+  ,("pehfinalarabic", '\xFB57')+  ,("pehinitialarabic", '\xFB58')+  ,("pehiragana", '\x307A')+  ,("pehmedialarabic", '\xFB59')+  ,("pekatakana", '\x30DA')+  ,("pemiddlehookcyrillic", '\x04A7')+  ,("perafehebrew", '\xFB4E')+  ,("percent", '\x0025')+  ,("percentarabic", '\x066A')+  ,("percentmonospace", '\xFF05')+  ,("percentsmall", '\xFE6A')+  ,("period", '\x002E')+  ,("periodarmenian", '\x0589')+  ,("periodcentered", '\x00B7')+  ,("periodhalfwidth", '\xFF61')+  ,("periodinferior", '\xF6E7')+  ,("periodmonospace", '\xFF0E')+  ,("periodsmall", '\xFE52')+  ,("periodsuperior", '\xF6E8')+  ,("perispomenigreekcmb", '\x0342')+  ,("perpendicular", '\x22A5')+  ,("perthousand", '\x2030')+  ,("peseta", '\x20A7')+  ,("pfsquare", '\x338A')+  ,("phabengali", '\x09AB')+  ,("phadeva", '\x092B')+  ,("phagujarati", '\x0AAB')+  ,("phagurmukhi", '\x0A2B')+  ,("phi", '\x03C6')+  ,("phi1", '\x03D5')+  ,("phieuphacirclekorean", '\x327A')+  ,("phieuphaparenkorean", '\x321A')+  ,("phieuphcirclekorean", '\x326C')+  ,("phieuphkorean", '\x314D')+  ,("phieuphparenkorean", '\x320C')+  ,("philatin", '\x0278')+  ,("phinthuthai", '\x0E3A')+  ,("phisymbolgreek", '\x03D5')+  ,("phook", '\x01A5')+  ,("phophanthai", '\x0E1E')+  ,("phophungthai", '\x0E1C')+  ,("phosamphaothai", '\x0E20')+  ,("pi", '\x03C0')+  ,("pieupacirclekorean", '\x3273')+  ,("pieupaparenkorean", '\x3213')+  ,("pieupcieuckorean", '\x3176')+  ,("pieupcirclekorean", '\x3265')+  ,("pieupkiyeokkorean", '\x3172')+  ,("pieupkorean", '\x3142')+  ,("pieupparenkorean", '\x3205')+  ,("pieupsioskiyeokkorean", '\x3174')+  ,("pieupsioskorean", '\x3144')+  ,("pieupsiostikeutkorean", '\x3175')+  ,("pieupthieuthkorean", '\x3177')+  ,("pieuptikeutkorean", '\x3173')+  ,("pihiragana", '\x3074')+  ,("pikatakana", '\x30D4')+  ,("pisymbolgreek", '\x03D6')+  ,("piwrarmenian", '\x0583')+  ,("plus", '\x002B')+  ,("plusbelowcmb", '\x031F')+  ,("pluscircle", '\x2295')+  ,("plusminus", '\x00B1')+  ,("plusmod", '\x02D6')+  ,("plusmonospace", '\xFF0B')+  ,("plussmall", '\xFE62')+  ,("plussuperior", '\x207A')+  ,("pmonospace", '\xFF50')+  ,("pmsquare", '\x33D8')+  ,("pohiragana", '\x307D')+  ,("pointingindexdownwhite", '\x261F')+  ,("pointingindexleftwhite", '\x261C')+  ,("pointingindexrightwhite", '\x261E')+  ,("pointingindexupwhite", '\x261D')+  ,("pokatakana", '\x30DD')+  ,("poplathai", '\x0E1B')+  ,("postalmark", '\x3012')+  ,("postalmarkface", '\x3020')+  ,("pparen", '\x24AB')+  ,("precedes", '\x227A')+  ,("prescription", '\x211E')+  ,("primemod", '\x02B9')+  ,("primereversed", '\x2035')+  ,("product", '\x220F')+  ,("projective", '\x2305')+  ,("prolongedkana", '\x30FC')+  ,("propellor", '\x2318')+  ,("propersubset", '\x2282')+  ,("propersuperset", '\x2283')+  ,("proportion", '\x2237')+  ,("proportional", '\x221D')+  ,("psi", '\x03C8')+  ,("psicyrillic", '\x0471')+  ,("psilipneumatacyrilliccmb", '\x0486')+  ,("pssquare", '\x33B0')+  ,("puhiragana", '\x3077')+  ,("pukatakana", '\x30D7')+  ,("pvsquare", '\x33B4')+  ,("pwsquare", '\x33BA')+  ,("q", '\x0071')+  ,("qadeva", '\x0958')+  ,("qadmahebrew", '\x05A8')+  ,("qafarabic", '\x0642')+  ,("qaffinalarabic", '\xFED6')+  ,("qafinitialarabic", '\xFED7')+  ,("qafmedialarabic", '\xFED8')+  ,("qamats", '\x05B8')+  ,("qamats10", '\x05B8')+  ,("qamats1a", '\x05B8')+  ,("qamats1c", '\x05B8')+  ,("qamats27", '\x05B8')+  ,("qamats29", '\x05B8')+  ,("qamats33", '\x05B8')+  ,("qamatsde", '\x05B8')+  ,("qamatshebrew", '\x05B8')+  ,("qamatsnarrowhebrew", '\x05B8')+  ,("qamatsqatanhebrew", '\x05B8')+  ,("qamatsqatannarrowhebrew", '\x05B8')+  ,("qamatsqatanquarterhebrew", '\x05B8')+  ,("qamatsqatanwidehebrew", '\x05B8')+  ,("qamatsquarterhebrew", '\x05B8')+  ,("qamatswidehebrew", '\x05B8')+  ,("qarneyparahebrew", '\x059F')+  ,("qbopomofo", '\x3111')+  ,("qcircle", '\x24E0')+  ,("qhook", '\x02A0')+  ,("qmonospace", '\xFF51')+  ,("qof", '\x05E7')+  ,("qofdagesh", '\xFB47')+  ,("qofdageshhebrew", '\xFB47')+  ,("qofhatafpatah", '\x05E7')+  ,("qofhatafpatahhebrew", '\x05E7')+  ,("qofhatafsegol", '\x05E7')+  ,("qofhatafsegolhebrew", '\x05E7')+  ,("qofhebrew", '\x05E7')+  ,("qofhiriq", '\x05E7')+  ,("qofhiriqhebrew", '\x05E7')+  ,("qofholam", '\x05E7')+  ,("qofholamhebrew", '\x05E7')+  ,("qofpatah", '\x05E7')+  ,("qofpatahhebrew", '\x05E7')+  ,("qofqamats", '\x05E7')+  ,("qofqamatshebrew", '\x05E7')+  ,("qofqubuts", '\x05E7')+  ,("qofqubutshebrew", '\x05E7')+  ,("qofsegol", '\x05E7')+  ,("qofsegolhebrew", '\x05E7')+  ,("qofsheva", '\x05E7')+  ,("qofshevahebrew", '\x05E7')+  ,("qoftsere", '\x05E7')+  ,("qoftserehebrew", '\x05E7')+  ,("qparen", '\x24AC')+  ,("quarternote", '\x2669')+  ,("qubuts", '\x05BB')+  ,("qubuts18", '\x05BB')+  ,("qubuts25", '\x05BB')+  ,("qubuts31", '\x05BB')+  ,("qubutshebrew", '\x05BB')+  ,("qubutsnarrowhebrew", '\x05BB')+  ,("qubutsquarterhebrew", '\x05BB')+  ,("qubutswidehebrew", '\x05BB')+  ,("question", '\x003F')+  ,("questionarabic", '\x061F')+  ,("questionarmenian", '\x055E')+  ,("questiondown", '\x00BF')+  ,("questiondownsmall", '\xF7BF')+  ,("questiongreek", '\x037E')+  ,("questionmonospace", '\xFF1F')+  ,("questionsmall", '\xF73F')+  ,("quotedbl", '\x0022')+  ,("quotedblbase", '\x201E')+  ,("quotedblleft", '\x201C')+  ,("quotedblmonospace", '\xFF02')+  ,("quotedblprime", '\x301E')+  ,("quotedblprimereversed", '\x301D')+  ,("quotedblright", '\x201D')+  ,("quoteleft", '\x2018')+  ,("quoteleftreversed", '\x201B')+  ,("quotereversed", '\x201B')+  ,("quoteright", '\x2019')+  ,("quoterightn", '\x0149')+  ,("quotesinglbase", '\x201A')+  ,("quotesingle", '\x0027')+  ,("quotesinglemonospace", '\xFF07')+  ,("r", '\x0072')+  ,("raarmenian", '\x057C')+  ,("rabengali", '\x09B0')+  ,("racute", '\x0155')+  ,("radeva", '\x0930')+  ,("radical", '\x221A')+  ,("radicalex", '\xF8E5')+  ,("radoverssquare", '\x33AE')+  ,("radoverssquaredsquare", '\x33AF')+  ,("radsquare", '\x33AD')+  ,("rafe", '\x05BF')+  ,("rafehebrew", '\x05BF')+  ,("ragujarati", '\x0AB0')+  ,("ragurmukhi", '\x0A30')+  ,("rahiragana", '\x3089')+  ,("rakatakana", '\x30E9')+  ,("rakatakanahalfwidth", '\xFF97')+  ,("ralowerdiagonalbengali", '\x09F1')+  ,("ramiddlediagonalbengali", '\x09F0')+  ,("ramshorn", '\x0264')+  ,("ratio", '\x2236')+  ,("rbopomofo", '\x3116')+  ,("rcaron", '\x0159')+  ,("rcedilla", '\x0157')+  ,("rcircle", '\x24E1')+  ,("rcommaaccent", '\x0157')+  ,("rdblgrave", '\x0211')+  ,("rdotaccent", '\x1E59')+  ,("rdotbelow", '\x1E5B')+  ,("rdotbelowmacron", '\x1E5D')+  ,("referencemark", '\x203B')+  ,("reflexsubset", '\x2286')+  ,("reflexsuperset", '\x2287')+  ,("registered", '\x00AE')+  ,("registersans", '\xF8E8')+  ,("registerserif", '\xF6DA')+  ,("reharabic", '\x0631')+  ,("reharmenian", '\x0580')+  ,("rehfinalarabic", '\xFEAE')+  ,("rehiragana", '\x308C')+  ,("rehyehaleflamarabic", '\x0631')+  ,("rekatakana", '\x30EC')+  ,("rekatakanahalfwidth", '\xFF9A')+  ,("resh", '\x05E8')+  ,("reshdageshhebrew", '\xFB48')+  ,("reshhatafpatah", '\x05E8')+  ,("reshhatafpatahhebrew", '\x05E8')+  ,("reshhatafsegol", '\x05E8')+  ,("reshhatafsegolhebrew", '\x05E8')+  ,("reshhebrew", '\x05E8')+  ,("reshhiriq", '\x05E8')+  ,("reshhiriqhebrew", '\x05E8')+  ,("reshholam", '\x05E8')+  ,("reshholamhebrew", '\x05E8')+  ,("reshpatah", '\x05E8')+  ,("reshpatahhebrew", '\x05E8')+  ,("reshqamats", '\x05E8')+  ,("reshqamatshebrew", '\x05E8')+  ,("reshqubuts", '\x05E8')+  ,("reshqubutshebrew", '\x05E8')+  ,("reshsegol", '\x05E8')+  ,("reshsegolhebrew", '\x05E8')+  ,("reshsheva", '\x05E8')+  ,("reshshevahebrew", '\x05E8')+  ,("reshtsere", '\x05E8')+  ,("reshtserehebrew", '\x05E8')+  ,("reversedtilde", '\x223D')+  ,("reviahebrew", '\x0597')+  ,("reviamugrashhebrew", '\x0597')+  ,("revlogicalnot", '\x2310')+  ,("rfishhook", '\x027E')+  ,("rfishhookreversed", '\x027F')+  ,("rhabengali", '\x09DD')+  ,("rhadeva", '\x095D')+  ,("rho", '\x03C1')+  ,("rhook", '\x027D')+  ,("rhookturned", '\x027B')+  ,("rhookturnedsuperior", '\x02B5')+  ,("rhosymbolgreek", '\x03F1')+  ,("rhotichookmod", '\x02DE')+  ,("rieulacirclekorean", '\x3271')+  ,("rieulaparenkorean", '\x3211')+  ,("rieulcirclekorean", '\x3263')+  ,("rieulhieuhkorean", '\x3140')+  ,("rieulkiyeokkorean", '\x313A')+  ,("rieulkiyeoksioskorean", '\x3169')+  ,("rieulkorean", '\x3139')+  ,("rieulmieumkorean", '\x313B')+  ,("rieulpansioskorean", '\x316C')+  ,("rieulparenkorean", '\x3203')+  ,("rieulphieuphkorean", '\x313F')+  ,("rieulpieupkorean", '\x313C')+  ,("rieulpieupsioskorean", '\x316B')+  ,("rieulsioskorean", '\x313D')+  ,("rieulthieuthkorean", '\x313E')+  ,("rieultikeutkorean", '\x316A')+  ,("rieulyeorinhieuhkorean", '\x316D')+  ,("rightangle", '\x221F')+  ,("righttackbelowcmb", '\x0319')+  ,("righttriangle", '\x22BF')+  ,("rihiragana", '\x308A')+  ,("rikatakana", '\x30EA')+  ,("rikatakanahalfwidth", '\xFF98')+  ,("ring", '\x02DA')+  ,("ringbelowcmb", '\x0325')+  ,("ringcmb", '\x030A')+  ,("ringhalfleft", '\x02BF')+  ,("ringhalfleftarmenian", '\x0559')+  ,("ringhalfleftbelowcmb", '\x031C')+  ,("ringhalfleftcentered", '\x02D3')+  ,("ringhalfright", '\x02BE')+  ,("ringhalfrightbelowcmb", '\x0339')+  ,("ringhalfrightcentered", '\x02D2')+  ,("rinvertedbreve", '\x0213')+  ,("rittorusquare", '\x3351')+  ,("rlinebelow", '\x1E5F')+  ,("rlongleg", '\x027C')+  ,("rlonglegturned", '\x027A')+  ,("rmonospace", '\xFF52')+  ,("rohiragana", '\x308D')+  ,("rokatakana", '\x30ED')+  ,("rokatakanahalfwidth", '\xFF9B')+  ,("roruathai", '\x0E23')+  ,("rparen", '\x24AD')+  ,("rrabengali", '\x09DC')+  ,("rradeva", '\x0931')+  ,("rragurmukhi", '\x0A5C')+  ,("rreharabic", '\x0691')+  ,("rrehfinalarabic", '\xFB8D')+  ,("rrvocalicbengali", '\x09E0')+  ,("rrvocalicdeva", '\x0960')+  ,("rrvocalicgujarati", '\x0AE0')+  ,("rrvocalicvowelsignbengali", '\x09C4')+  ,("rrvocalicvowelsigndeva", '\x0944')+  ,("rrvocalicvowelsigngujarati", '\x0AC4')+  ,("rsuperior", '\xF6F1')+  ,("rtblock", '\x2590')+  ,("rturned", '\x0279')+  ,("rturnedsuperior", '\x02B4')+  ,("ruhiragana", '\x308B')+  ,("rukatakana", '\x30EB')+  ,("rukatakanahalfwidth", '\xFF99')+  ,("rupeemarkbengali", '\x09F2')+  ,("rupeesignbengali", '\x09F3')+  ,("rupiah", '\xF6DD')+  ,("ruthai", '\x0E24')+  ,("rvocalicbengali", '\x098B')+  ,("rvocalicdeva", '\x090B')+  ,("rvocalicgujarati", '\x0A8B')+  ,("rvocalicvowelsignbengali", '\x09C3')+  ,("rvocalicvowelsigndeva", '\x0943')+  ,("rvocalicvowelsigngujarati", '\x0AC3')+  ,("s", '\x0073')+  ,("sabengali", '\x09B8')+  ,("sacute", '\x015B')+  ,("sacutedotaccent", '\x1E65')+  ,("sadarabic", '\x0635')+  ,("sadeva", '\x0938')+  ,("sadfinalarabic", '\xFEBA')+  ,("sadinitialarabic", '\xFEBB')+  ,("sadmedialarabic", '\xFEBC')+  ,("sagujarati", '\x0AB8')+  ,("sagurmukhi", '\x0A38')+  ,("sahiragana", '\x3055')+  ,("sakatakana", '\x30B5')+  ,("sakatakanahalfwidth", '\xFF7B')+  ,("sallallahoualayhewasallamarabic", '\xFDFA')+  ,("samekh", '\x05E1')+  ,("samekhdagesh", '\xFB41')+  ,("samekhdageshhebrew", '\xFB41')+  ,("samekhhebrew", '\x05E1')+  ,("saraaathai", '\x0E32')+  ,("saraaethai", '\x0E41')+  ,("saraaimaimalaithai", '\x0E44')+  ,("saraaimaimuanthai", '\x0E43')+  ,("saraamthai", '\x0E33')+  ,("saraathai", '\x0E30')+  ,("saraethai", '\x0E40')+  ,("saraiileftthai", '\xF886')+  ,("saraiithai", '\x0E35')+  ,("saraileftthai", '\xF885')+  ,("saraithai", '\x0E34')+  ,("saraothai", '\x0E42')+  ,("saraueeleftthai", '\xF888')+  ,("saraueethai", '\x0E37')+  ,("saraueleftthai", '\xF887')+  ,("sarauethai", '\x0E36')+  ,("sarauthai", '\x0E38')+  ,("sarauuthai", '\x0E39')+  ,("sbopomofo", '\x3119')+  ,("scaron", '\x0161')+  ,("scarondotaccent", '\x1E67')+  ,("scedilla", '\x015F')+  ,("schwa", '\x0259')+  ,("schwacyrillic", '\x04D9')+  ,("schwadieresiscyrillic", '\x04DB')+  ,("schwahook", '\x025A')+  ,("scircle", '\x24E2')+  ,("scircumflex", '\x015D')+  ,("scommaaccent", '\x0219')+  ,("sdotaccent", '\x1E61')+  ,("sdotbelow", '\x1E63')+  ,("sdotbelowdotaccent", '\x1E69')+  ,("seagullbelowcmb", '\x033C')+  ,("second", '\x2033')+  ,("secondtonechinese", '\x02CA')+  ,("section", '\x00A7')+  ,("seenarabic", '\x0633')+  ,("seenfinalarabic", '\xFEB2')+  ,("seeninitialarabic", '\xFEB3')+  ,("seenmedialarabic", '\xFEB4')+  ,("segol", '\x05B6')+  ,("segol13", '\x05B6')+  ,("segol1f", '\x05B6')+  ,("segol2c", '\x05B6')+  ,("segolhebrew", '\x05B6')+  ,("segolnarrowhebrew", '\x05B6')+  ,("segolquarterhebrew", '\x05B6')+  ,("segoltahebrew", '\x0592')+  ,("segolwidehebrew", '\x05B6')+  ,("seharmenian", '\x057D')+  ,("sehiragana", '\x305B')+  ,("sekatakana", '\x30BB')+  ,("sekatakanahalfwidth", '\xFF7E')+  ,("semicolon", '\x003B')+  ,("semicolonarabic", '\x061B')+  ,("semicolonmonospace", '\xFF1B')+  ,("semicolonsmall", '\xFE54')+  ,("semivoicedmarkkana", '\x309C')+  ,("semivoicedmarkkanahalfwidth", '\xFF9F')+  ,("sentisquare", '\x3322')+  ,("sentosquare", '\x3323')+  ,("seven", '\x0037')+  ,("sevenarabic", '\x0667')+  ,("sevenbengali", '\x09ED')+  ,("sevencircle", '\x2466')+  ,("sevencircleinversesansserif", '\x2790')+  ,("sevendeva", '\x096D')+  ,("seveneighths", '\x215E')+  ,("sevengujarati", '\x0AED')+  ,("sevengurmukhi", '\x0A6D')+  ,("sevenhackarabic", '\x0667')+  ,("sevenhangzhou", '\x3027')+  ,("sevenideographicparen", '\x3226')+  ,("seveninferior", '\x2087')+  ,("sevenmonospace", '\xFF17')+  ,("sevenoldstyle", '\xF737')+  ,("sevenparen", '\x247A')+  ,("sevenperiod", '\x248E')+  ,("sevenpersian", '\x06F7')+  ,("sevenroman", '\x2176')+  ,("sevensuperior", '\x2077')+  ,("seventeencircle", '\x2470')+  ,("seventeenparen", '\x2484')+  ,("seventeenperiod", '\x2498')+  ,("seventhai", '\x0E57')+  ,("sfthyphen", '\x00AD')+  ,("shaarmenian", '\x0577')+  ,("shabengali", '\x09B6')+  ,("shacyrillic", '\x0448')+  ,("shaddaarabic", '\x0651')+  ,("shaddadammaarabic", '\xFC61')+  ,("shaddadammatanarabic", '\xFC5E')+  ,("shaddafathaarabic", '\xFC60')+  ,("shaddafathatanarabic", '\x0651')+  ,("shaddakasraarabic", '\xFC62')+  ,("shaddakasratanarabic", '\xFC5F')+  ,("shade", '\x2592')+  ,("shadedark", '\x2593')+  ,("shadelight", '\x2591')+  ,("shademedium", '\x2592')+  ,("shadeva", '\x0936')+  ,("shagujarati", '\x0AB6')+  ,("shagurmukhi", '\x0A36')+  ,("shalshelethebrew", '\x0593')+  ,("shbopomofo", '\x3115')+  ,("shchacyrillic", '\x0449')+  ,("sheenarabic", '\x0634')+  ,("sheenfinalarabic", '\xFEB6')+  ,("sheeninitialarabic", '\xFEB7')+  ,("sheenmedialarabic", '\xFEB8')+  ,("sheicoptic", '\x03E3')+  ,("sheqel", '\x20AA')+  ,("sheqelhebrew", '\x20AA')+  ,("sheva", '\x05B0')+  ,("sheva115", '\x05B0')+  ,("sheva15", '\x05B0')+  ,("sheva22", '\x05B0')+  ,("sheva2e", '\x05B0')+  ,("shevahebrew", '\x05B0')+  ,("shevanarrowhebrew", '\x05B0')+  ,("shevaquarterhebrew", '\x05B0')+  ,("shevawidehebrew", '\x05B0')+  ,("shhacyrillic", '\x04BB')+  ,("shimacoptic", '\x03ED')+  ,("shin", '\x05E9')+  ,("shindagesh", '\xFB49')+  ,("shindageshhebrew", '\xFB49')+  ,("shindageshshindot", '\xFB2C')+  ,("shindageshshindothebrew", '\xFB2C')+  ,("shindageshsindot", '\xFB2D')+  ,("shindageshsindothebrew", '\xFB2D')+  ,("shindothebrew", '\x05C1')+  ,("shinhebrew", '\x05E9')+  ,("shinshindot", '\xFB2A')+  ,("shinshindothebrew", '\xFB2A')+  ,("shinsindot", '\xFB2B')+  ,("shinsindothebrew", '\xFB2B')+  ,("shook", '\x0282')+  ,("sigma", '\x03C3')+  ,("sigma1", '\x03C2')+  ,("sigmafinal", '\x03C2')+  ,("sigmalunatesymbolgreek", '\x03F2')+  ,("sihiragana", '\x3057')+  ,("sikatakana", '\x30B7')+  ,("sikatakanahalfwidth", '\xFF7C')+  ,("siluqhebrew", '\x05BD')+  ,("siluqlefthebrew", '\x05BD')+  ,("similar", '\x223C')+  ,("sindothebrew", '\x05C2')+  ,("siosacirclekorean", '\x3274')+  ,("siosaparenkorean", '\x3214')+  ,("sioscieuckorean", '\x317E')+  ,("sioscirclekorean", '\x3266')+  ,("sioskiyeokkorean", '\x317A')+  ,("sioskorean", '\x3145')+  ,("siosnieunkorean", '\x317B')+  ,("siosparenkorean", '\x3206')+  ,("siospieupkorean", '\x317D')+  ,("siostikeutkorean", '\x317C')+  ,("six", '\x0036')+  ,("sixarabic", '\x0666')+  ,("sixbengali", '\x09EC')+  ,("sixcircle", '\x2465')+  ,("sixcircleinversesansserif", '\x278F')+  ,("sixdeva", '\x096C')+  ,("sixgujarati", '\x0AEC')+  ,("sixgurmukhi", '\x0A6C')+  ,("sixhackarabic", '\x0666')+  ,("sixhangzhou", '\x3026')+  ,("sixideographicparen", '\x3225')+  ,("sixinferior", '\x2086')+  ,("sixmonospace", '\xFF16')+  ,("sixoldstyle", '\xF736')+  ,("sixparen", '\x2479')+  ,("sixperiod", '\x248D')+  ,("sixpersian", '\x06F6')+  ,("sixroman", '\x2175')+  ,("sixsuperior", '\x2076')+  ,("sixteencircle", '\x246F')+  ,("sixteencurrencydenominatorbengali", '\x09F9')+  ,("sixteenparen", '\x2483')+  ,("sixteenperiod", '\x2497')+  ,("sixthai", '\x0E56')+  ,("slash", '\x002F')+  ,("slashmonospace", '\xFF0F')+  ,("slong", '\x017F')+  ,("slongdotaccent", '\x1E9B')+  ,("smileface", '\x263A')+  ,("smonospace", '\xFF53')+  ,("sofpasuqhebrew", '\x05C3')+  ,("softhyphen", '\x00AD')+  ,("softsigncyrillic", '\x044C')+  ,("sohiragana", '\x305D')+  ,("sokatakana", '\x30BD')+  ,("sokatakanahalfwidth", '\xFF7F')+  ,("soliduslongoverlaycmb", '\x0338')+  ,("solidusshortoverlaycmb", '\x0337')+  ,("sorusithai", '\x0E29')+  ,("sosalathai", '\x0E28')+  ,("sosothai", '\x0E0B')+  ,("sosuathai", '\x0E2A')+  ,("space", '\x0020')+  ,("spacehackarabic", '\x0020')+  ,("spade", '\x2660')+  ,("spadesuitblack", '\x2660')+  ,("spadesuitwhite", '\x2664')+  ,("sparen", '\x24AE')+  ,("squarebelowcmb", '\x033B')+  ,("squarecc", '\x33C4')+  ,("squarecm", '\x339D')+  ,("squarediagonalcrosshatchfill", '\x25A9')+  ,("squarehorizontalfill", '\x25A4')+  ,("squarekg", '\x338F')+  ,("squarekm", '\x339E')+  ,("squarekmcapital", '\x33CE')+  ,("squareln", '\x33D1')+  ,("squarelog", '\x33D2')+  ,("squaremg", '\x338E')+  ,("squaremil", '\x33D5')+  ,("squaremm", '\x339C')+  ,("squaremsquared", '\x33A1')+  ,("squareorthogonalcrosshatchfill", '\x25A6')+  ,("squareupperlefttolowerrightfill", '\x25A7')+  ,("squareupperrighttolowerleftfill", '\x25A8')+  ,("squareverticalfill", '\x25A5')+  ,("squarewhitewithsmallblack", '\x25A3')+  ,("srsquare", '\x33DB')+  ,("ssabengali", '\x09B7')+  ,("ssadeva", '\x0937')+  ,("ssagujarati", '\x0AB7')+  ,("ssangcieuckorean", '\x3149')+  ,("ssanghieuhkorean", '\x3185')+  ,("ssangieungkorean", '\x3180')+  ,("ssangkiyeokkorean", '\x3132')+  ,("ssangnieunkorean", '\x3165')+  ,("ssangpieupkorean", '\x3143')+  ,("ssangsioskorean", '\x3146')+  ,("ssangtikeutkorean", '\x3138')+  ,("ssuperior", '\xF6F2')+  ,("sterling", '\x00A3')+  ,("sterlingmonospace", '\xFFE1')+  ,("strokelongoverlaycmb", '\x0336')+  ,("strokeshortoverlaycmb", '\x0335')+  ,("subset", '\x2282')+  ,("subsetnotequal", '\x228A')+  ,("subsetorequal", '\x2286')+  ,("succeeds", '\x227B')+  ,("suchthat", '\x220B')+  ,("suhiragana", '\x3059')+  ,("sukatakana", '\x30B9')+  ,("sukatakanahalfwidth", '\xFF7D')+  ,("sukunarabic", '\x0652')+  ,("summation", '\x2211')+  ,("sun", '\x263C')+  ,("superset", '\x2283')+  ,("supersetnotequal", '\x228B')+  ,("supersetorequal", '\x2287')+  ,("svsquare", '\x33DC')+  ,("syouwaerasquare", '\x337C')+  ,("t", '\x0074')+  ,("tabengali", '\x09A4')+  ,("tackdown", '\x22A4')+  ,("tackleft", '\x22A3')+  ,("tadeva", '\x0924')+  ,("tagujarati", '\x0AA4')+  ,("tagurmukhi", '\x0A24')+  ,("taharabic", '\x0637')+  ,("tahfinalarabic", '\xFEC2')+  ,("tahinitialarabic", '\xFEC3')+  ,("tahiragana", '\x305F')+  ,("tahmedialarabic", '\xFEC4')+  ,("taisyouerasquare", '\x337D')+  ,("takatakana", '\x30BF')+  ,("takatakanahalfwidth", '\xFF80')+  ,("tatweelarabic", '\x0640')+  ,("tau", '\x03C4')+  ,("tav", '\x05EA')+  ,("tavdages", '\xFB4A')+  ,("tavdagesh", '\xFB4A')+  ,("tavdageshhebrew", '\xFB4A')+  ,("tavhebrew", '\x05EA')+  ,("tbar", '\x0167')+  ,("tbopomofo", '\x310A')+  ,("tcaron", '\x0165')+  ,("tccurl", '\x02A8')+  ,("tcedilla", '\x0163')+  ,("tcheharabic", '\x0686')+  ,("tchehfinalarabic", '\xFB7B')+  ,("tchehinitialarabic", '\xFB7C')+  ,("tchehmedialarabic", '\xFB7D')+  ,("tchehmeeminitialarabic", '\xFB7C')+  ,("tcircle", '\x24E3')+  ,("tcircumflexbelow", '\x1E71')+  ,("tcommaaccent", '\x0163')+  ,("tdieresis", '\x1E97')+  ,("tdotaccent", '\x1E6B')+  ,("tdotbelow", '\x1E6D')+  ,("tecyrillic", '\x0442')+  ,("tedescendercyrillic", '\x04AD')+  ,("teharabic", '\x062A')+  ,("tehfinalarabic", '\xFE96')+  ,("tehhahinitialarabic", '\xFCA2')+  ,("tehhahisolatedarabic", '\xFC0C')+  ,("tehinitialarabic", '\xFE97')+  ,("tehiragana", '\x3066')+  ,("tehjeeminitialarabic", '\xFCA1')+  ,("tehjeemisolatedarabic", '\xFC0B')+  ,("tehmarbutaarabic", '\x0629')+  ,("tehmarbutafinalarabic", '\xFE94')+  ,("tehmedialarabic", '\xFE98')+  ,("tehmeeminitialarabic", '\xFCA4')+  ,("tehmeemisolatedarabic", '\xFC0E')+  ,("tehnoonfinalarabic", '\xFC73')+  ,("tekatakana", '\x30C6')+  ,("tekatakanahalfwidth", '\xFF83')+  ,("telephone", '\x2121')+  ,("telephoneblack", '\x260E')+  ,("telishagedolahebrew", '\x05A0')+  ,("telishaqetanahebrew", '\x05A9')+  ,("tencircle", '\x2469')+  ,("tenideographicparen", '\x3229')+  ,("tenparen", '\x247D')+  ,("tenperiod", '\x2491')+  ,("tenroman", '\x2179')+  ,("tesh", '\x02A7')+  ,("tet", '\x05D8')+  ,("tetdagesh", '\xFB38')+  ,("tetdageshhebrew", '\xFB38')+  ,("tethebrew", '\x05D8')+  ,("tetsecyrillic", '\x04B5')+  ,("tevirhebrew", '\x059B')+  ,("tevirlefthebrew", '\x059B')+  ,("thabengali", '\x09A5')+  ,("thadeva", '\x0925')+  ,("thagujarati", '\x0AA5')+  ,("thagurmukhi", '\x0A25')+  ,("thalarabic", '\x0630')+  ,("thalfinalarabic", '\xFEAC')+  ,("thanthakhatlowleftthai", '\xF898')+  ,("thanthakhatlowrightthai", '\xF897')+  ,("thanthakhatthai", '\x0E4C')+  ,("thanthakhatupperleftthai", '\xF896')+  ,("theharabic", '\x062B')+  ,("thehfinalarabic", '\xFE9A')+  ,("thehinitialarabic", '\xFE9B')+  ,("thehmedialarabic", '\xFE9C')+  ,("thereexists", '\x2203')+  ,("therefore", '\x2234')+  ,("theta", '\x03B8')+  ,("theta1", '\x03D1')+  ,("thetasymbolgreek", '\x03D1')+  ,("thieuthacirclekorean", '\x3279')+  ,("thieuthaparenkorean", '\x3219')+  ,("thieuthcirclekorean", '\x326B')+  ,("thieuthkorean", '\x314C')+  ,("thieuthparenkorean", '\x320B')+  ,("thirteencircle", '\x246C')+  ,("thirteenparen", '\x2480')+  ,("thirteenperiod", '\x2494')+  ,("thonangmonthothai", '\x0E11')+  ,("thook", '\x01AD')+  ,("thophuthaothai", '\x0E12')+  ,("thorn", '\x00FE')+  ,("thothahanthai", '\x0E17')+  ,("thothanthai", '\x0E10')+  ,("thothongthai", '\x0E18')+  ,("thothungthai", '\x0E16')+  ,("thousandcyrillic", '\x0482')+  ,("thousandsseparatorarabic", '\x066C')+  ,("thousandsseparatorpersian", '\x066C')+  ,("three", '\x0033')+  ,("threearabic", '\x0663')+  ,("threebengali", '\x09E9')+  ,("threecircle", '\x2462')+  ,("threecircleinversesansserif", '\x278C')+  ,("threedeva", '\x0969')+  ,("threeeighths", '\x215C')+  ,("threegujarati", '\x0AE9')+  ,("threegurmukhi", '\x0A69')+  ,("threehackarabic", '\x0663')+  ,("threehangzhou", '\x3023')+  ,("threeideographicparen", '\x3222')+  ,("threeinferior", '\x2083')+  ,("threemonospace", '\xFF13')+  ,("threenumeratorbengali", '\x09F6')+  ,("threeoldstyle", '\xF733')+  ,("threeparen", '\x2476')+  ,("threeperiod", '\x248A')+  ,("threepersian", '\x06F3')+  ,("threequarters", '\x00BE')+  ,("threequartersemdash", '\xF6DE')+  ,("threeroman", '\x2172')+  ,("threesuperior", '\x00B3')+  ,("threethai", '\x0E53')+  ,("thzsquare", '\x3394')+  ,("tihiragana", '\x3061')+  ,("tikatakana", '\x30C1')+  ,("tikatakanahalfwidth", '\xFF81')+  ,("tikeutacirclekorean", '\x3270')+  ,("tikeutaparenkorean", '\x3210')+  ,("tikeutcirclekorean", '\x3262')+  ,("tikeutkorean", '\x3137')+  ,("tikeutparenkorean", '\x3202')+  ,("tilde", '\x02DC')+  ,("tildebelowcmb", '\x0330')+  ,("tildecmb", '\x0303')+  ,("tildecomb", '\x0303')+  ,("tildedoublecmb", '\x0360')+  ,("tildeoperator", '\x223C')+  ,("tildeoverlaycmb", '\x0334')+  ,("tildeverticalcmb", '\x033E')+  ,("timescircle", '\x2297')+  ,("tipehahebrew", '\x0596')+  ,("tipehalefthebrew", '\x0596')+  ,("tippigurmukhi", '\x0A70')+  ,("titlocyrilliccmb", '\x0483')+  ,("tiwnarmenian", '\x057F')+  ,("tlinebelow", '\x1E6F')+  ,("tmonospace", '\xFF54')+  ,("toarmenian", '\x0569')+  ,("tohiragana", '\x3068')+  ,("tokatakana", '\x30C8')+  ,("tokatakanahalfwidth", '\xFF84')+  ,("tonebarextrahighmod", '\x02E5')+  ,("tonebarextralowmod", '\x02E9')+  ,("tonebarhighmod", '\x02E6')+  ,("tonebarlowmod", '\x02E8')+  ,("tonebarmidmod", '\x02E7')+  ,("tonefive", '\x01BD')+  ,("tonesix", '\x0185')+  ,("tonetwo", '\x01A8')+  ,("tonos", '\x0384')+  ,("tonsquare", '\x3327')+  ,("topatakthai", '\x0E0F')+  ,("tortoiseshellbracketleft", '\x3014')+  ,("tortoiseshellbracketleftsmall", '\xFE5D')+  ,("tortoiseshellbracketleftvertical", '\xFE39')+  ,("tortoiseshellbracketright", '\x3015')+  ,("tortoiseshellbracketrightsmall", '\xFE5E')+  ,("tortoiseshellbracketrightvertical", '\xFE3A')+  ,("totaothai", '\x0E15')+  ,("tpalatalhook", '\x01AB')+  ,("tparen", '\x24AF')+  ,("trademark", '\x2122')+  ,("trademarksans", '\xF8EA')+  ,("trademarkserif", '\xF6DB')+  ,("tretroflexhook", '\x0288')+  ,("triagdn", '\x25BC')+  ,("triaglf", '\x25C4')+  ,("triagrt", '\x25BA')+  ,("triagup", '\x25B2')+  ,("ts", '\x02A6')+  ,("tsadi", '\x05E6')+  ,("tsadidagesh", '\xFB46')+  ,("tsadidageshhebrew", '\xFB46')+  ,("tsadihebrew", '\x05E6')+  ,("tsecyrillic", '\x0446')+  ,("tsere", '\x05B5')+  ,("tsere12", '\x05B5')+  ,("tsere1e", '\x05B5')+  ,("tsere2b", '\x05B5')+  ,("tserehebrew", '\x05B5')+  ,("tserenarrowhebrew", '\x05B5')+  ,("tserequarterhebrew", '\x05B5')+  ,("tserewidehebrew", '\x05B5')+  ,("tshecyrillic", '\x045B')+  ,("tsuperior", '\xF6F3')+  ,("ttabengali", '\x099F')+  ,("ttadeva", '\x091F')+  ,("ttagujarati", '\x0A9F')+  ,("ttagurmukhi", '\x0A1F')+  ,("tteharabic", '\x0679')+  ,("ttehfinalarabic", '\xFB67')+  ,("ttehinitialarabic", '\xFB68')+  ,("ttehmedialarabic", '\xFB69')+  ,("tthabengali", '\x09A0')+  ,("tthadeva", '\x0920')+  ,("tthagujarati", '\x0AA0')+  ,("tthagurmukhi", '\x0A20')+  ,("tturned", '\x0287')+  ,("tuhiragana", '\x3064')+  ,("tukatakana", '\x30C4')+  ,("tukatakanahalfwidth", '\xFF82')+  ,("tusmallhiragana", '\x3063')+  ,("tusmallkatakana", '\x30C3')+  ,("tusmallkatakanahalfwidth", '\xFF6F')+  ,("twelvecircle", '\x246B')+  ,("twelveparen", '\x247F')+  ,("twelveperiod", '\x2493')+  ,("twelveroman", '\x217B')+  ,("twentycircle", '\x2473')+  ,("twentyhangzhou", '\x5344')+  ,("twentyparen", '\x2487')+  ,("twentyperiod", '\x249B')+  ,("two", '\x0032')+  ,("twoarabic", '\x0662')+  ,("twobengali", '\x09E8')+  ,("twocircle", '\x2461')+  ,("twocircleinversesansserif", '\x278B')+  ,("twodeva", '\x0968')+  ,("twodotenleader", '\x2025')+  ,("twodotleader", '\x2025')+  ,("twodotleadervertical", '\xFE30')+  ,("twogujarati", '\x0AE8')+  ,("twogurmukhi", '\x0A68')+  ,("twohackarabic", '\x0662')+  ,("twohangzhou", '\x3022')+  ,("twoideographicparen", '\x3221')+  ,("twoinferior", '\x2082')+  ,("twomonospace", '\xFF12')+  ,("twonumeratorbengali", '\x09F5')+  ,("twooldstyle", '\xF732')+  ,("twoparen", '\x2475')+  ,("twoperiod", '\x2489')+  ,("twopersian", '\x06F2')+  ,("tworoman", '\x2171')+  ,("twostroke", '\x01BB')+  ,("twosuperior", '\x00B2')+  ,("twothai", '\x0E52')+  ,("twothirds", '\x2154')+  ,("u", '\x0075')+  ,("uacute", '\x00FA')+  ,("ubar", '\x0289')+  ,("ubengali", '\x0989')+  ,("ubopomofo", '\x3128')+  ,("ubreve", '\x016D')+  ,("ucaron", '\x01D4')+  ,("ucircle", '\x24E4')+  ,("ucircumflex", '\x00FB')+  ,("ucircumflexbelow", '\x1E77')+  ,("ucyrillic", '\x0443')+  ,("udattadeva", '\x0951')+  ,("udblacute", '\x0171')+  ,("udblgrave", '\x0215')+  ,("udeva", '\x0909')+  ,("udieresis", '\x00FC')+  ,("udieresisacute", '\x01D8')+  ,("udieresisbelow", '\x1E73')+  ,("udieresiscaron", '\x01DA')+  ,("udieresiscyrillic", '\x04F1')+  ,("udieresisgrave", '\x01DC')+  ,("udieresismacron", '\x01D6')+  ,("udotbelow", '\x1EE5')+  ,("ugrave", '\x00F9')+  ,("ugujarati", '\x0A89')+  ,("ugurmukhi", '\x0A09')+  ,("uhiragana", '\x3046')+  ,("uhookabove", '\x1EE7')+  ,("uhorn", '\x01B0')+  ,("uhornacute", '\x1EE9')+  ,("uhorndotbelow", '\x1EF1')+  ,("uhorngrave", '\x1EEB')+  ,("uhornhookabove", '\x1EED')+  ,("uhorntilde", '\x1EEF')+  ,("uhungarumlaut", '\x0171')+  ,("uhungarumlautcyrillic", '\x04F3')+  ,("uinvertedbreve", '\x0217')+  ,("ukatakana", '\x30A6')+  ,("ukatakanahalfwidth", '\xFF73')+  ,("ukcyrillic", '\x0479')+  ,("ukorean", '\x315C')+  ,("umacron", '\x016B')+  ,("umacroncyrillic", '\x04EF')+  ,("umacrondieresis", '\x1E7B')+  ,("umatragurmukhi", '\x0A41')+  ,("umonospace", '\xFF55')+  ,("underscore", '\x005F')+  ,("underscoredbl", '\x2017')+  ,("underscoremonospace", '\xFF3F')+  ,("underscorevertical", '\xFE33')+  ,("underscorewavy", '\xFE4F')+  ,("union", '\x222A')+  ,("universal", '\x2200')+  ,("uogonek", '\x0173')+  ,("uparen", '\x24B0')+  ,("upblock", '\x2580')+  ,("upperdothebrew", '\x05C4')+  ,("upsilon", '\x03C5')+  ,("upsilondieresis", '\x03CB')+  ,("upsilondieresistonos", '\x03B0')+  ,("upsilonlatin", '\x028A')+  ,("upsilontonos", '\x03CD')+  ,("uptackbelowcmb", '\x031D')+  ,("uptackmod", '\x02D4')+  ,("uragurmukhi", '\x0A73')+  ,("uring", '\x016F')+  ,("ushortcyrillic", '\x045E')+  ,("usmallhiragana", '\x3045')+  ,("usmallkatakana", '\x30A5')+  ,("usmallkatakanahalfwidth", '\xFF69')+  ,("ustraightcyrillic", '\x04AF')+  ,("ustraightstrokecyrillic", '\x04B1')+  ,("utilde", '\x0169')+  ,("utildeacute", '\x1E79')+  ,("utildebelow", '\x1E75')+  ,("uubengali", '\x098A')+  ,("uudeva", '\x090A')+  ,("uugujarati", '\x0A8A')+  ,("uugurmukhi", '\x0A0A')+  ,("uumatragurmukhi", '\x0A42')+  ,("uuvowelsignbengali", '\x09C2')+  ,("uuvowelsigndeva", '\x0942')+  ,("uuvowelsigngujarati", '\x0AC2')+  ,("uvowelsignbengali", '\x09C1')+  ,("uvowelsigndeva", '\x0941')+  ,("uvowelsigngujarati", '\x0AC1')+  ,("v", '\x0076')+  ,("vadeva", '\x0935')+  ,("vagujarati", '\x0AB5')+  ,("vagurmukhi", '\x0A35')+  ,("vakatakana", '\x30F7')+  ,("vav", '\x05D5')+  ,("vavdagesh", '\xFB35')+  ,("vavdagesh65", '\xFB35')+  ,("vavdageshhebrew", '\xFB35')+  ,("vavhebrew", '\x05D5')+  ,("vavholam", '\xFB4B')+  ,("vavholamhebrew", '\xFB4B')+  ,("vavvavhebrew", '\x05F0')+  ,("vavyodhebrew", '\x05F1')+  ,("vcircle", '\x24E5')+  ,("vdotbelow", '\x1E7F')+  ,("vecyrillic", '\x0432')+  ,("veharabic", '\x06A4')+  ,("vehfinalarabic", '\xFB6B')+  ,("vehinitialarabic", '\xFB6C')+  ,("vehmedialarabic", '\xFB6D')+  ,("vekatakana", '\x30F9')+  ,("venus", '\x2640')+  ,("verticalbar", '\x007C')+  ,("verticallineabovecmb", '\x030D')+  ,("verticallinebelowcmb", '\x0329')+  ,("verticallinelowmod", '\x02CC')+  ,("verticallinemod", '\x02C8')+  ,("vewarmenian", '\x057E')+  ,("vhook", '\x028B')+  ,("vikatakana", '\x30F8')+  ,("viramabengali", '\x09CD')+  ,("viramadeva", '\x094D')+  ,("viramagujarati", '\x0ACD')+  ,("visargabengali", '\x0983')+  ,("visargadeva", '\x0903')+  ,("visargagujarati", '\x0A83')+  ,("vmonospace", '\xFF56')+  ,("voarmenian", '\x0578')+  ,("voicediterationhiragana", '\x309E')+  ,("voicediterationkatakana", '\x30FE')+  ,("voicedmarkkana", '\x309B')+  ,("voicedmarkkanahalfwidth", '\xFF9E')+  ,("vokatakana", '\x30FA')+  ,("vparen", '\x24B1')+  ,("vtilde", '\x1E7D')+  ,("vturned", '\x028C')+  ,("vuhiragana", '\x3094')+  ,("vukatakana", '\x30F4')+  ,("w", '\x0077')+  ,("wacute", '\x1E83')+  ,("waekorean", '\x3159')+  ,("wahiragana", '\x308F')+  ,("wakatakana", '\x30EF')+  ,("wakatakanahalfwidth", '\xFF9C')+  ,("wakorean", '\x3158')+  ,("wasmallhiragana", '\x308E')+  ,("wasmallkatakana", '\x30EE')+  ,("wattosquare", '\x3357')+  ,("wavedash", '\x301C')+  ,("wavyunderscorevertical", '\xFE34')+  ,("wawarabic", '\x0648')+  ,("wawfinalarabic", '\xFEEE')+  ,("wawhamzaabovearabic", '\x0624')+  ,("wawhamzaabovefinalarabic", '\xFE86')+  ,("wbsquare", '\x33DD')+  ,("wcircle", '\x24E6')+  ,("wcircumflex", '\x0175')+  ,("wdieresis", '\x1E85')+  ,("wdotaccent", '\x1E87')+  ,("wdotbelow", '\x1E89')+  ,("wehiragana", '\x3091')+  ,("weierstrass", '\x2118')+  ,("wekatakana", '\x30F1')+  ,("wekorean", '\x315E')+  ,("weokorean", '\x315D')+  ,("wgrave", '\x1E81')+  ,("whitebullet", '\x25E6')+  ,("whitecircle", '\x25CB')+  ,("whitecircleinverse", '\x25D9')+  ,("whitecornerbracketleft", '\x300E')+  ,("whitecornerbracketleftvertical", '\xFE43')+  ,("whitecornerbracketright", '\x300F')+  ,("whitecornerbracketrightvertical", '\xFE44')+  ,("whitediamond", '\x25C7')+  ,("whitediamondcontainingblacksmalldiamond", '\x25C8')+  ,("whitedownpointingsmalltriangle", '\x25BF')+  ,("whitedownpointingtriangle", '\x25BD')+  ,("whiteleftpointingsmalltriangle", '\x25C3')+  ,("whiteleftpointingtriangle", '\x25C1')+  ,("whitelenticularbracketleft", '\x3016')+  ,("whitelenticularbracketright", '\x3017')+  ,("whiterightpointingsmalltriangle", '\x25B9')+  ,("whiterightpointingtriangle", '\x25B7')+  ,("whitesmallsquare", '\x25AB')+  ,("whitesmilingface", '\x263A')+  ,("whitesquare", '\x25A1')+  ,("whitestar", '\x2606')+  ,("whitetelephone", '\x260F')+  ,("whitetortoiseshellbracketleft", '\x3018')+  ,("whitetortoiseshellbracketright", '\x3019')+  ,("whiteuppointingsmalltriangle", '\x25B5')+  ,("whiteuppointingtriangle", '\x25B3')+  ,("wihiragana", '\x3090')+  ,("wikatakana", '\x30F0')+  ,("wikorean", '\x315F')+  ,("wmonospace", '\xFF57')+  ,("wohiragana", '\x3092')+  ,("wokatakana", '\x30F2')+  ,("wokatakanahalfwidth", '\xFF66')+  ,("won", '\x20A9')+  ,("wonmonospace", '\xFFE6')+  ,("wowaenthai", '\x0E27')+  ,("wparen", '\x24B2')+  ,("wring", '\x1E98')+  ,("wsuperior", '\x02B7')+  ,("wturned", '\x028D')+  ,("wynn", '\x01BF')+  ,("x", '\x0078')+  ,("xabovecmb", '\x033D')+  ,("xbopomofo", '\x3112')+  ,("xcircle", '\x24E7')+  ,("xdieresis", '\x1E8D')+  ,("xdotaccent", '\x1E8B')+  ,("xeharmenian", '\x056D')+  ,("xi", '\x03BE')+  ,("xmonospace", '\xFF58')+  ,("xparen", '\x24B3')+  ,("xsuperior", '\x02E3')+  ,("y", '\x0079')+  ,("yaadosquare", '\x334E')+  ,("yabengali", '\x09AF')+  ,("yacute", '\x00FD')+  ,("yadeva", '\x092F')+  ,("yaekorean", '\x3152')+  ,("yagujarati", '\x0AAF')+  ,("yagurmukhi", '\x0A2F')+  ,("yahiragana", '\x3084')+  ,("yakatakana", '\x30E4')+  ,("yakatakanahalfwidth", '\xFF94')+  ,("yakorean", '\x3151')+  ,("yamakkanthai", '\x0E4E')+  ,("yasmallhiragana", '\x3083')+  ,("yasmallkatakana", '\x30E3')+  ,("yasmallkatakanahalfwidth", '\xFF6C')+  ,("yatcyrillic", '\x0463')+  ,("ycircle", '\x24E8')+  ,("ycircumflex", '\x0177')+  ,("ydieresis", '\x00FF')+  ,("ydotaccent", '\x1E8F')+  ,("ydotbelow", '\x1EF5')+  ,("yeharabic", '\x064A')+  ,("yehbarreearabic", '\x06D2')+  ,("yehbarreefinalarabic", '\xFBAF')+  ,("yehfinalarabic", '\xFEF2')+  ,("yehhamzaabovearabic", '\x0626')+  ,("yehhamzaabovefinalarabic", '\xFE8A')+  ,("yehhamzaaboveinitialarabic", '\xFE8B')+  ,("yehhamzaabovemedialarabic", '\xFE8C')+  ,("yehinitialarabic", '\xFEF3')+  ,("yehmedialarabic", '\xFEF4')+  ,("yehmeeminitialarabic", '\xFCDD')+  ,("yehmeemisolatedarabic", '\xFC58')+  ,("yehnoonfinalarabic", '\xFC94')+  ,("yehthreedotsbelowarabic", '\x06D1')+  ,("yekorean", '\x3156')+  ,("yen", '\x00A5')+  ,("yenmonospace", '\xFFE5')+  ,("yeokorean", '\x3155')+  ,("yeorinhieuhkorean", '\x3186')+  ,("yerahbenyomohebrew", '\x05AA')+  ,("yerahbenyomolefthebrew", '\x05AA')+  ,("yericyrillic", '\x044B')+  ,("yerudieresiscyrillic", '\x04F9')+  ,("yesieungkorean", '\x3181')+  ,("yesieungpansioskorean", '\x3183')+  ,("yesieungsioskorean", '\x3182')+  ,("yetivhebrew", '\x059A')+  ,("ygrave", '\x1EF3')+  ,("yhook", '\x01B4')+  ,("yhookabove", '\x1EF7')+  ,("yiarmenian", '\x0575')+  ,("yicyrillic", '\x0457')+  ,("yikorean", '\x3162')+  ,("yinyang", '\x262F')+  ,("yiwnarmenian", '\x0582')+  ,("ymonospace", '\xFF59')+  ,("yod", '\x05D9')+  ,("yoddagesh", '\xFB39')+  ,("yoddageshhebrew", '\xFB39')+  ,("yodhebrew", '\x05D9')+  ,("yodyodhebrew", '\x05F2')+  ,("yodyodpatahhebrew", '\xFB1F')+  ,("yohiragana", '\x3088')+  ,("yoikorean", '\x3189')+  ,("yokatakana", '\x30E8')+  ,("yokatakanahalfwidth", '\xFF96')+  ,("yokorean", '\x315B')+  ,("yosmallhiragana", '\x3087')+  ,("yosmallkatakana", '\x30E7')+  ,("yosmallkatakanahalfwidth", '\xFF6E')+  ,("yotgreek", '\x03F3')+  ,("yoyaekorean", '\x3188')+  ,("yoyakorean", '\x3187')+  ,("yoyakthai", '\x0E22')+  ,("yoyingthai", '\x0E0D')+  ,("yparen", '\x24B4')+  ,("ypogegrammeni", '\x037A')+  ,("ypogegrammenigreekcmb", '\x0345')+  ,("yr", '\x01A6')+  ,("yring", '\x1E99')+  ,("ysuperior", '\x02B8')+  ,("ytilde", '\x1EF9')+  ,("yturned", '\x028E')+  ,("yuhiragana", '\x3086')+  ,("yuikorean", '\x318C')+  ,("yukatakana", '\x30E6')+  ,("yukatakanahalfwidth", '\xFF95')+  ,("yukorean", '\x3160')+  ,("yusbigcyrillic", '\x046B')+  ,("yusbigiotifiedcyrillic", '\x046D')+  ,("yuslittlecyrillic", '\x0467')+  ,("yuslittleiotifiedcyrillic", '\x0469')+  ,("yusmallhiragana", '\x3085')+  ,("yusmallkatakana", '\x30E5')+  ,("yusmallkatakanahalfwidth", '\xFF6D')+  ,("yuyekorean", '\x318B')+  ,("yuyeokorean", '\x318A')+  ,("yyabengali", '\x09DF')+  ,("yyadeva", '\x095F')+  ,("z", '\x007A')+  ,("zaarmenian", '\x0566')+  ,("zacute", '\x017A')+  ,("zadeva", '\x095B')+  ,("zagurmukhi", '\x0A5B')+  ,("zaharabic", '\x0638')+  ,("zahfinalarabic", '\xFEC6')+  ,("zahinitialarabic", '\xFEC7')+  ,("zahiragana", '\x3056')+  ,("zahmedialarabic", '\xFEC8')+  ,("zainarabic", '\x0632')+  ,("zainfinalarabic", '\xFEB0')+  ,("zakatakana", '\x30B6')+  ,("zaqefgadolhebrew", '\x0595')+  ,("zaqefqatanhebrew", '\x0594')+  ,("zarqahebrew", '\x0598')+  ,("zayin", '\x05D6')+  ,("zayindagesh", '\xFB36')+  ,("zayindageshhebrew", '\xFB36')+  ,("zayinhebrew", '\x05D6')+  ,("zbopomofo", '\x3117')+  ,("zcaron", '\x017E')+  ,("zcircle", '\x24E9')+  ,("zcircumflex", '\x1E91')+  ,("zcurl", '\x0291')+  ,("zdot", '\x017C')+  ,("zdotaccent", '\x017C')+  ,("zdotbelow", '\x1E93')+  ,("zecyrillic", '\x0437')+  ,("zedescendercyrillic", '\x0499')+  ,("zedieresiscyrillic", '\x04DF')+  ,("zehiragana", '\x305C')+  ,("zekatakana", '\x30BC')+  ,("zero", '\x0030')+  ,("zeroarabic", '\x0660')+  ,("zerobengali", '\x09E6')+  ,("zerodeva", '\x0966')+  ,("zerogujarati", '\x0AE6')+  ,("zerogurmukhi", '\x0A66')+  ,("zerohackarabic", '\x0660')+  ,("zeroinferior", '\x2080')+  ,("zeromonospace", '\xFF10')+  ,("zerooldstyle", '\xF730')+  ,("zeropersian", '\x06F0')+  ,("zerosuperior", '\x2070')+  ,("zerothai", '\x0E50')+  ,("zerowidthjoiner", '\xFEFF')+  ,("zerowidthnonjoiner", '\x200C')+  ,("zerowidthspace", '\x200B')+  ,("zeta", '\x03B6')+  ,("zhbopomofo", '\x3113')+  ,("zhearmenian", '\x056A')+  ,("zhebrevecyrillic", '\x04C2')+  ,("zhecyrillic", '\x0436')+  ,("zhedescendercyrillic", '\x0497')+  ,("zhedieresiscyrillic", '\x04DD')+  ,("zihiragana", '\x3058')+  ,("zikatakana", '\x30B8')+  ,("zinorhebrew", '\x05AE')+  ,("zlinebelow", '\x1E95')+  ,("zmonospace", '\xFF5A')+  ,("zohiragana", '\x305E')+  ,("zokatakana", '\x30BE')+  ,("zparen", '\x24B5')+  ,("zretroflexhook", '\x0290')+  ,("zstroke", '\x01B6')+  ,("zuhiragana", '\x305A')+  ,("zukatakana", '\x30BA')+  ]
+ lib/Pdf/Content/Ops.hs view
@@ -0,0 +1,196 @@+{-# LANGUAGE OverloadedStrings #-}++-- | Content stream operators++module Pdf.Content.Ops+(+  Op(..),+  Expr(..),+  Operator,+  toOp+)+where++import Pdf.Core++import Data.ByteString (ByteString)++-- | Operator with arguments+type Operator = (Op, [Object])++-- | Content stream operators+data Op+  -- | Graphics State Operators+  = Op_q+  | Op_Q+  | Op_cm+  | Op_w+  | Op_J+  | Op_j+  | Op_M+  | Op_d+  | Op_ri+  | Op_i+  | Op_gs+  -- | Path Construction Operators+  | Op_m+  | Op_l+  | Op_c+  | Op_v+  | Op_y+  | Op_h+  | Op_re+  -- | Path Painting Operators+  | Op_S+  | Op_s+  | Op_f+  | Op_F+  | Op_f_star+  | Op_B+  | Op_B_star+  | Op_b+  | Op_b_star+  | Op_n+  -- | Clipping Path Operators+  | Op_W+  | Op_W_star+  -- | Text Object Operators+  | Op_BT+  | Op_ET+  -- | Text State Operators+  | Op_Tc+  | Op_Tw+  | Op_Tz+  | Op_TL+  | Op_Tf+  | Op_Tr+  | Op_Ts+  -- | Text Positioning Operators+  | Op_Td+  | Op_TD+  | Op_Tm+  | Op_T_star+  -- | Text Showing Operators+  | Op_Tj+  | Op_apostrophe+  | Op_quote+  | Op_TJ+  -- | Type 3 Font Operators+  | Op_d0+  | Op_d1+  -- | Color Operators+  | Op_CS+  | Op_cs+  | Op_SC+  | Op_SCN+  | Op_sc+  | Op_scn+  | Op_G+  | Op_g+  | Op_RG+  | Op_rg+  | Op_K+  | Op_k+  -- | Shading Operator+  | Op_sh+  -- | Inline Image Operators+  | Op_BI+  | Op_ID+  | Op_EI+  -- | XObject Operator+  | Op_Do+  -- | Marked Content Operators+  | Op_MP+  | Op_DP+  | Op_BMC+  | Op_BDC+  | Op_EMC+  -- | Compatibility Operators+  | Op_BX+  | Op_EX+  -- | Unknown+  | UnknownOp ByteString+  deriving (Show, Eq)++-- | Expression is a regular objects or an operators+data Expr+  = Obj Object+  | Op Op+  deriving (Show, Eq)++-- | Conversion to operator+toOp :: ByteString -> Op+toOp "q" = Op_q+toOp "Q" = Op_Q+toOp "cm" = Op_cm+toOp "w" = Op_w+toOp "J" = Op_J+toOp "j" = Op_j+toOp "M" = Op_M+toOp "d" = Op_d+toOp "ri" = Op_ri+toOp "i" = Op_i+toOp "gs" = Op_gs+toOp "m" = Op_m+toOp "l" = Op_l+toOp "c" = Op_c+toOp "v" = Op_v+toOp "y" = Op_y+toOp "h" = Op_h+toOp "re" = Op_re+toOp "S" = Op_S+toOp "s" = Op_s+toOp "f" = Op_f+toOp "F" = Op_F+toOp "f*" = Op_f_star+toOp "B" = Op_B+toOp "B*" = Op_B_star+toOp "b" = Op_b+toOp "b*" = Op_b_star+toOp "n" = Op_n+toOp "W" = Op_W+toOp "W*" = Op_W_star+toOp "BT" = Op_BT+toOp "ET" = Op_ET+toOp "Tc" = Op_Tc+toOp "Tw" = Op_Tw+toOp "Tz" = Op_Tz+toOp "TL" = Op_TL+toOp "Tf" = Op_Tf+toOp "Tr" = Op_Tr+toOp "Ts" = Op_Ts+toOp "Td" = Op_Td+toOp "TD" = Op_TD+toOp "Tm" = Op_Tm+toOp "T*" = Op_T_star+toOp "Tj" = Op_Tj+toOp "'" = Op_apostrophe+toOp "\"" = Op_quote+toOp "TJ" = Op_TJ+toOp "d0" = Op_d0+toOp "d1" = Op_d1+toOp "CS" = Op_CS+toOp "cs" = Op_cs+toOp "SC" = Op_SC+toOp "SCN" = Op_SCN+toOp "sc" = Op_sc+toOp "scn" = Op_scn+toOp "G" = Op_G+toOp "g" = Op_g+toOp "RG" = Op_RG+toOp "rg" = Op_rg+toOp "K" = Op_K+toOp "k" = Op_k+toOp "sh" = Op_sh+toOp "BI" = Op_BI+toOp "ID" = Op_ID+toOp "EI" = Op_EI+toOp "Do" = Op_Do+toOp "MP" = Op_MP+toOp "DP" = Op_DP+toOp "BMC" = Op_BMC+toOp "BDC" = Op_BDC+toOp "EMC" = Op_EMC+toOp "BX" = Op_BX+toOp "EX" = Op_EX+toOp str = UnknownOp str
+ lib/Pdf/Content/Parser.hs view
@@ -0,0 +1,55 @@++-- | Parse content stream++module Pdf.Content.Parser+(+  readNextOperator,+  parseContent,+)+where++import Pdf.Core.Exception+import Pdf.Core.Parsers.Object++import Pdf.Content.Ops++import Data.Attoparsec.ByteString.Char8 (Parser)+import qualified Data.Attoparsec.ByteString.Char8 as Parser+import Control.Applicative+import Control.Monad+import Control.Exception hiding (throw)+import System.IO.Streams (InputStream)+import qualified System.IO.Streams as Streams+import qualified System.IO.Streams.Attoparsec as Streams++-- | Read the next operator if any+readNextOperator :: InputStream Expr -> IO (Maybe Operator)+readNextOperator is = message "readNextOperator" $ go []+  where+  go args = do+    expr <- Streams.read is+      -- XXX: it should be handled by stream creator+      `catch` \(Streams.ParseException msg) -> throwIO (Corrupted msg [])+    case expr of+      Nothing -> case args of+                   [] -> return Nothing+                   _ -> throwIO $ Corrupted ("Args without op: " ++ show args) []+      Just (Obj o) -> go (o : args)+      Just (Op o) -> return $ Just (o, reverse args)++-- | Parser expression in a content stream+parseContent :: Parser (Maybe Expr)+parseContent = do+  skipSpace+  (Parser.endOfInput >> return Nothing) <|>+    fmap Just (fmap Obj parseObject <|>+               fmap (Op . toOp) (Parser.takeWhile1 isRegularChar))++-- Treat comments as spaces+skipSpace :: Parser ()+skipSpace = do+  Parser.skipSpace+  void $ many $ do+    _ <- Parser.char '%'+    Parser.skipWhile $ \c -> c /= '\n' && c /= '\r'+    Parser.skipSpace
+ lib/Pdf/Content/Processor.hs view
@@ -0,0 +1,354 @@+{-# LANGUAGE OverloadedStrings #-}++-- | Process content stream operators maintaining graphics state+--+-- It is pretty experimental++module Pdf.Content.Processor+(+  Processor(..),+  GraphicsState(..),+  GlyphDecoder,+  Glyph(..),+  Span(..),+  initialGraphicsState,+  mkProcessor,+  processOp+)+where++import Pdf.Core+import Pdf.Core.Object.Util+import Pdf.Core.Util++import Pdf.Content.Ops+import Pdf.Content.Transform++import Data.ByteString (ByteString)+import Data.Text (Text)+import qualified Data.Scientific as Scientific+import qualified Data.Vector as Vector+import Control.Monad++-- | Given font name and string, it should return list of glyphs+-- and their widths.+--+-- Note: it should not try to position or scale glyphs to user space,+-- bounding boxes should be defined in glyph space.+--+-- Note: glyph width is a distance between the glyph's origin and+-- the next glyph's origin, so it generally can't be calculated+-- from bounding box+--+-- Note: the 'Processor' actually doesn't cares about glyph's+-- bounding box, so you can return anything you want+type GlyphDecoder = Name -> ByteString -> [(Glyph, Double)]++-- | Glyph+data Glyph = Glyph {+  -- | The code as read from content stream+  glyphCode :: Int,+  -- | Top-left corner of glyph's bounding box+  glyphTopLeft :: Vector Double,+  -- | Bottom-right corner of glyph's bounding box+  glyphBottomRight :: Vector Double,+  -- | Text ectracted from the glyph+  glyphText :: Maybe Text+  }+  deriving Show++-- | Graphics state+data GraphicsState = GraphicsState {+  gsInText :: Bool,    -- ^ Indicates that we are inside text object+  gsCurrentTransformMatrix :: Transform Double,+  gsFont :: Maybe Name,+  gsFontSize :: Maybe Double,+  gsTextMatrix :: Transform Double,      -- ^ Defined only inside text object+  gsTextLineMatrix :: Transform Double,  -- ^ Defined only inside text object+  gsTextLeading :: Double,+  gsTextCharSpacing :: Double,+  gsTextWordSpacing :: Double+  }+  deriving Show++-- | Empty graphics state+initialGraphicsState :: GraphicsState+initialGraphicsState = GraphicsState {+  gsInText = False,+  gsCurrentTransformMatrix = identity,+  gsFont = Nothing,+  gsFontSize = Nothing,+  gsTextMatrix = identity,+  gsTextLineMatrix = identity,+  gsTextLeading = 0,+  gsTextCharSpacing = 0,+  gsTextWordSpacing = 0+  }++-- | Glyphs drawn in one shot+data Span = Span+  { spGlyphs :: [Glyph]+  , spFontName :: Name+  }++-- | Processor maintains graphics state+data Processor = Processor {+  prState :: GraphicsState,+  prStateStack :: [GraphicsState],+  prGlyphDecoder :: GlyphDecoder,+  prSpans :: [Span]+  -- ^ Each element is a list of glyphs, drawn in one shot+  }++-- | Create processor in initial state+mkProcessor :: Processor+mkProcessor = Processor {+  prState = initialGraphicsState,+  prStateStack = [],+  prGlyphDecoder = \_ _ -> [],+  prSpans = mempty+  }++-- | Process one operation+processOp :: Operator -> Processor -> Either String Processor++processOp (Op_q, []) p = Right p {prStateStack = prState p : prStateStack p}+processOp (Op_q, args) _ = Left ("Op_q: wrong number of arguments: "+                                ++ show args)++processOp (Op_Q, []) p =+  case prStateStack p of+    [] -> Left "Op_Q: state is empty"+    (x:xs) -> Right p {prState = x, prStateStack = xs}+processOp (Op_Q, args) _ = Left ("Op_Q: wrong number of arguments: "+                                ++ show args)++processOp (Op_BT, []) p = do+  ensureInTextObject False p+  let gstate = prState p+  return p {prState = gstate {+    gsInText = True,+    gsTextMatrix = identity,+    gsTextLineMatrix = identity+    }}+processOp (Op_BT, args) _ = Left ("Op_BT: wrong number of arguments: "+                                  ++ show args)++processOp (Op_ET, []) p = do+  ensureInTextObject True p+  let gstate = prState p+  return p {prState = gstate {+    gsInText = False+    }}+processOp (Op_ET, args) _ = Left ("Op_ET: wrong number of arguments: "+                                  ++ show args)++processOp (Op_Td, [txo, tyo]) p = do+  ensureInTextObject True p+  tx <- realValue txo `notice` "Td: x should be a real value"+  ty <- realValue tyo `notice` "Td: y should be a real value"+  let gstate = prState p+      tm = translate tx ty $ gsTextLineMatrix gstate+  Right p {prState = gstate {+    gsTextMatrix = tm,+    gsTextLineMatrix = tm+    }}+processOp (Op_Td, args) _ = Left ("Op_Td: wrong number of arguments: "+                                  ++ show args)++processOp (Op_TD, [txo, tyo]) p = do+  l <- realValue tyo `notice` "TD: y should be a real value"+  p' <- processOp (Op_TL, [Number $ Scientific.fromFloatDigits $ negate l]) p+  processOp (Op_Td, [txo, tyo]) p'+processOp (Op_TD, args) _ = Left ("Op_TD: wrong number of arguments: "+                                  ++ show args)++processOp (Op_Tm, [a', b', c', d', e', f']) p = do+  ensureInTextObject True p+  a <- realValue a' `notice` "Tm: a should be a real value"+  b <- realValue b' `notice` "Tm: b should be a real value"+  c <- realValue c' `notice` "Tm: c should be a real value"+  d <- realValue d' `notice` "Tm: d should be a real value"+  e <- realValue e' `notice` "Tm: e should be a real value"+  f <- realValue f' `notice` "Tm: f should be a real value"+  let gstate = prState p+      tm = Transform a b c d e f+  return p {prState = gstate {+    gsTextMatrix = tm,+    gsTextLineMatrix = tm+    }}+processOp (Op_Tm, args) _ = Left ("Op_Tm: wrong number of arguments: "+                                  ++ show args)++processOp (Op_T_star, []) p = do+  ensureInTextObject True p+  let gstate = prState p+      l = gsTextLeading gstate+  processOp (Op_TD, map (Number . Scientific.fromFloatDigits) [0, negate l]) p+processOp (Op_T_star, args) _ = Left ("Op_T_star: wrong number of arguments: "+                                      ++ show args)++processOp (Op_TL, [lo]) p = do+  l <- realValue lo `notice` "TL: l should be a real value"+  let gstate = prState p+  return p {prState = gstate {+    gsTextLeading = l+    }}+processOp (Op_TL, args) _ = Left ("Op_TL: wrong number of arguments: "+                                  ++ show args)++processOp (Op_cm, [a', b', c', d', e', f']) p = do+  a <- realValue a' `notice` "cm: a should be a real value"+  b <- realValue b' `notice` "cm: b should be a real value"+  c <- realValue c' `notice` "cm: c should be a real value"+  d <- realValue d' `notice` "cm: d should be a real value"+  e <- realValue e' `notice` "cm: e should be a real value"+  f <- realValue f' `notice` "cm: f should be a real value"+  let gstate = prState p+      ctm = Transform a b c d e f `multiply` gsCurrentTransformMatrix gstate+  return p {prState = gstate {+    gsCurrentTransformMatrix = ctm+    }}+processOp (Op_cm, args) _ = Left ("Op_cm: wrong number of arguments: "+                                  ++ show args)++processOp (Op_Tf, [fontO, szO]) p = do+  font <- nameValue fontO `notice` "Tf: font should be a name"+  sz <- realValue szO `notice` "Tf: size should be a real value"+  let gstate = prState p+  return p {prState = gstate {+    gsFont = Just font,+    gsFontSize = Just sz+    }}+processOp (Op_Tf, args) _ = Left ("Op_Tf: wrong number of agruments: "+                                  ++ show args)++processOp (Op_Tj, [String str]) p = do+  let gstate = prState p+  fontName <-+    case gsFont gstate of+      Nothing -> Left "Op_Tj: font not set"+      Just fn -> return fn+  fontSize <-+    case gsFontSize gstate of+      Nothing -> Left "Op_Tj: font size not set"+      Just fs -> return fs+  let (tm, glyphs) = positionGlyghs+                       fontSize+                       (gsCurrentTransformMatrix gstate)+                       (gsTextMatrix gstate)+                       (gsTextCharSpacing gstate)+                       (gsTextWordSpacing gstate)+                       (prGlyphDecoder p fontName str)+  let sp = Span+        { spGlyphs = glyphs+        , spFontName = fontName+        }+  return p {+    prSpans = sp : prSpans p,+    prState = gstate {+      gsTextMatrix = tm+      }+    }+processOp (Op_Tj, args) _ = Left ("Op_Tj: wrong number of agruments:"+                                  ++ show args)++processOp (Op_TJ, [Array array]) p = do+  let gstate = prState p+  fontName <-+    case gsFont gstate of+      Nothing -> Left "Op_Tj: font not set"+      Just fn -> return fn+  fontSize <-+    case gsFontSize gstate of+      Nothing -> Left "Op_Tj: font size not set"+      Just fs -> return fs+  let (textMatrix, glyphs) = loop (gsTextMatrix gstate) []+                                  (Vector.toList array)+        where+        loop tm res [] = (tm, reverse res)+        loop tm res (String str : rest) =+          let (tm', gs) = positionGlyghs fontSize+                                         (gsCurrentTransformMatrix gstate)+                                         tm+                                         (gsTextCharSpacing gstate)+                                         (gsTextWordSpacing gstate)+                                         (prGlyphDecoder p fontName str)+          in loop tm' (gs : res) rest+        loop tm res (Number n : rest) =+          let d = Scientific.toRealFloat n+          in loop (translate (-d * fontSize / 1000) 0 tm) res rest+        loop tm res (_:rest) = loop tm res rest++  let mkSpan gs = Span+        { spGlyphs = gs+        , spFontName = fontName+        }+  return p {+    prSpans = reverse (map mkSpan glyphs) ++ prSpans p,+    prState = gstate {+      gsTextMatrix = textMatrix+      }+    }+processOp (Op_TJ, args) _ = Left ("Op_TJ: wrong number of agruments:"+                                  ++ show args)++processOp (Op_Tc, [o]) p = do+  spacing <- realValue o `notice` "Tc: spacing should be a real value"+  let gstate = prState p+  return p {+    prState = gstate {+      gsTextCharSpacing = spacing+      }+    }+processOp (Op_Tc, args) _ = Left ("Op_Tc: wrong number of agruments:"+                                  ++ show args)++processOp (Op_Tw, [o]) p = do+  spacing <- realValue o `notice` "Tw: spacing should be a real value"+  let gstate = prState p+  return p {+    prState = gstate {+      gsTextWordSpacing = spacing+      }+    }+processOp (Op_Tw, args) _ = Left ("Op_Tw: wrong number of agruments:"+                                  ++ show args)++processOp (Op_apostrophe, [o]) p = do+  p' <- processOp (Op_T_star, []) p+  processOp (Op_Tj, [o]) p'+processOp (Op_apostrophe, args) _ =+  Left ("Op_apostrophe: wrong number of agruments:" ++ show args)++processOp _ p = return p++ensureInTextObject :: Bool -> Processor -> Either String ()+ensureInTextObject inText p =+  unless (inText == gsInText (prState p)) $+    Left $ "ensureInTextObject: expected: " ++ show inText ++ ", found: "+          ++ show (gsInText $ prState p)++positionGlyghs :: Double+               -> Transform Double+               -> Transform Double+               -> Double+               -> Double+               -> [(Glyph, Double)]+               -> (Transform Double, [Glyph])+positionGlyghs fontSize ctm textMatrix charSpacing wordSpacing+  = go textMatrix []+  where+  go tm res [] = (tm, reverse res)+  go tm res ((g, width):gs) =+    let g' = g {+          glyphTopLeft = transform (multiply tm ctm) topLeft,+          glyphBottomRight = transform (multiply tm ctm) bottomRight+          }+        topLeft = transform (scale fontSize fontSize) $ glyphTopLeft g+        bottomRight = transform (scale fontSize fontSize) $ glyphBottomRight g+        spacing = charSpacing + case glyphText g of+                                  Just " " -> wordSpacing+                                  _ -> 0+        tm' = translate (width * fontSize + spacing) 0 tm+    in go tm' (g':res) gs
+ lib/Pdf/Content/TexGlyphList.hs view
@@ -0,0 +1,304 @@+{-# LANGUAGE OverloadedStrings #-}++-- | Mapping from glyph names to unicode characters+-- for TeX fonts++module Pdf.Content.TexGlyphList+(+  texGlyphList+)+where++import Data.ByteString (ByteString)+import Data.Map (Map)+import qualified Data.Map as Map++-- | Glyph list+texGlyphList :: Map ByteString Char+texGlyphList = Map.fromList+  [("Delta", '\x2206')+  ,("Ifractur", '\x2111')+  ,("FFsmall", '\xF766')+  ,("FFIsmall", '\xF766')+  ,("FFLsmall", '\xF766')+  ,("FIsmall", '\xF766')+  ,("FLsmall", '\xF766')+  ,("Germandbls", '\x0053')+  ,("Germandblssmall", '\xF773')+  ,("Ng", '\x014A')+  ,("Omega", '\x2126')+  ,("Rfractur", '\x211C')+  ,("SS", '\x0053')+  ,("SSsmall", '\xF773')+  ,("altselector", '\xD802')+  ,("angbracketleft", '\x27E8')+  ,("angbracketright", '\x27E9')+  ,("arrowbothv", '\x2195')+  ,("arrowdblbothv", '\x21D5')+  ,("arrowleftbothalf", '\x21BD')+  ,("arrowlefttophalf", '\x21BC')+  ,("arrownortheast", '\x2197')+  ,("arrownorthwest", '\x2196')+  ,("arrowrightbothalf", '\x21C1')+  ,("arrowrighttophalf", '\x21C0')+  ,("arrowsoutheast", '\x2198')+  ,("arrowsouthwest", '\x2199')+  ,("ascendercompwordmark", '\xD80A')+  ,("asteriskcentered", '\x2217')+  ,("bardbl", '\x2225')+  ,("capitalcompwordmark", '\xD809')+  ,("ceilingleft", '\x2308')+  ,("ceilingright", '\x2309')+  ,("circlecopyrt", '\x20DD')+  ,("circledivide", '\x2298')+  ,("circledot", '\x2299')+  ,("circleminus", '\x2296')+  ,("coproduct", '\x2A3F')+  ,("ct", '\x0063')+  ,("cwm", '\x200C')+  ,("dblbracketleft", '\x27E6')+  ,("dblbracketright", '\x27E7')+  ,("diamond", '\x2662')+  ,("diamondmath", '\x22C4')+  ,("dotlessj", '\x0237')+  ,("emptyset", '\x2205')+  ,("emptyslot", '\xD801')+  ,("epsilon1", '\x03F5')+  ,("epsiloninv", '\x03F6')+  ,("equivasymptotic", '\x224D')+  ,("flat", '\x266D')+  ,("floorleft", '\x230A')+  ,("floorright", '\x230B')+  ,("follows", '\x227B')+  ,("followsequal", '\x2AB0')+  ,("followsorcurly", '\x227D')+  ,("greatermuch", '\x226B')+  ,("heart", '\x2661')+  ,("interrobang", '\x203D')+  ,("interrobangdown", '\x2E18')+  ,("intersectionsq", '\x2293')+  ,("latticetop", '\x22A4')+  ,("lessmuch", '\x226A')+  ,("longdbls", '\x017F')+  ,("longsh", '\x017F')+  ,("longsi", '\x017F')+  ,("longsl", '\x017F')+  ,("longst", '\xFB05')+  ,("lscript", '\x2113')+  ,("natural", '\x266E')+  ,("negationslash", '\x0338')+  ,("ng", '\x014B')+  ,("owner", '\x220B')+  ,("pertenthousand", '\x2031')+  ,("phi", '\x03D5')+  ,("phi1", '\x03C6')+  ,("pi1", '\x03D6')+  ,("precedesequal", '\x2AAF')+  ,("precedesorcurly", '\x227C')+  ,("prime", '\x2032')+  ,("rho1", '\x03F1')+  ,("ringfitted", '\xD80D')+  ,("sharp", '\x266F')+  ,("similarequal", '\x2243')+  ,("slurabove", '\x2322')+  ,("slurbelow", '\x2323')+  ,("st", '\xFB06')+  ,("star", '\x22C6')+  ,("subsetsqequal", '\x2291')+  ,("supersetsqequal", '\x2292')+  ,("triangle", '\x25B3')+  ,("triangleinv", '\x25BD')+  ,("triangleleft", '\x25C1')+  ,("triangleright", '\x25B7')+  ,("turnstileleft", '\x22A2')+  ,("turnstileright", '\x22A3')+  ,("twelveudash", '\xD80C')+  ,("unionmulti", '\x228E')+  ,("unionsq", '\x2294')+  ,("vector", '\x20D7')+  ,("visualspace", '\x2423')+  ,("wreathproduct", '\x2240')+  ,("Dbar", '\x0110')+  ,("compwordmark", '\x200C')+  ,("dbar", '\x0111')+  ,("rangedash", '\x2013')+  ,("hyphenchar", '\x002D')+  ,("punctdash", '\x2014')+  ,("visiblespace", '\x2423')+  ,("Yen", '\x00A5')+  ,("anticlockwise", '\x27F2')+  ,("arrowparrleftright", '\x21C6')+  ,("arrowparrrightleft", '\x21C4')+  ,("arrowtailleft", '\x21A2')+  ,("arrowtailright", '\x21A3')+  ,("arrowtripleleft", '\x21DA')+  ,("arrowtripleright", '\x21DB')+  ,("between", '\x226C')+  ,("check", '\x2713')+  ,("circleR", '\x00AE')+  ,("circleS", '\x24C8')+  ,("circleasterisk", '\x229B')+  ,("circleequal", '\x229C')+  ,("circlering", '\x229A')+  ,("clockwise", '\x27F3')+  ,("complement", '\x2201')+  ,("curlyleft", '\x21AB')+  ,("curlyright", '\x21AC')+  ,("dblarrowdwn", '\x21CA')+  ,("dblarrowheadleft", '\x219E')+  ,("dblarrowheadright", '\x21A0')+  ,("dblarrowup", '\x21C8')+  ,("defines", '\x225C')+  ,("diamondsolid", '\x2666')+  ,("difference", '\x224F')+  ,("dotplus", '\x2214')+  ,("downfall", '\x22CE')+  ,("equaldotleftright", '\x2252')+  ,("equaldotrightleft", '\x2253')+  ,("equalorfollows", '\x22DF')+  ,("equalorgreater", '\x2A96')+  ,("equalorless", '\x2A95')+  ,("equalorprecedes", '\x22DE')+  ,("equalsdots", '\x2251')+  ,("followsorequal", '\x227F')+  ,("forces", '\x22A9')+  ,("forcesbar", '\x22AA')+  ,("fork", '\x22D4')+  ,("frown", '\x2322')+  ,("geomequivalent", '\x224E')+  ,("greaterdbleqlless", '\x2A8C')+  ,("greaterdblequal", '\x2267')+  ,("greaterlessequal", '\x22DB')+  ,("greaterorapproxeql", '\x2A86')+  ,("greaterorequalslant", '\x2A7E')+  ,("greaterorsimilar", '\x2273')+  ,("harpoondownleft", '\x21C3')+  ,("harpoondownright", '\x21C2')+  ,("harpoonleftright", '\x21CC')+  ,("harpoonrightleft", '\x21CB')+  ,("harpoonupleft", '\x21BF')+  ,("harpoonupright", '\x21BE')+  ,("intercal", '\x22BA')+  ,("intersectiondbl", '\x22D2')+  ,("lessdbleqlgreater", '\x2A8B')+  ,("lessdblequal", '\x2266')+  ,("lessequalgreater", '\x22DA')+  ,("lessorapproxeql", '\x2A85')+  ,("lessorequalslant", '\x2A7D')+  ,("lessorsimilar", '\x2272')+  ,("maltesecross", '\x2720')+  ,("measuredangle", '\x2221')+  ,("multimap", '\x22B8')+  ,("multiopenleft", '\x22CB')+  ,("multiopenright", '\x22CC')+  ,("nand", '\x22BC')+  ,("orunderscore", '\x22BB')+  ,("perpcorrespond", '\x2A5E')+  ,("precedesorequal", '\x227E')+  ,("primereverse", '\x2035')+  ,("revasymptequal", '\x22CD')+  ,("revsimilar", '\x223D')+  ,("rightanglene", '\x231D')+  ,("rightanglenw", '\x231C')+  ,("rightanglese", '\x231F')+  ,("rightanglesw", '\x231E')+  ,("ringinequal", '\x2256')+  ,("satisfies", '\x22A8')+  ,("shiftleft", '\x21B0')+  ,("shiftright", '\x21B1')+  ,("smile", '\x2323')+  ,("sphericalangle", '\x2222')+  ,("square", '\x25A1')+  ,("squaredot", '\x22A1')+  ,("squareimage", '\x228F')+  ,("squareminus", '\x229F')+  ,("squaremultiply", '\x22A0')+  ,("squareoriginal", '\x2290')+  ,("squareplus", '\x229E')+  ,("squaresolid", '\x25A0')+  ,("squiggleleftright", '\x21AD')+  ,("squiggleright", '\x21DD')+  ,("subsetdbl", '\x22D0')+  ,("subsetdblequal", '\x2AC5')+  ,("supersetdbl", '\x22D1')+  ,("supersetdblequal", '\x2AC6')+  ,("triangledownsld", '\x25BC')+  ,("triangleleftequal", '\x22B4')+  ,("triangleleftsld", '\x25C0')+  ,("trianglerightequal", '\x22B5')+  ,("trianglerightsld", '\x25B6')+  ,("trianglesolid", '\x25B2')+  ,("uniondbl", '\x22D3')+  ,("uprise", '\x22CF')+  ,("Digamma", '\x1D7CB')+  ,("Finv", '\x2132')+  ,("Gmir", '\x2141')+  ,("Omegainv", '\x2127')+  ,("approxorequal", '\x224A')+  ,("archleftdown", '\x21B6')+  ,("archrightdown", '\x21B7')+  ,("beth", '\x2136')+  ,("daleth", '\x2138')+  ,("dividemultiply", '\x22C7')+  ,("downslope", '\x29F9')+  ,("equalorsimilar", '\x2242')+  ,("follownotdbleqv", '\x2ABA')+  ,("follownotslnteql", '\x2AB6')+  ,("followornoteqvlnt", '\x22E9')+  ,("greaterdot", '\x22D7')+  ,("greaternotdblequal", '\x2A8A')+  ,("greaternotequal", '\x2A88')+  ,("greaterornotdbleql", '\x2269')+  ,("greaterornotequal", '\x2269')+  ,("integerdivide", '\x2216')+  ,("lessdot", '\x22D6')+  ,("lessnotdblequal", '\x2A89')+  ,("lessnotequal", '\x2A87')+  ,("lessornotdbleql", '\x2268')+  ,("lessornotequal", '\x2268')+  ,("multicloseleft", '\x22C9')+  ,("multicloseright", '\x22CA')+  ,("notapproxequal", '\x2247')+  ,("notarrowboth", '\x21AE')+  ,("notarrowleft", '\x219A')+  ,("notarrowright", '\x219B')+  ,("notbar", '\x2224')+  ,("notdblarrowboth", '\x21CE')+  ,("notdblarrowleft", '\x21CD')+  ,("notdblarrowright", '\x21CF')+  ,("notexistential", '\x2204')+  ,("notfollows", '\x2281')+  ,("notfollowsoreql", '\x2AB0')+  ,("notforces", '\x22AE')+  ,("notforcesextra", '\x22AF')+  ,("notgreaterdblequal", '\x2267')+  ,("notgreaterequal", '\x2271')+  ,("notgreaterorslnteql", '\x2A7E')+  ,("notlessdblequal", '\x2266')+  ,("notlessequal", '\x2270')+  ,("notlessorslnteql", '\x2A7D')+  ,("notprecedesoreql", '\x2AAF')+  ,("notsatisfies", '\x22AD')+  ,("notsimilar", '\x2241')+  ,("notsubseteql", '\x2288')+  ,("notsubsetordbleql", '\x2AC5')+  ,("notsubsetoreql", '\x228A')+  ,("notsuperseteql", '\x2289')+  ,("notsupersetordbleql", '\x2AC6')+  ,("notsupersetoreql", '\x228B')+  ,("nottriangeqlleft", '\x22EC')+  ,("nottriangeqlright", '\x22ED')+  ,("nottriangleleft", '\x22EA')+  ,("nottriangleright", '\x22EB')+  ,("notturnstile", '\x22AC')+  ,("planckover2pi", '\x210F')+  ,("planckover2pi1", '\x210F')+  ,("precedenotdbleqv", '\x2AB9')+  ,("precedenotslnteql", '\x2AB5')+  ,("precedeornoteqvlnt", '\x22E8')+  ,("subsetnoteql", '\x228A')+  ,("subsetornotdbleql", '\x2ACB')+  ,("supersetnoteql", '\x228B')+  ,("supersetornotdbleql", '\x2ACC')+  ,("upslope", '\x29F8')+  ]
+ lib/Pdf/Content/Transform.hs view
@@ -0,0 +1,56 @@++-- | 2d affine transform++module Pdf.Content.Transform+(+  Transform(..),+  Vector(..),+  identity,+  translation,+  scale,+  transform,+  translate,+  multiply+)+where++-- | Affine transform+data Transform a = Transform a a a a a a+  deriving Show++-- | 2d vector/point+data Vector a = Vector a a+  deriving Show++-- | Identity transform+identity :: Num a => Transform a+identity = Transform 1 0 0 1 0 0++-- | Translation+translation :: Num a => a -> a -> Transform a+translation tx ty = Transform 1 0 0 1 tx ty++-- | Scale+scale :: Num a => a -> a -> Transform a+scale sx sy = Transform sx 0 0 sy 0 0++-- | Apply transformation to vector+transform :: Num a => Transform a -> Vector a -> Vector a+transform (Transform a b c d e f) (Vector x y) =+  Vector (a * x + c * y + e) (b * x + d * y + f)++-- | Translate+translate :: Num a => a -> a -> Transform a -> Transform a+translate tx ty t = translation tx ty `multiply` t++-- | Combine two transformations+multiply :: Num a => Transform a -> Transform a -> Transform a+multiply (Transform a1 b1 c1 d1 e1 f1) (Transform a2 b2 c2 d2 e2 f2) =+  Transform a b c d e f+  where+  a = a1 * a2 + b1 * c2+  b = a1 * b2 + b1 * d2+  c = c1 * a2 + d1 * c2+  d = c1 * b2 + d1 * d2+  e = e1 * a2 + f1 * c2 + e2+  f = e1 * b2 + f1 * d2 + f2
+ lib/Pdf/Content/UnicodeCMap.hs view
@@ -0,0 +1,204 @@+{-# LANGUAGE OverloadedStrings #-}++-- | Unicode CMap defines mapping from glyphs to text++module Pdf.Content.UnicodeCMap+(+  UnicodeCMap(..),+  parseUnicodeCMap,+  unicodeCMapNextGlyph,+  unicodeCMapDecodeGlyph+)+where++import Data.Char+import qualified Data.List as List+import Data.Map (Map)+import qualified Data.Map as Map+import Data.ByteString (ByteString)+import qualified Data.ByteString as ByteString+import qualified Data.ByteString.Base16 as Base16+import Data.Text (Text)+import qualified Data.Text as Text+import qualified Data.Text.Encoding as Text+import Data.Attoparsec.ByteString.Char8 (Parser, parseOnly)+import qualified Data.Attoparsec.ByteString.Char8 as P+import Control.Monad+import qualified Control.Monad.Fail as Fail++-- | Unicode character map+--+-- Font dictionary can contain \"ToUnicode\" key -- reference+-- to a stream with unicode CMap+data UnicodeCMap = UnicodeCMap {+  unicodeCMapCodeRanges :: [(ByteString, ByteString)],+  unicodeCMapChars :: Map Int Text,+  unicodeCMapRanges :: [(Int, Int, Char)]+  }+  deriving (Show)++-- | Parse content of unicode CMap+parseUnicodeCMap :: ByteString -> Either String UnicodeCMap+parseUnicodeCMap cmap =+  case (codeRanges, chars, ranges) of+    (Right cr, Right cs, Right (rs, crs)) -> Right $ UnicodeCMap {+      unicodeCMapCodeRanges = cr,+      unicodeCMapChars = cs <> crs,+      unicodeCMapRanges = rs+      }+    (Left err, _, _) -> Left $ "CMap code ranges: " ++ err+    (_, Left err, _) -> Left $ "CMap chars: " ++ err+    (_, _, Left err) -> Left $ "CMap ranges: " ++ err+  where+  codeRanges = parseOnly codeRangesParser cmap+  chars = parseOnly charsParser cmap+  ranges = parseOnly rangesParser cmap++-- | Take the next glyph code from string, also returns the rest of the string+unicodeCMapNextGlyph :: UnicodeCMap -> ByteString -> Maybe (Int, ByteString)+unicodeCMapNextGlyph cmap = go 1+  where+  go 5 _ = Nothing+  go n str =+    let glyph = ByteString.take n str in+    if ByteString.length glyph /= n+      then Nothing+      else if any (inRange glyph) (unicodeCMapCodeRanges cmap)+             then Just (toCode glyph, ByteString.drop n str)+             else go (n + 1) str+  inRange glyph (start, end)+    = ByteString.length glyph == ByteString.length start+    && glyph >= start && glyph <= end++toCode :: ByteString -> Int+toCode bs = fst $ ByteString.foldr (\b (sm, i) ->+                    (sm + fromIntegral b * i, i * 256)) (0, 1) bs++-- | Convert glyph to text+--+-- Note: one glyph can represent more then one char, e.g. for ligatures+unicodeCMapDecodeGlyph :: UnicodeCMap -> Int -> Maybe Text+unicodeCMapDecodeGlyph cmap glyph =+  case Map.lookup glyph (unicodeCMapChars cmap) of+    Just txt -> Just txt+    Nothing ->+      case filter inRange (unicodeCMapRanges cmap) of+        [(start, _, char)] -> Just (Text.singleton $ toEnum+                                    $ (fromEnum char) + (glyph - start))+        _ -> Nothing+  where+  inRange (start, end, _) = glyph >= start && glyph <= end++charsParser :: Parser (Map Int Text)+charsParser =+  combineChars <$> P.many' charsParser'+  where+  combineChars = List.foldl' Map.union Map.empty++charsParser' :: Parser (Map Int Text)+charsParser' = do+  n <- skipTillParser $ do+    n <- P.decimal+    P.skipSpace+    _ <- P.string "beginbfchar"+    return n++  chars <- replicateM n $ do+    P.skipSpace+    i <- parseHex+    P.skipSpace+    j <- parseHex+    return (toCode i, Text.decodeUtf16BE j)++  return $ Map.fromList chars++-- | It returns regular ranges and char map+--+-- Array ranges are converted to char map+rangesParser :: Parser ([(Int, Int, Char)], Map Int Text)+rangesParser =+  combineRanges <$> P.many' rangesParser'+  where+  combineRanges = List.foldl' combineRange ([], Map.empty)+  combineRange (ranges, rmap) (ranges', rmap') =+    (ranges ++ ranges', Map.union rmap rmap')++rangesParser' :: Parser ([(Int, Int, Char)], Map Int Text)+rangesParser' = do+  n <- skipTillParser $ do+    n <- P.decimal+    P.skipSpace+    void $ P.string "beginbfrange"+    return (n :: Int)++  let go 0 rs cs = return (rs, cs)+      go count rs cs = do+        P.skipSpace+        i <- toCode <$> parseHex+        P.skipSpace+        j <- toCode <$> parseHex+        P.skipSpace+        k <- P.eitherP parseHex parseHexArray+        case k of+          Left h -> do+            c <- case Text.uncons $ Text.decodeUtf16BE h of+                   Nothing -> fail "Can't decode range"+                   Just (v, _) -> return v+            go (pred count) ((i, j, c) : rs) cs+          Right hs -> do+            let cs' = zip [i..j] . map Text.decodeUtf16BE $ hs+            go (pred count) rs (cs <> Map.fromList cs')++  go n mempty mempty++codeRangesParser :: Parser [(ByteString, ByteString)]+codeRangesParser = do+  n <- skipTillParser $ do+    n <- P.decimal+    P.skipSpace+    void $ P.string "begincodespacerange"+    return n++  replicateM n $ do+    P.skipSpace+    i <- parseHex+    P.skipSpace+    j <- parseHex+    return (i, j)++parseHex :: Parser ByteString+parseHex = do+  void $ P.char '<'+  -- hex can contain spaces, lets filter them out+  res <- P.takeTill (== '>') >>= fromHex . ByteString.filter (/= 32)+  void $ P.char '>'+  return res++parseHexArray :: Parser [ByteString]+parseHexArray = do+  void $ P.char '['+  res <- P.many' $ do+    P.skipSpace+    parseHex+  P.skipSpace+  void $ P.char ']'+  return res++-- XXX: wtf?!+fromHex :: Fail.MonadFail m => ByteString -> m ByteString+fromHex hex = do+  case Base16.decode (bsToLower hex) of+    Left err -> fail err+    Right str -> return str+  where+  bsToLower = ByteString.map $ fromIntegral+                     . fromEnum+                     . toLower+                     . toEnum+                     . fromIntegral++skipTillParser :: Parser a -> Parser a+skipTillParser p = P.choice [+  p,+  P.anyChar >> skipTillParser p+  ]
− lib/Pdf/Toolbox/Content.hs
@@ -1,20 +0,0 @@---- | Low level tools for processing PDF page content stream.--module Pdf.Toolbox.Content-(-  module Pdf.Toolbox.Content.Ops,-  module Pdf.Toolbox.Content.Parser,-  module Pdf.Toolbox.Content.UnicodeCMap,-  module Pdf.Toolbox.Content.Processor,-  module Pdf.Toolbox.Content.Transform,-  module Pdf.Toolbox.Content.FontInfo-)-where--import Pdf.Toolbox.Content.Ops-import Pdf.Toolbox.Content.Parser-import Pdf.Toolbox.Content.UnicodeCMap-import Pdf.Toolbox.Content.Processor-import Pdf.Toolbox.Content.Transform-import Pdf.Toolbox.Content.FontInfo
− lib/Pdf/Toolbox/Content/Encoding/MacRoman.hs
@@ -1,437 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module Pdf.Toolbox.Content.Encoding.MacRoman-(-  encoding-)-where--import Data.Word-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Text (Text)--encoding :: Map Word8 Text-encoding = Map.fromList $ zip codes chars--chars :: [Text]-chars = [-  "A",-  "Æ",-  "Á",-  "Â",-  "Ä",-  "À",-  "Å",-  "Ã",-  "B",-  "C",-  "Ç",-  "D",-  "E",-  "É",-  "Ê",-  "Ë",-  "È",-  "F",-  "G",-  "H",-  "I",-  "Í",-  "Î",-  "Ï",-  "Ì",-  "J",-  "K",-  "L",-  "M",-  "N",-  "Ñ",-  "O",-  "Œ",-  "Ó",-  "Ô",-  "Ö",-  "Ò",-  "Ø",-  "Õ",-  "P",-  "Q",-  "R",-  "S",-  "T",-  "U",-  "Ú",-  "Û",-  "Ü",-  "Ù",-  "V",-  "W",-  "X",-  "Y",-  "Ÿ",-  "Z",-  "a",-  "á",-  "â",-  "´",-  "ä",-  "æ",-  "à",-  "&",-  "å",-  "^",-  "~",-  "*",-  "@",-  "ã",-  "b",-  "\\",-  "|",-  "{",-  "}",-  "[",-  "]",-  "˘",-  "•",-  "c",-  "ˇ",-  "ç",-  " ̧",-  "¢",-  "ˆ",-  ":",-  ",",-  "©",-  "¤",-  "d",-  "†",-  "‡",-  "°",-  "¨",-  "÷",-  "$",-  "˙",-  "ı",-  "e",-  "é",-  "ê",-  "ë",-  "è",-  "8",-  "…",-  "—",-  "–",-  "=",-  "!",-  "¡",-  "f",-  "fi",-  "5",-  "fl",-  "ƒ",-  "4",-  "⁄",-  "g",-  "ß",-  "`",-  ">",-  "«",-  "»",-  "‹",-  "›",-  "h",-  "˝",-  "-",-  "i",-  "í",-  "î",-  "ï",-  "ì",-  "j",-  "k",-  "l",-  "<",-  "¬",-  "m",-  " ̄",-  "μ",-  "n",-  "9",-  "ñ",-  "#",-  "o",-  "ó",-  "ô",-  "ö",-  "œ",-  "˛",-  "ò",-  "1",-  "ª",-  "º",-  "ø",-  "õ",-  "p",-  "¶",-  "(",-  ")",-  "%",-  ".",-  "·",-  "‰",-  "+",-  "±",-  "q",-  "?",-  "¿",-  "\"",-  "„",-  "“",-  "”",-  "‘",-  "’",-  "‚",-  "'",-  "r",-  "®",-  "∘",-  "s",-  "§",-  ";",-  "7",-  "6",-  "/",-  " ",-  "£",-  "t",-  "3",-  "~",-  "™",-  "2",-  "u",-  "ú",-  "û",-  "ü",-  "ù",-  "_",-  "v",-  "w",-  "x",-  "y",-  "ÿ",-  "¥",-  "z",-  "0"-  ]--codes :: [Word8]-codes = [-  0o101,-  0o256,-  0o347,-  0o345,-  0o200,-  0o313,-  0o201,-  0o314,-  0o102,-  0o103,-  0o202,-  0o104,-  0o105,-  0o203,-  0o346,-  0o350,-  0o351,-  0o106,-  0o107,-  0o110,-  0o111,-  0o352,-  0o353,-  0o354,-  0o355,-  0o112,-  0o113,-  0o114,-  0o115,-  0o116,-  0o204,-  0o117,-  0o316,-  0o356,-  0o357,-  0o205,-  0o361,-  0o257,-  0o315,-  0o120,-  0o121,-  0o122,-  0o123,-  0o124,-  0o125,-  0o362,-  0o363,-  0o206,-  0o364,-  0o126,-  0o127,-  0o130,-  0o131,-  0o331,-  0o132,-  0o141,-  0o207,-  0o211,-  0o253,-  0o212,-  0o276,-  0o210,-  0o046,-  0o214,-  0o136,-  0o176,-  0o052,-  0o100,-  0o213,-  0o142,-  0o134,-  0o174,-  0o173,-  0o175,-  0o133,-  0o135,-  0o371,-  0o245,-  0o143,-  0o377,-  0o215,-  0o374,-  0o242,-  0o366,-  0o072,-  0o054,-  0o251,-  0o333,-  0o144,-  0o240,-  0o340,-  0o241,-  0o254,-  0o326,-  0o044,-  0o372,-  0o365,-  0o145,-  0o216,-  0o220,-  0o221,-  0o217,-  0o070,-  0o311,-  0o321,-  0o320,-  0o075,-  0o041,-  0o301,-  0o146,-  0o336,-  0o065,-  0o337,-  0o304,-  0o064,-  0o332,-  0o147,-  0o247,-  0o140,-  0o076,-  0o307,-  0o310,-  0o334,-  0o335,-  0o150,-  0o375,-  0o055,-  0o151,-  0o222,-  0o224,-  0o225,-  0o223,-  0o152,-  0o153,-  0o154,-  0o074,-  0o302,-  0o155,-  0o370,-  0o265,-  0o156,-  0o071,-  0o226,-  0o043,-  0o157,-  0o227,-  0o231,-  0o232,-  0o317,-  0o376,-  0o230,-  0o061,-  0o273,-  0o274,-  0o277,-  0o233,-  0o160,-  0o246,-  0o050,-  0o051,-  0o045,-  0o056,-  0o341,-  0o344,-  0o053,-  0o261,-  0o161,-  0o077,-  0o300,-  0o042,-  0o343,-  0o322,-  0o323,-  0o324,-  0o325,-  0o342,-  0o047,-  0o162,-  0o250,-  0o373,-  0o163,-  0o244,-  0o073,-  0o067,-  0o066,-  0o057,-  0o040,-  0o243,-  0o164,-  0o063,-  0o367,-  0o252,-  0o062,-  0o165,-  0o234,-  0o236,-  0o237,-  0o235,-  0o137,-  0o166,-  0o167,-  0o170,-  0o171,-  0o330,-  0o264,-  0o172,-  0o060-  ]
− lib/Pdf/Toolbox/Content/Encoding/WinAnsi.hs
@@ -1,455 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module Pdf.Toolbox.Content.Encoding.WinAnsi-(-  encoding-)-where--import Data.Word-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Text (Text)--encoding :: Map Word8 Text-encoding = Map.fromList $ zip codes chars--chars :: [Text]-chars = [-  "A",-  "Æ",-  "Á",-  "Â",-  "Ä",-  "À",-  "Å",-  "Ã",-  "B",-  "C",-  "Ç",-  "D",-  "E",-  "É",-  "Ê",-  "Ë",-  "È",-  "Ð",-  "€",-  "F",-  "G",-  "H",-  "I",-  "Í",-  "Î",-  "Ï",-  "Ì",-  "J",-  "K",-  "L",-  "M",-  "N",-  "Ñ",-  "O",-  "Œ",-  "Ó",-  "Ô",-  "Ö",-  "Ò",-  "Ø",-  "Õ",-  "P",-  "Q",-  "R",-  "S",-  "Š",-  "T",-  "Þ",-  "U",-  "Ú",-  "Û",-  "Ü",-  "Ù",-  "V",-  "W",-  "X",-  "Y",-  "Ý",-  "Ÿ",-  "Z",-  "Ž",-  "a",-  "á",-  "â",-  "´",-  "ä",-  "æ",-  "à",-  "&",-  "å",-  "^",-  "~",-  "*",-  "@",-  "ã",-  "b",-  "\\",-  "|",-  "{",-  "}",-  "[",-  "]",-  "¦",-  "•",-  "c",-  "ç",-  " ̧",-  "¢",-  "ˆ",-  ":",-  ",",-  "©",-  "¤",-  "d",-  "†",-  "‡",-  "°",-  "¨",-  "÷",-  "$",-  "e",-  "é",-  "ê",-  "ë",-  "è",-  "8",-  "…",-  "—",-  "–",-  "=",-  "ð",-  "!",-  "¡",-  "f",-  "5",-  "ƒ",-  "4",-  "g",-  "ß",-  "`",-  ">",-  "«",-  "»",-  "‹",-  "›",-  "h",-  "-",-  "i",-  "í",-  "î",-  "ï",-  "ì",-  "j",-  "k",-  "l",-  "<",-  "¬",-  "m",-  " ̄",-  "μ",-  "×",-  "n",-  "9",-  "ñ",-  "#",-  "o",-  "ó",-  "ô",-  "ö",-  "œ",-  "ò",-  "1",-  "½",-  "¼",-  "¹",-  "ª",-  "º",-  "ø",-  "õ",-  "p",-  "¶",-  "(",-  ")",-  "%",-  ".",-  "·",-  "‰",-  "+",-  "±",-  "q",-  "?",-  "¿",-  "\"",-  "„",-  "“",-  "”",-  "‘",-  "’",-  "‚",-  "'",-  "r",-  "®",-  "s",-  "š",-  "§",-  ";",-  "7",-  "6",-  "/",-  " ",-  "£",-  "t",-  "þ",-  "3",-  "¾",-  "³",-  "~",-  "™",-  "2",-  "²",-  "u",-  "ú",-  "û",-  "ü",-  "ù",-  "_",-  "v",-  "w",-  "x",-  "y",-  "ý",-  "ÿ",-  "¥",-  "z",-  "ž",-  "0"-  ]--codes :: [Word8]-codes = [-  0o101,-  0o306,-  0o301,-  0o302,-  0o304,-  0o300,-  0o305,-  0o303,-  0o102,-  0o103,-  0o307,-  0o104,-  0o105,-  0o311,-  0o312,-  0o313,-  0o310,-  0o320,-  0o200,-  0o106,-  0o107,-  0o110,-  0o111,-  0o315,-  0o316,-  0o317,-  0o314,-  0o112,-  0o113,-  0o114,-  0o115,-  0o116,-  0o321,-  0o117,-  0o214,-  0o323,-  0o324,-  0o326,-  0o322,-  0o330,-  0o325,-  0o120,-  0o121,-  0o122,-  0o123,-  0o212,-  0o124,-  0o336,-  0o125,-  0o332,-  0o333,-  0o334,-  0o331,-  0o126,-  0o127,-  0o130,-  0o131,-  0o335,-  0o237,-  0o132,-  0o216,-  0o141,-  0o341,-  0o342,-  0o264,-  0o344,-  0o346,-  0o340,-  0o046,-  0o345,-  0o136,-  0o176,-  0o052,-  0o100,-  0o343,-  0o142,-  0o134,-  0o174,-  0o173,-  0o175,-  0o133,-  0o135,-  0o246,-  0o225,-  0o143,-  0o347,-  0o270,-  0o242,-  0o210,-  0o072,-  0o054,-  0o251,-  0o244,-  0o144,-  0o206,-  0o207,-  0o260,-  0o250,-  0o367,-  0o044,-  0o145,-  0o351,-  0o352,-  0o353,-  0o350,-  0o070,-  0o205,-  0o227,-  0o226,-  0o075,-  0o360,-  0o041,-  0o241,-  0o146,-  0o065,-  0o203,-  0o064,-  0o147,-  0o337,-  0o140,-  0o076,-  0o253,-  0o273,-  0o213,-  0o233,-  0o150,-  0o055,-  0o151,-  0o355,-  0o356,-  0o357,-  0o354,-  0o152,-  0o153,-  0o154,-  0o074,-  0o254,-  0o155,-  0o257,-  0o265,-  0o327,-  0o156,-  0o071,-  0o361,-  0o043,-  0o157,-  0o363,-  0o364,-  0o366,-  0o234,-  0o362,-  0o061,-  0o275,-  0o274,-  0o271,-  0o252,-  0o272,-  0o370,-  0o365,-  0o160,-  0o266,-  0o050,-  0o051,-  0o045,-  0o056,-  0o267,-  0o211,-  0o053,-  0o261,-  0o161,-  0o077,-  0o277,-  0o042,-  0o204,-  0o223,-  0o224,-  0o221,-  0o222,-  0o202,-  0o047,-  0o162,-  0o256,-  0o163,-  0o232,-  0o247,-  0o073,-  0o067,-  0o066,-  0o057,-  0o040,-  0o243,-  0o164,-  0o376,-  0o063,-  0o276,-  0o263,-  0o230,-  0o231,-  0o062,-  0o262,-  0o165,-  0o372,-  0o373,-  0o374,-  0o371,-  0o137,-  0o166,-  0o167,-  0o170,-  0o171,-  0o375,-  0o377,-  0o245,-  0o172,-  0o236,-  0o060-  ]
− lib/Pdf/Toolbox/Content/FontInfo.hs
@@ -1,223 +0,0 @@---- | Font info contains information, extracted from font,--- that may be needed when processing content stream--module Pdf.Toolbox.Content.FontInfo-(-  FontInfo(..),-  FISimple(..),-  FontBaseEncoding(..),-  SimpleFontEncoding(..),-  FIComposite(..),-  CIDFontWidths(..),-  makeCIDFontWidths,-  cidFontGetWidth,-  fontInfoDecodeGlyphs-)-where--import Data.List-import Data.Word-import Data.Map (Map)-import qualified Data.Map as Map-import Data.ByteString (ByteString)-import qualified Data.ByteString as BS-import Data.Text (Text)-import qualified Data.Text as Text-import qualified Data.Text.Encoding as Text-import Control.Monad--import Pdf.Toolbox.Core--import Pdf.Toolbox.Content.UnicodeCMap-import Pdf.Toolbox.Content.Transform-import Pdf.Toolbox.Content.Processor (Glyph(..))-import Pdf.Toolbox.Content.GlyphList-import Pdf.Toolbox.Content.TexGlyphList-import qualified Pdf.Toolbox.Content.Encoding.WinAnsi as WinAnsi-import qualified Pdf.Toolbox.Content.Encoding.MacRoman as MacRoman---- | Font info-data FontInfo-  = FontInfoSimple FISimple-  | FontInfoComposite FIComposite-  deriving (Show)---- | Font info for simple fonts-data FISimple = FISimple {-  fiSimpleUnicodeCMap :: Maybe UnicodeCMap,-  fiSimpleEncoding :: Maybe SimpleFontEncoding,-  fiSimpleWidths :: Maybe (Int, Int, [Double]),  -- ^ FirstChar, LastChar, list of widths-  fiSimpleFontMatrix :: Transform Double-  }-  deriving (Show)---- | Standard encoding, other encodings are based on them-data FontBaseEncoding-  = FontBaseEncodingWinAnsi-  | FontBaseEncodingMacRoman-  deriving (Show)---- | Encoding fo simple font-data SimpleFontEncoding = SimpleFontEncoding {-  simpleFontBaseEncoding :: FontBaseEncoding,-  -- | Mapping from glyph code to glyph name for cases when it is different-  -- from base encoding-  simpleFontDifferences :: [(Word8, ByteString)]-  }-  deriving (Show)---- | Font info for Type0 font-data FIComposite = FIComposite {-  fiCompositeUnicodeCMap :: Maybe UnicodeCMap,-  fiCompositeWidths :: CIDFontWidths,-  fiCompositeDefaultWidth :: Double-  }-  deriving (Show)---- | Glyph widths for CID fonts-data CIDFontWidths = CIDFontWidths {-  cidFontWidthsChars :: Map Int Double,-  cidFontWidthsRanges :: [(Int, Int, Double)]-  }-  deriving (Show)--instance Monoid CIDFontWidths where-  mempty = CIDFontWidths {-    cidFontWidthsChars = mempty,-    cidFontWidthsRanges = mempty-    }-  w1 `mappend` w2 = CIDFontWidths {-    cidFontWidthsChars = cidFontWidthsChars w1 `mappend` cidFontWidthsChars w2,-    cidFontWidthsRanges = cidFontWidthsRanges w1 `mappend` cidFontWidthsRanges w2-    }--simpleFontEncodingDecode :: SimpleFontEncoding -> Word8 -> Maybe Text-simpleFontEncodingDecode enc code =-  case lookup code (simpleFontDifferences enc) of-    Nothing ->-      case simpleFontBaseEncoding enc of-        FontBaseEncodingWinAnsi -> Map.lookup code WinAnsi.encoding-        FontBaseEncodingMacRoman -> Map.lookup code MacRoman.encoding-    Just glyphName ->-      case Map.lookup glyphName adobeGlyphList of-        Just c -> Just $ Text.pack [c]-        Nothing ->-          case Map.lookup glyphName texGlyphList of-            Nothing-> Nothing-            Just c -> Just $ Text.pack [c]---- | Make `CIDFontWidths` from value of \"W\" key in descendant font-makeCIDFontWidths :: Monad m => Array -> PdfE m CIDFontWidths-makeCIDFontWidths (Array vals) = go mempty vals-  where-  go res [] = return res-  go res (ONumber x1 : ONumber x2 : ONumber x3 : xs) = do-    n1 <- intValue x1-    n2 <- intValue x2-    n3 <- realValue x3-    go res {cidFontWidthsRanges = (n1, n2, n3) : cidFontWidthsRanges res} xs-  go res (ONumber x: OArray (Array arr): xs) = do-    n <- intValue x-    ws <- forM arr $ \w -> fromObject w >>= realValue-    go res {cidFontWidthsChars = Map.fromList (zip [n ..] ws) `mappend` cidFontWidthsChars res} xs-  go _ _ = throwE $ UnexpectedError "Can't parse CIDFont width"---- | Get glyph width by glyph code-cidFontGetWidth :: CIDFontWidths -> Int -> Maybe Double-cidFontGetWidth w code =-  case Map.lookup code (cidFontWidthsChars w) of-    Just width -> Just width-    Nothing -> case find (\(start, end, _) -> code >= start && code <= end) (cidFontWidthsRanges w) of-                 Just (_, _, width) -> Just width-                 _ -> Nothing---- | Decode string into list of glyphs and their widths-fontInfoDecodeGlyphs :: FontInfo -> Str -> [(Glyph, Double)]-fontInfoDecodeGlyphs (FontInfoSimple fi) = \(Str bs) ->-  flip map (BS.unpack bs) $ \c ->-    let code = fromIntegral c-        txt =-          case fiSimpleUnicodeCMap fi of-            Nothing ->-              case fiSimpleEncoding fi of-                Nothing ->-                  case Text.decodeUtf8' (BS.pack [c]) of-                    Right t -> Just t-                    _ -> Nothing-                Just enc ->-                  case simpleFontEncodingDecode enc c of-                    Just t -> Just t-                    Nothing ->-                      case Text.decodeUtf8' (BS.pack [c]) of-                        Right t -> Just t-                        _ -> Nothing-            Just toUnicode ->-              case unicodeCMapDecodeGlyph toUnicode code of-                Just t -> Just t-                Nothing ->-                  case fiSimpleEncoding fi of-                    Nothing -> Nothing-                    Just enc ->-                      case simpleFontEncodingDecode enc c of-                        Just t -> Just t-                        Nothing ->-                          case Text.decodeUtf8' (BS.pack [c]) of-                            Right t -> Just t-                            _ -> Nothing-        width =-          case fiSimpleWidths fi of-            Nothing -> 0-            Just (firstChar, lastChar, widths) ->-              if code >= firstChar && code <= lastChar && (code - firstChar) < length widths-                 then let Vector w _ = transform (fiSimpleFontMatrix fi) $ Vector (widths !! (code - firstChar)) 0-                      in w-                 else 0-    in (Glyph {-      glyphCode = code,-      glyphTopLeft = Vector 0 0,-      glyphBottomRight = Vector width 1,-      glyphText = txt-      }, width)-fontInfoDecodeGlyphs (FontInfoComposite fi) = \str ->-  case fiCompositeUnicodeCMap fi of-    Nothing ->  -- XXX: use encoding here-      let Str bs = str-      in tryDecode2byte $ BS.unpack bs-    Just toUnicode ->-      let getWidth = fromMaybe (fiCompositeDefaultWidth fi) . cidFontGetWidth (fiCompositeWidths fi)-      in cmapDecodeString getWidth toUnicode str-  where-  -- Most of the time composite fonts have 2-byte encoding,-  -- so lets try that for now.-  tryDecode2byte (b1:b2:rest) =-    let code = fromIntegral b1 * 255 + fromIntegral b2-        width = (/ 1000) $ fromMaybe (fiCompositeDefaultWidth fi) $ cidFontGetWidth (fiCompositeWidths fi) code-        txt =-          case Text.decodeUtf8' (BS.pack [b1, b2]) of-            Right t -> Just t-            _ -> Nothing-        g = Glyph {-          glyphCode = code,-          glyphTopLeft = Vector 0 0,-          glyphBottomRight = Vector width 1,-          glyphText = txt-          }-    in (g, width) : tryDecode2byte rest-  tryDecode2byte _ = []--cmapDecodeString :: (Int -> Double) -> UnicodeCMap -> Str -> [(Glyph, Double)]-cmapDecodeString getWidth cmap (Str str) = go str-  where-  go s =-    case unicodeCMapNextGlyph cmap s of-      Nothing -> []-      Just (g, rest) ->-        let width = getWidth g / 1000-            glyph = Glyph {-          glyphCode = g,-          glyphTopLeft = Vector 0 0,-          glyphBottomRight = Vector width 1,-          glyphText = unicodeCMapDecodeGlyph cmap g-          }-        in (glyph, width) : go rest
− lib/Pdf/Toolbox/Content/GlyphList.hs
@@ -1,4299 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}---- | Mapping from glyph names to unicode characters--module Pdf.Toolbox.Content.GlyphList-(-    adobeGlyphList-)-where--import Data.ByteString (ByteString)-import Data.Map (Map)-import qualified Data.Map as Map---- | Glyph list-adobeGlyphList :: Map ByteString Char-adobeGlyphList = Map.fromList-  [("A", '\x0041')-  ,("AE", '\x00C6')-  ,("AEacute", '\x01FC')-  ,("AEmacron", '\x01E2')-  ,("AEsmall", '\xF7E6')-  ,("Aacute", '\x00C1')-  ,("Aacutesmall", '\xF7E1')-  ,("Abreve", '\x0102')-  ,("Abreveacute", '\x1EAE')-  ,("Abrevecyrillic", '\x04D0')-  ,("Abrevedotbelow", '\x1EB6')-  ,("Abrevegrave", '\x1EB0')-  ,("Abrevehookabove", '\x1EB2')-  ,("Abrevetilde", '\x1EB4')-  ,("Acaron", '\x01CD')-  ,("Acircle", '\x24B6')-  ,("Acircumflex", '\x00C2')-  ,("Acircumflexacute", '\x1EA4')-  ,("Acircumflexdotbelow", '\x1EAC')-  ,("Acircumflexgrave", '\x1EA6')-  ,("Acircumflexhookabove", '\x1EA8')-  ,("Acircumflexsmall", '\xF7E2')-  ,("Acircumflextilde", '\x1EAA')-  ,("Acute", '\xF6C9')-  ,("Acutesmall", '\xF7B4')-  ,("Acyrillic", '\x0410')-  ,("Adblgrave", '\x0200')-  ,("Adieresis", '\x00C4')-  ,("Adieresiscyrillic", '\x04D2')-  ,("Adieresismacron", '\x01DE')-  ,("Adieresissmall", '\xF7E4')-  ,("Adotbelow", '\x1EA0')-  ,("Adotmacron", '\x01E0')-  ,("Agrave", '\x00C0')-  ,("Agravesmall", '\xF7E0')-  ,("Ahookabove", '\x1EA2')-  ,("Aiecyrillic", '\x04D4')-  ,("Ainvertedbreve", '\x0202')-  ,("Alpha", '\x0391')-  ,("Alphatonos", '\x0386')-  ,("Amacron", '\x0100')-  ,("Amonospace", '\xFF21')-  ,("Aogonek", '\x0104')-  ,("Aring", '\x00C5')-  ,("Aringacute", '\x01FA')-  ,("Aringbelow", '\x1E00')-  ,("Aringsmall", '\xF7E5')-  ,("Asmall", '\xF761')-  ,("Atilde", '\x00C3')-  ,("Atildesmall", '\xF7E3')-  ,("Aybarmenian", '\x0531')-  ,("B", '\x0042')-  ,("Bcircle", '\x24B7')-  ,("Bdotaccent", '\x1E02')-  ,("Bdotbelow", '\x1E04')-  ,("Becyrillic", '\x0411')-  ,("Benarmenian", '\x0532')-  ,("Beta", '\x0392')-  ,("Bhook", '\x0181')-  ,("Blinebelow", '\x1E06')-  ,("Bmonospace", '\xFF22')-  ,("Brevesmall", '\xF6F4')-  ,("Bsmall", '\xF762')-  ,("Btopbar", '\x0182')-  ,("C", '\x0043')-  ,("Caarmenian", '\x053E')-  ,("Cacute", '\x0106')-  ,("Caron", '\xF6CA')-  ,("Caronsmall", '\xF6F5')-  ,("Ccaron", '\x010C')-  ,("Ccedilla", '\x00C7')-  ,("Ccedillaacute", '\x1E08')-  ,("Ccedillasmall", '\xF7E7')-  ,("Ccircle", '\x24B8')-  ,("Ccircumflex", '\x0108')-  ,("Cdot", '\x010A')-  ,("Cdotaccent", '\x010A')-  ,("Cedillasmall", '\xF7B8')-  ,("Chaarmenian", '\x0549')-  ,("Cheabkhasiancyrillic", '\x04BC')-  ,("Checyrillic", '\x0427')-  ,("Chedescenderabkhasiancyrillic", '\x04BE')-  ,("Chedescendercyrillic", '\x04B6')-  ,("Chedieresiscyrillic", '\x04F4')-  ,("Cheharmenian", '\x0543')-  ,("Chekhakassiancyrillic", '\x04CB')-  ,("Cheverticalstrokecyrillic", '\x04B8')-  ,("Chi", '\x03A7')-  ,("Chook", '\x0187')-  ,("Circumflexsmall", '\xF6F6')-  ,("Cmonospace", '\xFF23')-  ,("Coarmenian", '\x0551')-  ,("Csmall", '\xF763')-  ,("D", '\x0044')-  ,("DZ", '\x01F1')-  ,("DZcaron", '\x01C4')-  ,("Daarmenian", '\x0534')-  ,("Dafrican", '\x0189')-  ,("Dcaron", '\x010E')-  ,("Dcedilla", '\x1E10')-  ,("Dcircle", '\x24B9')-  ,("Dcircumflexbelow", '\x1E12')-  ,("Dcroat", '\x0110')-  ,("Ddotaccent", '\x1E0A')-  ,("Ddotbelow", '\x1E0C')-  ,("Decyrillic", '\x0414')-  ,("Deicoptic", '\x03EE')-  ,("Delta", '\x2206')-  ,("Deltagreek", '\x0394')-  ,("Dhook", '\x018A')-  ,("Dieresis", '\xF6CB')-  ,("DieresisAcute", '\xF6CC')-  ,("DieresisGrave", '\xF6CD')-  ,("Dieresissmall", '\xF7A8')-  ,("Digammagreek", '\x03DC')-  ,("Djecyrillic", '\x0402')-  ,("Dlinebelow", '\x1E0E')-  ,("Dmonospace", '\xFF24')-  ,("Dotaccentsmall", '\xF6F7')-  ,("Dslash", '\x0110')-  ,("Dsmall", '\xF764')-  ,("Dtopbar", '\x018B')-  ,("Dz", '\x01F2')-  ,("Dzcaron", '\x01C5')-  ,("Dzeabkhasiancyrillic", '\x04E0')-  ,("Dzecyrillic", '\x0405')-  ,("Dzhecyrillic", '\x040F')-  ,("E", '\x0045')-  ,("Eacute", '\x00C9')-  ,("Eacutesmall", '\xF7E9')-  ,("Ebreve", '\x0114')-  ,("Ecaron", '\x011A')-  ,("Ecedillabreve", '\x1E1C')-  ,("Echarmenian", '\x0535')-  ,("Ecircle", '\x24BA')-  ,("Ecircumflex", '\x00CA')-  ,("Ecircumflexacute", '\x1EBE')-  ,("Ecircumflexbelow", '\x1E18')-  ,("Ecircumflexdotbelow", '\x1EC6')-  ,("Ecircumflexgrave", '\x1EC0')-  ,("Ecircumflexhookabove", '\x1EC2')-  ,("Ecircumflexsmall", '\xF7EA')-  ,("Ecircumflextilde", '\x1EC4')-  ,("Ecyrillic", '\x0404')-  ,("Edblgrave", '\x0204')-  ,("Edieresis", '\x00CB')-  ,("Edieresissmall", '\xF7EB')-  ,("Edot", '\x0116')-  ,("Edotaccent", '\x0116')-  ,("Edotbelow", '\x1EB8')-  ,("Efcyrillic", '\x0424')-  ,("Egrave", '\x00C8')-  ,("Egravesmall", '\xF7E8')-  ,("Eharmenian", '\x0537')-  ,("Ehookabove", '\x1EBA')-  ,("Eightroman", '\x2167')-  ,("Einvertedbreve", '\x0206')-  ,("Eiotifiedcyrillic", '\x0464')-  ,("Elcyrillic", '\x041B')-  ,("Elevenroman", '\x216A')-  ,("Emacron", '\x0112')-  ,("Emacronacute", '\x1E16')-  ,("Emacrongrave", '\x1E14')-  ,("Emcyrillic", '\x041C')-  ,("Emonospace", '\xFF25')-  ,("Encyrillic", '\x041D')-  ,("Endescendercyrillic", '\x04A2')-  ,("Eng", '\x014A')-  ,("Enghecyrillic", '\x04A4')-  ,("Enhookcyrillic", '\x04C7')-  ,("Eogonek", '\x0118')-  ,("Eopen", '\x0190')-  ,("Epsilon", '\x0395')-  ,("Epsilontonos", '\x0388')-  ,("Ercyrillic", '\x0420')-  ,("Ereversed", '\x018E')-  ,("Ereversedcyrillic", '\x042D')-  ,("Escyrillic", '\x0421')-  ,("Esdescendercyrillic", '\x04AA')-  ,("Esh", '\x01A9')-  ,("Esmall", '\xF765')-  ,("Eta", '\x0397')-  ,("Etarmenian", '\x0538')-  ,("Etatonos", '\x0389')-  ,("Eth", '\x00D0')-  ,("Ethsmall", '\xF7F0')-  ,("Etilde", '\x1EBC')-  ,("Etildebelow", '\x1E1A')-  ,("Euro", '\x20AC')-  ,("Ezh", '\x01B7')-  ,("Ezhcaron", '\x01EE')-  ,("Ezhreversed", '\x01B8')-  ,("F", '\x0046')-  ,("Fcircle", '\x24BB')-  ,("Fdotaccent", '\x1E1E')-  ,("Feharmenian", '\x0556')-  ,("Feicoptic", '\x03E4')-  ,("Fhook", '\x0191')-  ,("Fitacyrillic", '\x0472')-  ,("Fiveroman", '\x2164')-  ,("Fmonospace", '\xFF26')-  ,("Fourroman", '\x2163')-  ,("Fsmall", '\xF766')-  ,("G", '\x0047')-  ,("GBsquare", '\x3387')-  ,("Gacute", '\x01F4')-  ,("Gamma", '\x0393')-  ,("Gammaafrican", '\x0194')-  ,("Gangiacoptic", '\x03EA')-  ,("Gbreve", '\x011E')-  ,("Gcaron", '\x01E6')-  ,("Gcedilla", '\x0122')-  ,("Gcircle", '\x24BC')-  ,("Gcircumflex", '\x011C')-  ,("Gcommaaccent", '\x0122')-  ,("Gdot", '\x0120')-  ,("Gdotaccent", '\x0120')-  ,("Gecyrillic", '\x0413')-  ,("Ghadarmenian", '\x0542')-  ,("Ghemiddlehookcyrillic", '\x0494')-  ,("Ghestrokecyrillic", '\x0492')-  ,("Gheupturncyrillic", '\x0490')-  ,("Ghook", '\x0193')-  ,("Gimarmenian", '\x0533')-  ,("Gjecyrillic", '\x0403')-  ,("Gmacron", '\x1E20')-  ,("Gmonospace", '\xFF27')-  ,("Grave", '\xF6CE')-  ,("Gravesmall", '\xF760')-  ,("Gsmall", '\xF767')-  ,("Gsmallhook", '\x029B')-  ,("Gstroke", '\x01E4')-  ,("H", '\x0048')-  ,("H18533", '\x25CF')-  ,("H18543", '\x25AA')-  ,("H18551", '\x25AB')-  ,("H22073", '\x25A1')-  ,("HPsquare", '\x33CB')-  ,("Haabkhasiancyrillic", '\x04A8')-  ,("Hadescendercyrillic", '\x04B2')-  ,("Hardsigncyrillic", '\x042A')-  ,("Hbar", '\x0126')-  ,("Hbrevebelow", '\x1E2A')-  ,("Hcedilla", '\x1E28')-  ,("Hcircle", '\x24BD')-  ,("Hcircumflex", '\x0124')-  ,("Hdieresis", '\x1E26')-  ,("Hdotaccent", '\x1E22')-  ,("Hdotbelow", '\x1E24')-  ,("Hmonospace", '\xFF28')-  ,("Hoarmenian", '\x0540')-  ,("Horicoptic", '\x03E8')-  ,("Hsmall", '\xF768')-  ,("Hungarumlaut", '\xF6CF')-  ,("Hungarumlautsmall", '\xF6F8')-  ,("Hzsquare", '\x3390')-  ,("I", '\x0049')-  ,("IAcyrillic", '\x042F')-  ,("IJ", '\x0132')-  ,("IUcyrillic", '\x042E')-  ,("Iacute", '\x00CD')-  ,("Iacutesmall", '\xF7ED')-  ,("Ibreve", '\x012C')-  ,("Icaron", '\x01CF')-  ,("Icircle", '\x24BE')-  ,("Icircumflex", '\x00CE')-  ,("Icircumflexsmall", '\xF7EE')-  ,("Icyrillic", '\x0406')-  ,("Idblgrave", '\x0208')-  ,("Idieresis", '\x00CF')-  ,("Idieresisacute", '\x1E2E')-  ,("Idieresiscyrillic", '\x04E4')-  ,("Idieresissmall", '\xF7EF')-  ,("Idot", '\x0130')-  ,("Idotaccent", '\x0130')-  ,("Idotbelow", '\x1ECA')-  ,("Iebrevecyrillic", '\x04D6')-  ,("Iecyrillic", '\x0415')-  ,("Ifraktur", '\x2111')-  ,("Igrave", '\x00CC')-  ,("Igravesmall", '\xF7EC')-  ,("Ihookabove", '\x1EC8')-  ,("Iicyrillic", '\x0418')-  ,("Iinvertedbreve", '\x020A')-  ,("Iishortcyrillic", '\x0419')-  ,("Imacron", '\x012A')-  ,("Imacroncyrillic", '\x04E2')-  ,("Imonospace", '\xFF29')-  ,("Iniarmenian", '\x053B')-  ,("Iocyrillic", '\x0401')-  ,("Iogonek", '\x012E')-  ,("Iota", '\x0399')-  ,("Iotaafrican", '\x0196')-  ,("Iotadieresis", '\x03AA')-  ,("Iotatonos", '\x038A')-  ,("Ismall", '\xF769')-  ,("Istroke", '\x0197')-  ,("Itilde", '\x0128')-  ,("Itildebelow", '\x1E2C')-  ,("Izhitsacyrillic", '\x0474')-  ,("Izhitsadblgravecyrillic", '\x0476')-  ,("J", '\x004A')-  ,("Jaarmenian", '\x0541')-  ,("Jcircle", '\x24BF')-  ,("Jcircumflex", '\x0134')-  ,("Jecyrillic", '\x0408')-  ,("Jheharmenian", '\x054B')-  ,("Jmonospace", '\xFF2A')-  ,("Jsmall", '\xF76A')-  ,("K", '\x004B')-  ,("KBsquare", '\x3385')-  ,("KKsquare", '\x33CD')-  ,("Kabashkircyrillic", '\x04A0')-  ,("Kacute", '\x1E30')-  ,("Kacyrillic", '\x041A')-  ,("Kadescendercyrillic", '\x049A')-  ,("Kahookcyrillic", '\x04C3')-  ,("Kappa", '\x039A')-  ,("Kastrokecyrillic", '\x049E')-  ,("Kaverticalstrokecyrillic", '\x049C')-  ,("Kcaron", '\x01E8')-  ,("Kcedilla", '\x0136')-  ,("Kcircle", '\x24C0')-  ,("Kcommaaccent", '\x0136')-  ,("Kdotbelow", '\x1E32')-  ,("Keharmenian", '\x0554')-  ,("Kenarmenian", '\x053F')-  ,("Khacyrillic", '\x0425')-  ,("Kheicoptic", '\x03E6')-  ,("Khook", '\x0198')-  ,("Kjecyrillic", '\x040C')-  ,("Klinebelow", '\x1E34')-  ,("Kmonospace", '\xFF2B')-  ,("Koppacyrillic", '\x0480')-  ,("Koppagreek", '\x03DE')-  ,("Ksicyrillic", '\x046E')-  ,("Ksmall", '\xF76B')-  ,("L", '\x004C')-  ,("LJ", '\x01C7')-  ,("LL", '\xF6BF')-  ,("Lacute", '\x0139')-  ,("Lambda", '\x039B')-  ,("Lcaron", '\x013D')-  ,("Lcedilla", '\x013B')-  ,("Lcircle", '\x24C1')-  ,("Lcircumflexbelow", '\x1E3C')-  ,("Lcommaaccent", '\x013B')-  ,("Ldot", '\x013F')-  ,("Ldotaccent", '\x013F')-  ,("Ldotbelow", '\x1E36')-  ,("Ldotbelowmacron", '\x1E38')-  ,("Liwnarmenian", '\x053C')-  ,("Lj", '\x01C8')-  ,("Ljecyrillic", '\x0409')-  ,("Llinebelow", '\x1E3A')-  ,("Lmonospace", '\xFF2C')-  ,("Lslash", '\x0141')-  ,("Lslashsmall", '\xF6F9')-  ,("Lsmall", '\xF76C')-  ,("M", '\x004D')-  ,("MBsquare", '\x3386')-  ,("Macron", '\xF6D0')-  ,("Macronsmall", '\xF7AF')-  ,("Macute", '\x1E3E')-  ,("Mcircle", '\x24C2')-  ,("Mdotaccent", '\x1E40')-  ,("Mdotbelow", '\x1E42')-  ,("Menarmenian", '\x0544')-  ,("Mmonospace", '\xFF2D')-  ,("Msmall", '\xF76D')-  ,("Mturned", '\x019C')-  ,("Mu", '\x039C')-  ,("N", '\x004E')-  ,("NJ", '\x01CA')-  ,("Nacute", '\x0143')-  ,("Ncaron", '\x0147')-  ,("Ncedilla", '\x0145')-  ,("Ncircle", '\x24C3')-  ,("Ncircumflexbelow", '\x1E4A')-  ,("Ncommaaccent", '\x0145')-  ,("Ndotaccent", '\x1E44')-  ,("Ndotbelow", '\x1E46')-  ,("Nhookleft", '\x019D')-  ,("Nineroman", '\x2168')-  ,("Nj", '\x01CB')-  ,("Njecyrillic", '\x040A')-  ,("Nlinebelow", '\x1E48')-  ,("Nmonospace", '\xFF2E')-  ,("Nowarmenian", '\x0546')-  ,("Nsmall", '\xF76E')-  ,("Ntilde", '\x00D1')-  ,("Ntildesmall", '\xF7F1')-  ,("Nu", '\x039D')-  ,("O", '\x004F')-  ,("OE", '\x0152')-  ,("OEsmall", '\xF6FA')-  ,("Oacute", '\x00D3')-  ,("Oacutesmall", '\xF7F3')-  ,("Obarredcyrillic", '\x04E8')-  ,("Obarreddieresiscyrillic", '\x04EA')-  ,("Obreve", '\x014E')-  ,("Ocaron", '\x01D1')-  ,("Ocenteredtilde", '\x019F')-  ,("Ocircle", '\x24C4')-  ,("Ocircumflex", '\x00D4')-  ,("Ocircumflexacute", '\x1ED0')-  ,("Ocircumflexdotbelow", '\x1ED8')-  ,("Ocircumflexgrave", '\x1ED2')-  ,("Ocircumflexhookabove", '\x1ED4')-  ,("Ocircumflexsmall", '\xF7F4')-  ,("Ocircumflextilde", '\x1ED6')-  ,("Ocyrillic", '\x041E')-  ,("Odblacute", '\x0150')-  ,("Odblgrave", '\x020C')-  ,("Odieresis", '\x00D6')-  ,("Odieresiscyrillic", '\x04E6')-  ,("Odieresissmall", '\xF7F6')-  ,("Odotbelow", '\x1ECC')-  ,("Ogoneksmall", '\xF6FB')-  ,("Ograve", '\x00D2')-  ,("Ogravesmall", '\xF7F2')-  ,("Oharmenian", '\x0555')-  ,("Ohm", '\x2126')-  ,("Ohookabove", '\x1ECE')-  ,("Ohorn", '\x01A0')-  ,("Ohornacute", '\x1EDA')-  ,("Ohorndotbelow", '\x1EE2')-  ,("Ohorngrave", '\x1EDC')-  ,("Ohornhookabove", '\x1EDE')-  ,("Ohorntilde", '\x1EE0')-  ,("Ohungarumlaut", '\x0150')-  ,("Oi", '\x01A2')-  ,("Oinvertedbreve", '\x020E')-  ,("Omacron", '\x014C')-  ,("Omacronacute", '\x1E52')-  ,("Omacrongrave", '\x1E50')-  ,("Omega", '\x2126')-  ,("Omegacyrillic", '\x0460')-  ,("Omegagreek", '\x03A9')-  ,("Omegaroundcyrillic", '\x047A')-  ,("Omegatitlocyrillic", '\x047C')-  ,("Omegatonos", '\x038F')-  ,("Omicron", '\x039F')-  ,("Omicrontonos", '\x038C')-  ,("Omonospace", '\xFF2F')-  ,("Oneroman", '\x2160')-  ,("Oogonek", '\x01EA')-  ,("Oogonekmacron", '\x01EC')-  ,("Oopen", '\x0186')-  ,("Oslash", '\x00D8')-  ,("Oslashacute", '\x01FE')-  ,("Oslashsmall", '\xF7F8')-  ,("Osmall", '\xF76F')-  ,("Ostrokeacute", '\x01FE')-  ,("Otcyrillic", '\x047E')-  ,("Otilde", '\x00D5')-  ,("Otildeacute", '\x1E4C')-  ,("Otildedieresis", '\x1E4E')-  ,("Otildesmall", '\xF7F5')-  ,("P", '\x0050')-  ,("Pacute", '\x1E54')-  ,("Pcircle", '\x24C5')-  ,("Pdotaccent", '\x1E56')-  ,("Pecyrillic", '\x041F')-  ,("Peharmenian", '\x054A')-  ,("Pemiddlehookcyrillic", '\x04A6')-  ,("Phi", '\x03A6')-  ,("Phook", '\x01A4')-  ,("Pi", '\x03A0')-  ,("Piwrarmenian", '\x0553')-  ,("Pmonospace", '\xFF30')-  ,("Psi", '\x03A8')-  ,("Psicyrillic", '\x0470')-  ,("Psmall", '\xF770')-  ,("Q", '\x0051')-  ,("Qcircle", '\x24C6')-  ,("Qmonospace", '\xFF31')-  ,("Qsmall", '\xF771')-  ,("R", '\x0052')-  ,("Raarmenian", '\x054C')-  ,("Racute", '\x0154')-  ,("Rcaron", '\x0158')-  ,("Rcedilla", '\x0156')-  ,("Rcircle", '\x24C7')-  ,("Rcommaaccent", '\x0156')-  ,("Rdblgrave", '\x0210')-  ,("Rdotaccent", '\x1E58')-  ,("Rdotbelow", '\x1E5A')-  ,("Rdotbelowmacron", '\x1E5C')-  ,("Reharmenian", '\x0550')-  ,("Rfraktur", '\x211C')-  ,("Rho", '\x03A1')-  ,("Ringsmall", '\xF6FC')-  ,("Rinvertedbreve", '\x0212')-  ,("Rlinebelow", '\x1E5E')-  ,("Rmonospace", '\xFF32')-  ,("Rsmall", '\xF772')-  ,("Rsmallinverted", '\x0281')-  ,("Rsmallinvertedsuperior", '\x02B6')-  ,("S", '\x0053')-  ,("SF010000", '\x250C')-  ,("SF020000", '\x2514')-  ,("SF030000", '\x2510')-  ,("SF040000", '\x2518')-  ,("SF050000", '\x253C')-  ,("SF060000", '\x252C')-  ,("SF070000", '\x2534')-  ,("SF080000", '\x251C')-  ,("SF090000", '\x2524')-  ,("SF100000", '\x2500')-  ,("SF110000", '\x2502')-  ,("SF190000", '\x2561')-  ,("SF200000", '\x2562')-  ,("SF210000", '\x2556')-  ,("SF220000", '\x2555')-  ,("SF230000", '\x2563')-  ,("SF240000", '\x2551')-  ,("SF250000", '\x2557')-  ,("SF260000", '\x255D')-  ,("SF270000", '\x255C')-  ,("SF280000", '\x255B')-  ,("SF360000", '\x255E')-  ,("SF370000", '\x255F')-  ,("SF380000", '\x255A')-  ,("SF390000", '\x2554')-  ,("SF400000", '\x2569')-  ,("SF410000", '\x2566')-  ,("SF420000", '\x2560')-  ,("SF430000", '\x2550')-  ,("SF440000", '\x256C')-  ,("SF450000", '\x2567')-  ,("SF460000", '\x2568')-  ,("SF470000", '\x2564')-  ,("SF480000", '\x2565')-  ,("SF490000", '\x2559')-  ,("SF500000", '\x2558')-  ,("SF510000", '\x2552')-  ,("SF520000", '\x2553')-  ,("SF530000", '\x256B')-  ,("SF540000", '\x256A')-  ,("Sacute", '\x015A')-  ,("Sacutedotaccent", '\x1E64')-  ,("Sampigreek", '\x03E0')-  ,("Scaron", '\x0160')-  ,("Scarondotaccent", '\x1E66')-  ,("Scaronsmall", '\xF6FD')-  ,("Scedilla", '\x015E')-  ,("Schwa", '\x018F')-  ,("Schwacyrillic", '\x04D8')-  ,("Schwadieresiscyrillic", '\x04DA')-  ,("Scircle", '\x24C8')-  ,("Scircumflex", '\x015C')-  ,("Scommaaccent", '\x0218')-  ,("Sdotaccent", '\x1E60')-  ,("Sdotbelow", '\x1E62')-  ,("Sdotbelowdotaccent", '\x1E68')-  ,("Seharmenian", '\x054D')-  ,("Sevenroman", '\x2166')-  ,("Shaarmenian", '\x0547')-  ,("Shacyrillic", '\x0428')-  ,("Shchacyrillic", '\x0429')-  ,("Sheicoptic", '\x03E2')-  ,("Shhacyrillic", '\x04BA')-  ,("Shimacoptic", '\x03EC')-  ,("Sigma", '\x03A3')-  ,("Sixroman", '\x2165')-  ,("Smonospace", '\xFF33')-  ,("Softsigncyrillic", '\x042C')-  ,("Ssmall", '\xF773')-  ,("Stigmagreek", '\x03DA')-  ,("T", '\x0054')-  ,("Tau", '\x03A4')-  ,("Tbar", '\x0166')-  ,("Tcaron", '\x0164')-  ,("Tcedilla", '\x0162')-  ,("Tcircle", '\x24C9')-  ,("Tcircumflexbelow", '\x1E70')-  ,("Tcommaaccent", '\x0162')-  ,("Tdotaccent", '\x1E6A')-  ,("Tdotbelow", '\x1E6C')-  ,("Tecyrillic", '\x0422')-  ,("Tedescendercyrillic", '\x04AC')-  ,("Tenroman", '\x2169')-  ,("Tetsecyrillic", '\x04B4')-  ,("Theta", '\x0398')-  ,("Thook", '\x01AC')-  ,("Thorn", '\x00DE')-  ,("Thornsmall", '\xF7FE')-  ,("Threeroman", '\x2162')-  ,("Tildesmall", '\xF6FE')-  ,("Tiwnarmenian", '\x054F')-  ,("Tlinebelow", '\x1E6E')-  ,("Tmonospace", '\xFF34')-  ,("Toarmenian", '\x0539')-  ,("Tonefive", '\x01BC')-  ,("Tonesix", '\x0184')-  ,("Tonetwo", '\x01A7')-  ,("Tretroflexhook", '\x01AE')-  ,("Tsecyrillic", '\x0426')-  ,("Tshecyrillic", '\x040B')-  ,("Tsmall", '\xF774')-  ,("Twelveroman", '\x216B')-  ,("Tworoman", '\x2161')-  ,("U", '\x0055')-  ,("Uacute", '\x00DA')-  ,("Uacutesmall", '\xF7FA')-  ,("Ubreve", '\x016C')-  ,("Ucaron", '\x01D3')-  ,("Ucircle", '\x24CA')-  ,("Ucircumflex", '\x00DB')-  ,("Ucircumflexbelow", '\x1E76')-  ,("Ucircumflexsmall", '\xF7FB')-  ,("Ucyrillic", '\x0423')-  ,("Udblacute", '\x0170')-  ,("Udblgrave", '\x0214')-  ,("Udieresis", '\x00DC')-  ,("Udieresisacute", '\x01D7')-  ,("Udieresisbelow", '\x1E72')-  ,("Udieresiscaron", '\x01D9')-  ,("Udieresiscyrillic", '\x04F0')-  ,("Udieresisgrave", '\x01DB')-  ,("Udieresismacron", '\x01D5')-  ,("Udieresissmall", '\xF7FC')-  ,("Udotbelow", '\x1EE4')-  ,("Ugrave", '\x00D9')-  ,("Ugravesmall", '\xF7F9')-  ,("Uhookabove", '\x1EE6')-  ,("Uhorn", '\x01AF')-  ,("Uhornacute", '\x1EE8')-  ,("Uhorndotbelow", '\x1EF0')-  ,("Uhorngrave", '\x1EEA')-  ,("Uhornhookabove", '\x1EEC')-  ,("Uhorntilde", '\x1EEE')-  ,("Uhungarumlaut", '\x0170')-  ,("Uhungarumlautcyrillic", '\x04F2')-  ,("Uinvertedbreve", '\x0216')-  ,("Ukcyrillic", '\x0478')-  ,("Umacron", '\x016A')-  ,("Umacroncyrillic", '\x04EE')-  ,("Umacrondieresis", '\x1E7A')-  ,("Umonospace", '\xFF35')-  ,("Uogonek", '\x0172')-  ,("Upsilon", '\x03A5')-  ,("Upsilon1", '\x03D2')-  ,("Upsilonacutehooksymbolgreek", '\x03D3')-  ,("Upsilonafrican", '\x01B1')-  ,("Upsilondieresis", '\x03AB')-  ,("Upsilondieresishooksymbolgreek", '\x03D4')-  ,("Upsilonhooksymbol", '\x03D2')-  ,("Upsilontonos", '\x038E')-  ,("Uring", '\x016E')-  ,("Ushortcyrillic", '\x040E')-  ,("Usmall", '\xF775')-  ,("Ustraightcyrillic", '\x04AE')-  ,("Ustraightstrokecyrillic", '\x04B0')-  ,("Utilde", '\x0168')-  ,("Utildeacute", '\x1E78')-  ,("Utildebelow", '\x1E74')-  ,("V", '\x0056')-  ,("Vcircle", '\x24CB')-  ,("Vdotbelow", '\x1E7E')-  ,("Vecyrillic", '\x0412')-  ,("Vewarmenian", '\x054E')-  ,("Vhook", '\x01B2')-  ,("Vmonospace", '\xFF36')-  ,("Voarmenian", '\x0548')-  ,("Vsmall", '\xF776')-  ,("Vtilde", '\x1E7C')-  ,("W", '\x0057')-  ,("Wacute", '\x1E82')-  ,("Wcircle", '\x24CC')-  ,("Wcircumflex", '\x0174')-  ,("Wdieresis", '\x1E84')-  ,("Wdotaccent", '\x1E86')-  ,("Wdotbelow", '\x1E88')-  ,("Wgrave", '\x1E80')-  ,("Wmonospace", '\xFF37')-  ,("Wsmall", '\xF777')-  ,("X", '\x0058')-  ,("Xcircle", '\x24CD')-  ,("Xdieresis", '\x1E8C')-  ,("Xdotaccent", '\x1E8A')-  ,("Xeharmenian", '\x053D')-  ,("Xi", '\x039E')-  ,("Xmonospace", '\xFF38')-  ,("Xsmall", '\xF778')-  ,("Y", '\x0059')-  ,("Yacute", '\x00DD')-  ,("Yacutesmall", '\xF7FD')-  ,("Yatcyrillic", '\x0462')-  ,("Ycircle", '\x24CE')-  ,("Ycircumflex", '\x0176')-  ,("Ydieresis", '\x0178')-  ,("Ydieresissmall", '\xF7FF')-  ,("Ydotaccent", '\x1E8E')-  ,("Ydotbelow", '\x1EF4')-  ,("Yericyrillic", '\x042B')-  ,("Yerudieresiscyrillic", '\x04F8')-  ,("Ygrave", '\x1EF2')-  ,("Yhook", '\x01B3')-  ,("Yhookabove", '\x1EF6')-  ,("Yiarmenian", '\x0545')-  ,("Yicyrillic", '\x0407')-  ,("Yiwnarmenian", '\x0552')-  ,("Ymonospace", '\xFF39')-  ,("Ysmall", '\xF779')-  ,("Ytilde", '\x1EF8')-  ,("Yusbigcyrillic", '\x046A')-  ,("Yusbigiotifiedcyrillic", '\x046C')-  ,("Yuslittlecyrillic", '\x0466')-  ,("Yuslittleiotifiedcyrillic", '\x0468')-  ,("Z", '\x005A')-  ,("Zaarmenian", '\x0536')-  ,("Zacute", '\x0179')-  ,("Zcaron", '\x017D')-  ,("Zcaronsmall", '\xF6FF')-  ,("Zcircle", '\x24CF')-  ,("Zcircumflex", '\x1E90')-  ,("Zdot", '\x017B')-  ,("Zdotaccent", '\x017B')-  ,("Zdotbelow", '\x1E92')-  ,("Zecyrillic", '\x0417')-  ,("Zedescendercyrillic", '\x0498')-  ,("Zedieresiscyrillic", '\x04DE')-  ,("Zeta", '\x0396')-  ,("Zhearmenian", '\x053A')-  ,("Zhebrevecyrillic", '\x04C1')-  ,("Zhecyrillic", '\x0416')-  ,("Zhedescendercyrillic", '\x0496')-  ,("Zhedieresiscyrillic", '\x04DC')-  ,("Zlinebelow", '\x1E94')-  ,("Zmonospace", '\xFF3A')-  ,("Zsmall", '\xF77A')-  ,("Zstroke", '\x01B5')-  ,("a", '\x0061')-  ,("aabengali", '\x0986')-  ,("aacute", '\x00E1')-  ,("aadeva", '\x0906')-  ,("aagujarati", '\x0A86')-  ,("aagurmukhi", '\x0A06')-  ,("aamatragurmukhi", '\x0A3E')-  ,("aarusquare", '\x3303')-  ,("aavowelsignbengali", '\x09BE')-  ,("aavowelsigndeva", '\x093E')-  ,("aavowelsigngujarati", '\x0ABE')-  ,("abbreviationmarkarmenian", '\x055F')-  ,("abbreviationsigndeva", '\x0970')-  ,("abengali", '\x0985')-  ,("abopomofo", '\x311A')-  ,("abreve", '\x0103')-  ,("abreveacute", '\x1EAF')-  ,("abrevecyrillic", '\x04D1')-  ,("abrevedotbelow", '\x1EB7')-  ,("abrevegrave", '\x1EB1')-  ,("abrevehookabove", '\x1EB3')-  ,("abrevetilde", '\x1EB5')-  ,("acaron", '\x01CE')-  ,("acircle", '\x24D0')-  ,("acircumflex", '\x00E2')-  ,("acircumflexacute", '\x1EA5')-  ,("acircumflexdotbelow", '\x1EAD')-  ,("acircumflexgrave", '\x1EA7')-  ,("acircumflexhookabove", '\x1EA9')-  ,("acircumflextilde", '\x1EAB')-  ,("acute", '\x00B4')-  ,("acutebelowcmb", '\x0317')-  ,("acutecmb", '\x0301')-  ,("acutecomb", '\x0301')-  ,("acutedeva", '\x0954')-  ,("acutelowmod", '\x02CF')-  ,("acutetonecmb", '\x0341')-  ,("acyrillic", '\x0430')-  ,("adblgrave", '\x0201')-  ,("addakgurmukhi", '\x0A71')-  ,("adeva", '\x0905')-  ,("adieresis", '\x00E4')-  ,("adieresiscyrillic", '\x04D3')-  ,("adieresismacron", '\x01DF')-  ,("adotbelow", '\x1EA1')-  ,("adotmacron", '\x01E1')-  ,("ae", '\x00E6')-  ,("aeacute", '\x01FD')-  ,("aekorean", '\x3150')-  ,("aemacron", '\x01E3')-  ,("afii00208", '\x2015')-  ,("afii08941", '\x20A4')-  ,("afii10017", '\x0410')-  ,("afii10018", '\x0411')-  ,("afii10019", '\x0412')-  ,("afii10020", '\x0413')-  ,("afii10021", '\x0414')-  ,("afii10022", '\x0415')-  ,("afii10023", '\x0401')-  ,("afii10024", '\x0416')-  ,("afii10025", '\x0417')-  ,("afii10026", '\x0418')-  ,("afii10027", '\x0419')-  ,("afii10028", '\x041A')-  ,("afii10029", '\x041B')-  ,("afii10030", '\x041C')-  ,("afii10031", '\x041D')-  ,("afii10032", '\x041E')-  ,("afii10033", '\x041F')-  ,("afii10034", '\x0420')-  ,("afii10035", '\x0421')-  ,("afii10036", '\x0422')-  ,("afii10037", '\x0423')-  ,("afii10038", '\x0424')-  ,("afii10039", '\x0425')-  ,("afii10040", '\x0426')-  ,("afii10041", '\x0427')-  ,("afii10042", '\x0428')-  ,("afii10043", '\x0429')-  ,("afii10044", '\x042A')-  ,("afii10045", '\x042B')-  ,("afii10046", '\x042C')-  ,("afii10047", '\x042D')-  ,("afii10048", '\x042E')-  ,("afii10049", '\x042F')-  ,("afii10050", '\x0490')-  ,("afii10051", '\x0402')-  ,("afii10052", '\x0403')-  ,("afii10053", '\x0404')-  ,("afii10054", '\x0405')-  ,("afii10055", '\x0406')-  ,("afii10056", '\x0407')-  ,("afii10057", '\x0408')-  ,("afii10058", '\x0409')-  ,("afii10059", '\x040A')-  ,("afii10060", '\x040B')-  ,("afii10061", '\x040C')-  ,("afii10062", '\x040E')-  ,("afii10063", '\xF6C4')-  ,("afii10064", '\xF6C5')-  ,("afii10065", '\x0430')-  ,("afii10066", '\x0431')-  ,("afii10067", '\x0432')-  ,("afii10068", '\x0433')-  ,("afii10069", '\x0434')-  ,("afii10070", '\x0435')-  ,("afii10071", '\x0451')-  ,("afii10072", '\x0436')-  ,("afii10073", '\x0437')-  ,("afii10074", '\x0438')-  ,("afii10075", '\x0439')-  ,("afii10076", '\x043A')-  ,("afii10077", '\x043B')-  ,("afii10078", '\x043C')-  ,("afii10079", '\x043D')-  ,("afii10080", '\x043E')-  ,("afii10081", '\x043F')-  ,("afii10082", '\x0440')-  ,("afii10083", '\x0441')-  ,("afii10084", '\x0442')-  ,("afii10085", '\x0443')-  ,("afii10086", '\x0444')-  ,("afii10087", '\x0445')-  ,("afii10088", '\x0446')-  ,("afii10089", '\x0447')-  ,("afii10090", '\x0448')-  ,("afii10091", '\x0449')-  ,("afii10092", '\x044A')-  ,("afii10093", '\x044B')-  ,("afii10094", '\x044C')-  ,("afii10095", '\x044D')-  ,("afii10096", '\x044E')-  ,("afii10097", '\x044F')-  ,("afii10098", '\x0491')-  ,("afii10099", '\x0452')-  ,("afii10100", '\x0453')-  ,("afii10101", '\x0454')-  ,("afii10102", '\x0455')-  ,("afii10103", '\x0456')-  ,("afii10104", '\x0457')-  ,("afii10105", '\x0458')-  ,("afii10106", '\x0459')-  ,("afii10107", '\x045A')-  ,("afii10108", '\x045B')-  ,("afii10109", '\x045C')-  ,("afii10110", '\x045E')-  ,("afii10145", '\x040F')-  ,("afii10146", '\x0462')-  ,("afii10147", '\x0472')-  ,("afii10148", '\x0474')-  ,("afii10192", '\xF6C6')-  ,("afii10193", '\x045F')-  ,("afii10194", '\x0463')-  ,("afii10195", '\x0473')-  ,("afii10196", '\x0475')-  ,("afii10831", '\xF6C7')-  ,("afii10832", '\xF6C8')-  ,("afii10846", '\x04D9')-  ,("afii299", '\x200E')-  ,("afii300", '\x200F')-  ,("afii301", '\x200D')-  ,("afii57381", '\x066A')-  ,("afii57388", '\x060C')-  ,("afii57392", '\x0660')-  ,("afii57393", '\x0661')-  ,("afii57394", '\x0662')-  ,("afii57395", '\x0663')-  ,("afii57396", '\x0664')-  ,("afii57397", '\x0665')-  ,("afii57398", '\x0666')-  ,("afii57399", '\x0667')-  ,("afii57400", '\x0668')-  ,("afii57401", '\x0669')-  ,("afii57403", '\x061B')-  ,("afii57407", '\x061F')-  ,("afii57409", '\x0621')-  ,("afii57410", '\x0622')-  ,("afii57411", '\x0623')-  ,("afii57412", '\x0624')-  ,("afii57413", '\x0625')-  ,("afii57414", '\x0626')-  ,("afii57415", '\x0627')-  ,("afii57416", '\x0628')-  ,("afii57417", '\x0629')-  ,("afii57418", '\x062A')-  ,("afii57419", '\x062B')-  ,("afii57420", '\x062C')-  ,("afii57421", '\x062D')-  ,("afii57422", '\x062E')-  ,("afii57423", '\x062F')-  ,("afii57424", '\x0630')-  ,("afii57425", '\x0631')-  ,("afii57426", '\x0632')-  ,("afii57427", '\x0633')-  ,("afii57428", '\x0634')-  ,("afii57429", '\x0635')-  ,("afii57430", '\x0636')-  ,("afii57431", '\x0637')-  ,("afii57432", '\x0638')-  ,("afii57433", '\x0639')-  ,("afii57434", '\x063A')-  ,("afii57440", '\x0640')-  ,("afii57441", '\x0641')-  ,("afii57442", '\x0642')-  ,("afii57443", '\x0643')-  ,("afii57444", '\x0644')-  ,("afii57445", '\x0645')-  ,("afii57446", '\x0646')-  ,("afii57448", '\x0648')-  ,("afii57449", '\x0649')-  ,("afii57450", '\x064A')-  ,("afii57451", '\x064B')-  ,("afii57452", '\x064C')-  ,("afii57453", '\x064D')-  ,("afii57454", '\x064E')-  ,("afii57455", '\x064F')-  ,("afii57456", '\x0650')-  ,("afii57457", '\x0651')-  ,("afii57458", '\x0652')-  ,("afii57470", '\x0647')-  ,("afii57505", '\x06A4')-  ,("afii57506", '\x067E')-  ,("afii57507", '\x0686')-  ,("afii57508", '\x0698')-  ,("afii57509", '\x06AF')-  ,("afii57511", '\x0679')-  ,("afii57512", '\x0688')-  ,("afii57513", '\x0691')-  ,("afii57514", '\x06BA')-  ,("afii57519", '\x06D2')-  ,("afii57534", '\x06D5')-  ,("afii57636", '\x20AA')-  ,("afii57645", '\x05BE')-  ,("afii57658", '\x05C3')-  ,("afii57664", '\x05D0')-  ,("afii57665", '\x05D1')-  ,("afii57666", '\x05D2')-  ,("afii57667", '\x05D3')-  ,("afii57668", '\x05D4')-  ,("afii57669", '\x05D5')-  ,("afii57670", '\x05D6')-  ,("afii57671", '\x05D7')-  ,("afii57672", '\x05D8')-  ,("afii57673", '\x05D9')-  ,("afii57674", '\x05DA')-  ,("afii57675", '\x05DB')-  ,("afii57676", '\x05DC')-  ,("afii57677", '\x05DD')-  ,("afii57678", '\x05DE')-  ,("afii57679", '\x05DF')-  ,("afii57680", '\x05E0')-  ,("afii57681", '\x05E1')-  ,("afii57682", '\x05E2')-  ,("afii57683", '\x05E3')-  ,("afii57684", '\x05E4')-  ,("afii57685", '\x05E5')-  ,("afii57686", '\x05E6')-  ,("afii57687", '\x05E7')-  ,("afii57688", '\x05E8')-  ,("afii57689", '\x05E9')-  ,("afii57690", '\x05EA')-  ,("afii57694", '\xFB2A')-  ,("afii57695", '\xFB2B')-  ,("afii57700", '\xFB4B')-  ,("afii57705", '\xFB1F')-  ,("afii57716", '\x05F0')-  ,("afii57717", '\x05F1')-  ,("afii57718", '\x05F2')-  ,("afii57723", '\xFB35')-  ,("afii57793", '\x05B4')-  ,("afii57794", '\x05B5')-  ,("afii57795", '\x05B6')-  ,("afii57796", '\x05BB')-  ,("afii57797", '\x05B8')-  ,("afii57798", '\x05B7')-  ,("afii57799", '\x05B0')-  ,("afii57800", '\x05B2')-  ,("afii57801", '\x05B1')-  ,("afii57802", '\x05B3')-  ,("afii57803", '\x05C2')-  ,("afii57804", '\x05C1')-  ,("afii57806", '\x05B9')-  ,("afii57807", '\x05BC')-  ,("afii57839", '\x05BD')-  ,("afii57841", '\x05BF')-  ,("afii57842", '\x05C0')-  ,("afii57929", '\x02BC')-  ,("afii61248", '\x2105')-  ,("afii61289", '\x2113')-  ,("afii61352", '\x2116')-  ,("afii61573", '\x202C')-  ,("afii61574", '\x202D')-  ,("afii61575", '\x202E')-  ,("afii61664", '\x200C')-  ,("afii63167", '\x066D')-  ,("afii64937", '\x02BD')-  ,("agrave", '\x00E0')-  ,("agujarati", '\x0A85')-  ,("agurmukhi", '\x0A05')-  ,("ahiragana", '\x3042')-  ,("ahookabove", '\x1EA3')-  ,("aibengali", '\x0990')-  ,("aibopomofo", '\x311E')-  ,("aideva", '\x0910')-  ,("aiecyrillic", '\x04D5')-  ,("aigujarati", '\x0A90')-  ,("aigurmukhi", '\x0A10')-  ,("aimatragurmukhi", '\x0A48')-  ,("ainarabic", '\x0639')-  ,("ainfinalarabic", '\xFECA')-  ,("aininitialarabic", '\xFECB')-  ,("ainmedialarabic", '\xFECC')-  ,("ainvertedbreve", '\x0203')-  ,("aivowelsignbengali", '\x09C8')-  ,("aivowelsigndeva", '\x0948')-  ,("aivowelsigngujarati", '\x0AC8')-  ,("akatakana", '\x30A2')-  ,("akatakanahalfwidth", '\xFF71')-  ,("akorean", '\x314F')-  ,("alef", '\x05D0')-  ,("alefarabic", '\x0627')-  ,("alefdageshhebrew", '\xFB30')-  ,("aleffinalarabic", '\xFE8E')-  ,("alefhamzaabovearabic", '\x0623')-  ,("alefhamzaabovefinalarabic", '\xFE84')-  ,("alefhamzabelowarabic", '\x0625')-  ,("alefhamzabelowfinalarabic", '\xFE88')-  ,("alefhebrew", '\x05D0')-  ,("aleflamedhebrew", '\xFB4F')-  ,("alefmaddaabovearabic", '\x0622')-  ,("alefmaddaabovefinalarabic", '\xFE82')-  ,("alefmaksuraarabic", '\x0649')-  ,("alefmaksurafinalarabic", '\xFEF0')-  ,("alefmaksurainitialarabic", '\xFEF3')-  ,("alefmaksuramedialarabic", '\xFEF4')-  ,("alefpatahhebrew", '\xFB2E')-  ,("alefqamatshebrew", '\xFB2F')-  ,("aleph", '\x2135')-  ,("allequal", '\x224C')-  ,("alpha", '\x03B1')-  ,("alphatonos", '\x03AC')-  ,("amacron", '\x0101')-  ,("amonospace", '\xFF41')-  ,("ampersand", '\x0026')-  ,("ampersandmonospace", '\xFF06')-  ,("ampersandsmall", '\xF726')-  ,("amsquare", '\x33C2')-  ,("anbopomofo", '\x3122')-  ,("angbopomofo", '\x3124')-  ,("angkhankhuthai", '\x0E5A')-  ,("angle", '\x2220')-  ,("anglebracketleft", '\x3008')-  ,("anglebracketleftvertical", '\xFE3F')-  ,("anglebracketright", '\x3009')-  ,("anglebracketrightvertical", '\xFE40')-  ,("angleleft", '\x2329')-  ,("angleright", '\x232A')-  ,("angstrom", '\x212B')-  ,("anoteleia", '\x0387')-  ,("anudattadeva", '\x0952')-  ,("anusvarabengali", '\x0982')-  ,("anusvaradeva", '\x0902')-  ,("anusvaragujarati", '\x0A82')-  ,("aogonek", '\x0105')-  ,("apaatosquare", '\x3300')-  ,("aparen", '\x249C')-  ,("apostrophearmenian", '\x055A')-  ,("apostrophemod", '\x02BC')-  ,("apple", '\xF8FF')-  ,("approaches", '\x2250')-  ,("approxequal", '\x2248')-  ,("approxequalorimage", '\x2252')-  ,("approximatelyequal", '\x2245')-  ,("araeaekorean", '\x318E')-  ,("araeakorean", '\x318D')-  ,("arc", '\x2312')-  ,("arighthalfring", '\x1E9A')-  ,("aring", '\x00E5')-  ,("aringacute", '\x01FB')-  ,("aringbelow", '\x1E01')-  ,("arrowboth", '\x2194')-  ,("arrowdashdown", '\x21E3')-  ,("arrowdashleft", '\x21E0')-  ,("arrowdashright", '\x21E2')-  ,("arrowdashup", '\x21E1')-  ,("arrowdblboth", '\x21D4')-  ,("arrowdbldown", '\x21D3')-  ,("arrowdblleft", '\x21D0')-  ,("arrowdblright", '\x21D2')-  ,("arrowdblup", '\x21D1')-  ,("arrowdown", '\x2193')-  ,("arrowdownleft", '\x2199')-  ,("arrowdownright", '\x2198')-  ,("arrowdownwhite", '\x21E9')-  ,("arrowheaddownmod", '\x02C5')-  ,("arrowheadleftmod", '\x02C2')-  ,("arrowheadrightmod", '\x02C3')-  ,("arrowheadupmod", '\x02C4')-  ,("arrowhorizex", '\xF8E7')-  ,("arrowleft", '\x2190')-  ,("arrowleftdbl", '\x21D0')-  ,("arrowleftdblstroke", '\x21CD')-  ,("arrowleftoverright", '\x21C6')-  ,("arrowleftwhite", '\x21E6')-  ,("arrowright", '\x2192')-  ,("arrowrightdblstroke", '\x21CF')-  ,("arrowrightheavy", '\x279E')-  ,("arrowrightoverleft", '\x21C4')-  ,("arrowrightwhite", '\x21E8')-  ,("arrowtableft", '\x21E4')-  ,("arrowtabright", '\x21E5')-  ,("arrowup", '\x2191')-  ,("arrowupdn", '\x2195')-  ,("arrowupdnbse", '\x21A8')-  ,("arrowupdownbase", '\x21A8')-  ,("arrowupleft", '\x2196')-  ,("arrowupleftofdown", '\x21C5')-  ,("arrowupright", '\x2197')-  ,("arrowupwhite", '\x21E7')-  ,("arrowvertex", '\xF8E6')-  ,("asciicircum", '\x005E')-  ,("asciicircummonospace", '\xFF3E')-  ,("asciitilde", '\x007E')-  ,("asciitildemonospace", '\xFF5E')-  ,("ascript", '\x0251')-  ,("ascriptturned", '\x0252')-  ,("asmallhiragana", '\x3041')-  ,("asmallkatakana", '\x30A1')-  ,("asmallkatakanahalfwidth", '\xFF67')-  ,("asterisk", '\x002A')-  ,("asteriskaltonearabic", '\x066D')-  ,("asteriskarabic", '\x066D')-  ,("asteriskmath", '\x2217')-  ,("asteriskmonospace", '\xFF0A')-  ,("asterisksmall", '\xFE61')-  ,("asterism", '\x2042')-  ,("asuperior", '\xF6E9')-  ,("asymptoticallyequal", '\x2243')-  ,("at", '\x0040')-  ,("atilde", '\x00E3')-  ,("atmonospace", '\xFF20')-  ,("atsmall", '\xFE6B')-  ,("aturned", '\x0250')-  ,("aubengali", '\x0994')-  ,("aubopomofo", '\x3120')-  ,("audeva", '\x0914')-  ,("augujarati", '\x0A94')-  ,("augurmukhi", '\x0A14')-  ,("aulengthmarkbengali", '\x09D7')-  ,("aumatragurmukhi", '\x0A4C')-  ,("auvowelsignbengali", '\x09CC')-  ,("auvowelsigndeva", '\x094C')-  ,("auvowelsigngujarati", '\x0ACC')-  ,("avagrahadeva", '\x093D')-  ,("aybarmenian", '\x0561')-  ,("ayin", '\x05E2')-  ,("ayinaltonehebrew", '\xFB20')-  ,("ayinhebrew", '\x05E2')-  ,("b", '\x0062')-  ,("babengali", '\x09AC')-  ,("backslash", '\x005C')-  ,("backslashmonospace", '\xFF3C')-  ,("badeva", '\x092C')-  ,("bagujarati", '\x0AAC')-  ,("bagurmukhi", '\x0A2C')-  ,("bahiragana", '\x3070')-  ,("bahtthai", '\x0E3F')-  ,("bakatakana", '\x30D0')-  ,("bar", '\x007C')-  ,("barmonospace", '\xFF5C')-  ,("bbopomofo", '\x3105')-  ,("bcircle", '\x24D1')-  ,("bdotaccent", '\x1E03')-  ,("bdotbelow", '\x1E05')-  ,("beamedsixteenthnotes", '\x266C')-  ,("because", '\x2235')-  ,("becyrillic", '\x0431')-  ,("beharabic", '\x0628')-  ,("behfinalarabic", '\xFE90')-  ,("behinitialarabic", '\xFE91')-  ,("behiragana", '\x3079')-  ,("behmedialarabic", '\xFE92')-  ,("behmeeminitialarabic", '\xFC9F')-  ,("behmeemisolatedarabic", '\xFC08')-  ,("behnoonfinalarabic", '\xFC6D')-  ,("bekatakana", '\x30D9')-  ,("benarmenian", '\x0562')-  ,("bet", '\x05D1')-  ,("beta", '\x03B2')-  ,("betasymbolgreek", '\x03D0')-  ,("betdagesh", '\xFB31')-  ,("betdageshhebrew", '\xFB31')-  ,("bethebrew", '\x05D1')-  ,("betrafehebrew", '\xFB4C')-  ,("bhabengali", '\x09AD')-  ,("bhadeva", '\x092D')-  ,("bhagujarati", '\x0AAD')-  ,("bhagurmukhi", '\x0A2D')-  ,("bhook", '\x0253')-  ,("bihiragana", '\x3073')-  ,("bikatakana", '\x30D3')-  ,("bilabialclick", '\x0298')-  ,("bindigurmukhi", '\x0A02')-  ,("birusquare", '\x3331')-  ,("blackcircle", '\x25CF')-  ,("blackdiamond", '\x25C6')-  ,("blackdownpointingtriangle", '\x25BC')-  ,("blackleftpointingpointer", '\x25C4')-  ,("blackleftpointingtriangle", '\x25C0')-  ,("blacklenticularbracketleft", '\x3010')-  ,("blacklenticularbracketleftvertical", '\xFE3B')-  ,("blacklenticularbracketright", '\x3011')-  ,("blacklenticularbracketrightvertical", '\xFE3C')-  ,("blacklowerlefttriangle", '\x25E3')-  ,("blacklowerrighttriangle", '\x25E2')-  ,("blackrectangle", '\x25AC')-  ,("blackrightpointingpointer", '\x25BA')-  ,("blackrightpointingtriangle", '\x25B6')-  ,("blacksmallsquare", '\x25AA')-  ,("blacksmilingface", '\x263B')-  ,("blacksquare", '\x25A0')-  ,("blackstar", '\x2605')-  ,("blackupperlefttriangle", '\x25E4')-  ,("blackupperrighttriangle", '\x25E5')-  ,("blackuppointingsmalltriangle", '\x25B4')-  ,("blackuppointingtriangle", '\x25B2')-  ,("blank", '\x2423')-  ,("blinebelow", '\x1E07')-  ,("block", '\x2588')-  ,("bmonospace", '\xFF42')-  ,("bobaimaithai", '\x0E1A')-  ,("bohiragana", '\x307C')-  ,("bokatakana", '\x30DC')-  ,("bparen", '\x249D')-  ,("bqsquare", '\x33C3')-  ,("braceex", '\xF8F4')-  ,("braceleft", '\x007B')-  ,("braceleftbt", '\xF8F3')-  ,("braceleftmid", '\xF8F2')-  ,("braceleftmonospace", '\xFF5B')-  ,("braceleftsmall", '\xFE5B')-  ,("bracelefttp", '\xF8F1')-  ,("braceleftvertical", '\xFE37')-  ,("braceright", '\x007D')-  ,("bracerightbt", '\xF8FE')-  ,("bracerightmid", '\xF8FD')-  ,("bracerightmonospace", '\xFF5D')-  ,("bracerightsmall", '\xFE5C')-  ,("bracerighttp", '\xF8FC')-  ,("bracerightvertical", '\xFE38')-  ,("bracketleft", '\x005B')-  ,("bracketleftbt", '\xF8F0')-  ,("bracketleftex", '\xF8EF')-  ,("bracketleftmonospace", '\xFF3B')-  ,("bracketlefttp", '\xF8EE')-  ,("bracketright", '\x005D')-  ,("bracketrightbt", '\xF8FB')-  ,("bracketrightex", '\xF8FA')-  ,("bracketrightmonospace", '\xFF3D')-  ,("bracketrighttp", '\xF8F9')-  ,("breve", '\x02D8')-  ,("brevebelowcmb", '\x032E')-  ,("brevecmb", '\x0306')-  ,("breveinvertedbelowcmb", '\x032F')-  ,("breveinvertedcmb", '\x0311')-  ,("breveinverteddoublecmb", '\x0361')-  ,("bridgebelowcmb", '\x032A')-  ,("bridgeinvertedbelowcmb", '\x033A')-  ,("brokenbar", '\x00A6')-  ,("bstroke", '\x0180')-  ,("bsuperior", '\xF6EA')-  ,("btopbar", '\x0183')-  ,("buhiragana", '\x3076')-  ,("bukatakana", '\x30D6')-  ,("bullet", '\x2022')-  ,("bulletinverse", '\x25D8')-  ,("bulletoperator", '\x2219')-  ,("bullseye", '\x25CE')-  ,("c", '\x0063')-  ,("caarmenian", '\x056E')-  ,("cabengali", '\x099A')-  ,("cacute", '\x0107')-  ,("cadeva", '\x091A')-  ,("cagujarati", '\x0A9A')-  ,("cagurmukhi", '\x0A1A')-  ,("calsquare", '\x3388')-  ,("candrabindubengali", '\x0981')-  ,("candrabinducmb", '\x0310')-  ,("candrabindudeva", '\x0901')-  ,("candrabindugujarati", '\x0A81')-  ,("capslock", '\x21EA')-  ,("careof", '\x2105')-  ,("caron", '\x02C7')-  ,("caronbelowcmb", '\x032C')-  ,("caroncmb", '\x030C')-  ,("carriagereturn", '\x21B5')-  ,("cbopomofo", '\x3118')-  ,("ccaron", '\x010D')-  ,("ccedilla", '\x00E7')-  ,("ccedillaacute", '\x1E09')-  ,("ccircle", '\x24D2')-  ,("ccircumflex", '\x0109')-  ,("ccurl", '\x0255')-  ,("cdot", '\x010B')-  ,("cdotaccent", '\x010B')-  ,("cdsquare", '\x33C5')-  ,("cedilla", '\x00B8')-  ,("cedillacmb", '\x0327')-  ,("cent", '\x00A2')-  ,("centigrade", '\x2103')-  ,("centinferior", '\xF6DF')-  ,("centmonospace", '\xFFE0')-  ,("centoldstyle", '\xF7A2')-  ,("centsuperior", '\xF6E0')-  ,("chaarmenian", '\x0579')-  ,("chabengali", '\x099B')-  ,("chadeva", '\x091B')-  ,("chagujarati", '\x0A9B')-  ,("chagurmukhi", '\x0A1B')-  ,("chbopomofo", '\x3114')-  ,("cheabkhasiancyrillic", '\x04BD')-  ,("checkmark", '\x2713')-  ,("checyrillic", '\x0447')-  ,("chedescenderabkhasiancyrillic", '\x04BF')-  ,("chedescendercyrillic", '\x04B7')-  ,("chedieresiscyrillic", '\x04F5')-  ,("cheharmenian", '\x0573')-  ,("chekhakassiancyrillic", '\x04CC')-  ,("cheverticalstrokecyrillic", '\x04B9')-  ,("chi", '\x03C7')-  ,("chieuchacirclekorean", '\x3277')-  ,("chieuchaparenkorean", '\x3217')-  ,("chieuchcirclekorean", '\x3269')-  ,("chieuchkorean", '\x314A')-  ,("chieuchparenkorean", '\x3209')-  ,("chochangthai", '\x0E0A')-  ,("chochanthai", '\x0E08')-  ,("chochingthai", '\x0E09')-  ,("chochoethai", '\x0E0C')-  ,("chook", '\x0188')-  ,("cieucacirclekorean", '\x3276')-  ,("cieucaparenkorean", '\x3216')-  ,("cieuccirclekorean", '\x3268')-  ,("cieuckorean", '\x3148')-  ,("cieucparenkorean", '\x3208')-  ,("cieucuparenkorean", '\x321C')-  ,("circle", '\x25CB')-  ,("circlemultiply", '\x2297')-  ,("circleot", '\x2299')-  ,("circleplus", '\x2295')-  ,("circlepostalmark", '\x3036')-  ,("circlewithlefthalfblack", '\x25D0')-  ,("circlewithrighthalfblack", '\x25D1')-  ,("circumflex", '\x02C6')-  ,("circumflexbelowcmb", '\x032D')-  ,("circumflexcmb", '\x0302')-  ,("clear", '\x2327')-  ,("clickalveolar", '\x01C2')-  ,("clickdental", '\x01C0')-  ,("clicklateral", '\x01C1')-  ,("clickretroflex", '\x01C3')-  ,("club", '\x2663')-  ,("clubsuitblack", '\x2663')-  ,("clubsuitwhite", '\x2667')-  ,("cmcubedsquare", '\x33A4')-  ,("cmonospace", '\xFF43')-  ,("cmsquaredsquare", '\x33A0')-  ,("coarmenian", '\x0581')-  ,("colon", '\x003A')-  ,("colonmonetary", '\x20A1')-  ,("colonmonospace", '\xFF1A')-  ,("colonsign", '\x20A1')-  ,("colonsmall", '\xFE55')-  ,("colontriangularhalfmod", '\x02D1')-  ,("colontriangularmod", '\x02D0')-  ,("comma", '\x002C')-  ,("commaabovecmb", '\x0313')-  ,("commaaboverightcmb", '\x0315')-  ,("commaaccent", '\xF6C3')-  ,("commaarabic", '\x060C')-  ,("commaarmenian", '\x055D')-  ,("commainferior", '\xF6E1')-  ,("commamonospace", '\xFF0C')-  ,("commareversedabovecmb", '\x0314')-  ,("commareversedmod", '\x02BD')-  ,("commasmall", '\xFE50')-  ,("commasuperior", '\xF6E2')-  ,("commaturnedabovecmb", '\x0312')-  ,("commaturnedmod", '\x02BB')-  ,("compass", '\x263C')-  ,("congruent", '\x2245')-  ,("contourintegral", '\x222E')-  ,("control", '\x2303')-  ,("controlACK", '\x0006')-  ,("controlBEL", '\x0007')-  ,("controlBS", '\x0008')-  ,("controlCAN", '\x0018')-  ,("controlCR", '\x000D')-  ,("controlDC1", '\x0011')-  ,("controlDC2", '\x0012')-  ,("controlDC3", '\x0013')-  ,("controlDC4", '\x0014')-  ,("controlDEL", '\x007F')-  ,("controlDLE", '\x0010')-  ,("controlEM", '\x0019')-  ,("controlENQ", '\x0005')-  ,("controlEOT", '\x0004')-  ,("controlESC", '\x001B')-  ,("controlETB", '\x0017')-  ,("controlETX", '\x0003')-  ,("controlFF", '\x000C')-  ,("controlFS", '\x001C')-  ,("controlGS", '\x001D')-  ,("controlHT", '\x0009')-  ,("controlLF", '\x000A')-  ,("controlNAK", '\x0015')-  ,("controlRS", '\x001E')-  ,("controlSI", '\x000F')-  ,("controlSO", '\x000E')-  ,("controlSOT", '\x0002')-  ,("controlSTX", '\x0001')-  ,("controlSUB", '\x001A')-  ,("controlSYN", '\x0016')-  ,("controlUS", '\x001F')-  ,("controlVT", '\x000B')-  ,("copyright", '\x00A9')-  ,("copyrightsans", '\xF8E9')-  ,("copyrightserif", '\xF6D9')-  ,("cornerbracketleft", '\x300C')-  ,("cornerbracketlefthalfwidth", '\xFF62')-  ,("cornerbracketleftvertical", '\xFE41')-  ,("cornerbracketright", '\x300D')-  ,("cornerbracketrighthalfwidth", '\xFF63')-  ,("cornerbracketrightvertical", '\xFE42')-  ,("corporationsquare", '\x337F')-  ,("cosquare", '\x33C7')-  ,("coverkgsquare", '\x33C6')-  ,("cparen", '\x249E')-  ,("cruzeiro", '\x20A2')-  ,("cstretched", '\x0297')-  ,("curlyand", '\x22CF')-  ,("curlyor", '\x22CE')-  ,("currency", '\x00A4')-  ,("cyrBreve", '\xF6D1')-  ,("cyrFlex", '\xF6D2')-  ,("cyrbreve", '\xF6D4')-  ,("cyrflex", '\xF6D5')-  ,("d", '\x0064')-  ,("daarmenian", '\x0564')-  ,("dabengali", '\x09A6')-  ,("dadarabic", '\x0636')-  ,("dadeva", '\x0926')-  ,("dadfinalarabic", '\xFEBE')-  ,("dadinitialarabic", '\xFEBF')-  ,("dadmedialarabic", '\xFEC0')-  ,("dagesh", '\x05BC')-  ,("dageshhebrew", '\x05BC')-  ,("dagger", '\x2020')-  ,("daggerdbl", '\x2021')-  ,("dagujarati", '\x0AA6')-  ,("dagurmukhi", '\x0A26')-  ,("dahiragana", '\x3060')-  ,("dakatakana", '\x30C0')-  ,("dalarabic", '\x062F')-  ,("dalet", '\x05D3')-  ,("daletdagesh", '\xFB33')-  ,("daletdageshhebrew", '\xFB33')-  ,("dalethatafpatah", '\x05D3')-  ,("dalethatafpatahhebrew", '\x05D3')-  ,("dalethatafsegol", '\x05D3')-  ,("dalethatafsegolhebrew", '\x05D3')-  ,("dalethebrew", '\x05D3')-  ,("dalethiriq", '\x05D3')-  ,("dalethiriqhebrew", '\x05D3')-  ,("daletholam", '\x05D3')-  ,("daletholamhebrew", '\x05D3')-  ,("daletpatah", '\x05D3')-  ,("daletpatahhebrew", '\x05D3')-  ,("daletqamats", '\x05D3')-  ,("daletqamatshebrew", '\x05D3')-  ,("daletqubuts", '\x05D3')-  ,("daletqubutshebrew", '\x05D3')-  ,("daletsegol", '\x05D3')-  ,("daletsegolhebrew", '\x05D3')-  ,("daletsheva", '\x05D3')-  ,("daletshevahebrew", '\x05D3')-  ,("dalettsere", '\x05D3')-  ,("dalettserehebrew", '\x05D3')-  ,("dalfinalarabic", '\xFEAA')-  ,("dammaarabic", '\x064F')-  ,("dammalowarabic", '\x064F')-  ,("dammatanaltonearabic", '\x064C')-  ,("dammatanarabic", '\x064C')-  ,("danda", '\x0964')-  ,("dargahebrew", '\x05A7')-  ,("dargalefthebrew", '\x05A7')-  ,("dasiapneumatacyrilliccmb", '\x0485')-  ,("dblGrave", '\xF6D3')-  ,("dblanglebracketleft", '\x300A')-  ,("dblanglebracketleftvertical", '\xFE3D')-  ,("dblanglebracketright", '\x300B')-  ,("dblanglebracketrightvertical", '\xFE3E')-  ,("dblarchinvertedbelowcmb", '\x032B')-  ,("dblarrowleft", '\x21D4')-  ,("dblarrowright", '\x21D2')-  ,("dbldanda", '\x0965')-  ,("dblgrave", '\xF6D6')-  ,("dblgravecmb", '\x030F')-  ,("dblintegral", '\x222C')-  ,("dbllowline", '\x2017')-  ,("dbllowlinecmb", '\x0333')-  ,("dbloverlinecmb", '\x033F')-  ,("dblprimemod", '\x02BA')-  ,("dblverticalbar", '\x2016')-  ,("dblverticallineabovecmb", '\x030E')-  ,("dbopomofo", '\x3109')-  ,("dbsquare", '\x33C8')-  ,("dcaron", '\x010F')-  ,("dcedilla", '\x1E11')-  ,("dcircle", '\x24D3')-  ,("dcircumflexbelow", '\x1E13')-  ,("dcroat", '\x0111')-  ,("ddabengali", '\x09A1')-  ,("ddadeva", '\x0921')-  ,("ddagujarati", '\x0AA1')-  ,("ddagurmukhi", '\x0A21')-  ,("ddalarabic", '\x0688')-  ,("ddalfinalarabic", '\xFB89')-  ,("dddhadeva", '\x095C')-  ,("ddhabengali", '\x09A2')-  ,("ddhadeva", '\x0922')-  ,("ddhagujarati", '\x0AA2')-  ,("ddhagurmukhi", '\x0A22')-  ,("ddotaccent", '\x1E0B')-  ,("ddotbelow", '\x1E0D')-  ,("decimalseparatorarabic", '\x066B')-  ,("decimalseparatorpersian", '\x066B')-  ,("decyrillic", '\x0434')-  ,("degree", '\x00B0')-  ,("dehihebrew", '\x05AD')-  ,("dehiragana", '\x3067')-  ,("deicoptic", '\x03EF')-  ,("dekatakana", '\x30C7')-  ,("deleteleft", '\x232B')-  ,("deleteright", '\x2326')-  ,("delta", '\x03B4')-  ,("deltaturned", '\x018D')-  ,("denominatorminusonenumeratorbengali", '\x09F8')-  ,("dezh", '\x02A4')-  ,("dhabengali", '\x09A7')-  ,("dhadeva", '\x0927')-  ,("dhagujarati", '\x0AA7')-  ,("dhagurmukhi", '\x0A27')-  ,("dhook", '\x0257')-  ,("dialytikatonos", '\x0385')-  ,("dialytikatonoscmb", '\x0344')-  ,("diamond", '\x2666')-  ,("diamondsuitwhite", '\x2662')-  ,("dieresis", '\x00A8')-  ,("dieresisacute", '\xF6D7')-  ,("dieresisbelowcmb", '\x0324')-  ,("dieresiscmb", '\x0308')-  ,("dieresisgrave", '\xF6D8')-  ,("dieresistonos", '\x0385')-  ,("dihiragana", '\x3062')-  ,("dikatakana", '\x30C2')-  ,("dittomark", '\x3003')-  ,("divide", '\x00F7')-  ,("divides", '\x2223')-  ,("divisionslash", '\x2215')-  ,("djecyrillic", '\x0452')-  ,("dkshade", '\x2593')-  ,("dlinebelow", '\x1E0F')-  ,("dlsquare", '\x3397')-  ,("dmacron", '\x0111')-  ,("dmonospace", '\xFF44')-  ,("dnblock", '\x2584')-  ,("dochadathai", '\x0E0E')-  ,("dodekthai", '\x0E14')-  ,("dohiragana", '\x3069')-  ,("dokatakana", '\x30C9')-  ,("dollar", '\x0024')-  ,("dollarinferior", '\xF6E3')-  ,("dollarmonospace", '\xFF04')-  ,("dollaroldstyle", '\xF724')-  ,("dollarsmall", '\xFE69')-  ,("dollarsuperior", '\xF6E4')-  ,("dong", '\x20AB')-  ,("dorusquare", '\x3326')-  ,("dotaccent", '\x02D9')-  ,("dotaccentcmb", '\x0307')-  ,("dotbelowcmb", '\x0323')-  ,("dotbelowcomb", '\x0323')-  ,("dotkatakana", '\x30FB')-  ,("dotlessi", '\x0131')-  ,("dotlessj", '\xF6BE')-  ,("dotlessjstrokehook", '\x0284')-  ,("dotmath", '\x22C5')-  ,("dottedcircle", '\x25CC')-  ,("doubleyodpatah", '\xFB1F')-  ,("doubleyodpatahhebrew", '\xFB1F')-  ,("downtackbelowcmb", '\x031E')-  ,("downtackmod", '\x02D5')-  ,("dparen", '\x249F')-  ,("dsuperior", '\xF6EB')-  ,("dtail", '\x0256')-  ,("dtopbar", '\x018C')-  ,("duhiragana", '\x3065')-  ,("dukatakana", '\x30C5')-  ,("dz", '\x01F3')-  ,("dzaltone", '\x02A3')-  ,("dzcaron", '\x01C6')-  ,("dzcurl", '\x02A5')-  ,("dzeabkhasiancyrillic", '\x04E1')-  ,("dzecyrillic", '\x0455')-  ,("dzhecyrillic", '\x045F')-  ,("e", '\x0065')-  ,("eacute", '\x00E9')-  ,("earth", '\x2641')-  ,("ebengali", '\x098F')-  ,("ebopomofo", '\x311C')-  ,("ebreve", '\x0115')-  ,("ecandradeva", '\x090D')-  ,("ecandragujarati", '\x0A8D')-  ,("ecandravowelsigndeva", '\x0945')-  ,("ecandravowelsigngujarati", '\x0AC5')-  ,("ecaron", '\x011B')-  ,("ecedillabreve", '\x1E1D')-  ,("echarmenian", '\x0565')-  ,("echyiwnarmenian", '\x0587')-  ,("ecircle", '\x24D4')-  ,("ecircumflex", '\x00EA')-  ,("ecircumflexacute", '\x1EBF')-  ,("ecircumflexbelow", '\x1E19')-  ,("ecircumflexdotbelow", '\x1EC7')-  ,("ecircumflexgrave", '\x1EC1')-  ,("ecircumflexhookabove", '\x1EC3')-  ,("ecircumflextilde", '\x1EC5')-  ,("ecyrillic", '\x0454')-  ,("edblgrave", '\x0205')-  ,("edeva", '\x090F')-  ,("edieresis", '\x00EB')-  ,("edot", '\x0117')-  ,("edotaccent", '\x0117')-  ,("edotbelow", '\x1EB9')-  ,("eegurmukhi", '\x0A0F')-  ,("eematragurmukhi", '\x0A47')-  ,("efcyrillic", '\x0444')-  ,("egrave", '\x00E8')-  ,("egujarati", '\x0A8F')-  ,("eharmenian", '\x0567')-  ,("ehbopomofo", '\x311D')-  ,("ehiragana", '\x3048')-  ,("ehookabove", '\x1EBB')-  ,("eibopomofo", '\x311F')-  ,("eight", '\x0038')-  ,("eightarabic", '\x0668')-  ,("eightbengali", '\x09EE')-  ,("eightcircle", '\x2467')-  ,("eightcircleinversesansserif", '\x2791')-  ,("eightdeva", '\x096E')-  ,("eighteencircle", '\x2471')-  ,("eighteenparen", '\x2485')-  ,("eighteenperiod", '\x2499')-  ,("eightgujarati", '\x0AEE')-  ,("eightgurmukhi", '\x0A6E')-  ,("eighthackarabic", '\x0668')-  ,("eighthangzhou", '\x3028')-  ,("eighthnotebeamed", '\x266B')-  ,("eightideographicparen", '\x3227')-  ,("eightinferior", '\x2088')-  ,("eightmonospace", '\xFF18')-  ,("eightoldstyle", '\xF738')-  ,("eightparen", '\x247B')-  ,("eightperiod", '\x248F')-  ,("eightpersian", '\x06F8')-  ,("eightroman", '\x2177')-  ,("eightsuperior", '\x2078')-  ,("eightthai", '\x0E58')-  ,("einvertedbreve", '\x0207')-  ,("eiotifiedcyrillic", '\x0465')-  ,("ekatakana", '\x30A8')-  ,("ekatakanahalfwidth", '\xFF74')-  ,("ekonkargurmukhi", '\x0A74')-  ,("ekorean", '\x3154')-  ,("elcyrillic", '\x043B')-  ,("element", '\x2208')-  ,("elevencircle", '\x246A')-  ,("elevenparen", '\x247E')-  ,("elevenperiod", '\x2492')-  ,("elevenroman", '\x217A')-  ,("ellipsis", '\x2026')-  ,("ellipsisvertical", '\x22EE')-  ,("emacron", '\x0113')-  ,("emacronacute", '\x1E17')-  ,("emacrongrave", '\x1E15')-  ,("emcyrillic", '\x043C')-  ,("emdash", '\x2014')-  ,("emdashvertical", '\xFE31')-  ,("emonospace", '\xFF45')-  ,("emphasismarkarmenian", '\x055B')-  ,("emptyset", '\x2205')-  ,("enbopomofo", '\x3123')-  ,("encyrillic", '\x043D')-  ,("endash", '\x2013')-  ,("endashvertical", '\xFE32')-  ,("endescendercyrillic", '\x04A3')-  ,("eng", '\x014B')-  ,("engbopomofo", '\x3125')-  ,("enghecyrillic", '\x04A5')-  ,("enhookcyrillic", '\x04C8')-  ,("enspace", '\x2002')-  ,("eogonek", '\x0119')-  ,("eokorean", '\x3153')-  ,("eopen", '\x025B')-  ,("eopenclosed", '\x029A')-  ,("eopenreversed", '\x025C')-  ,("eopenreversedclosed", '\x025E')-  ,("eopenreversedhook", '\x025D')-  ,("eparen", '\x24A0')-  ,("epsilon", '\x03B5')-  ,("epsilontonos", '\x03AD')-  ,("equal", '\x003D')-  ,("equalmonospace", '\xFF1D')-  ,("equalsmall", '\xFE66')-  ,("equalsuperior", '\x207C')-  ,("equivalence", '\x2261')-  ,("erbopomofo", '\x3126')-  ,("ercyrillic", '\x0440')-  ,("ereversed", '\x0258')-  ,("ereversedcyrillic", '\x044D')-  ,("escyrillic", '\x0441')-  ,("esdescendercyrillic", '\x04AB')-  ,("esh", '\x0283')-  ,("eshcurl", '\x0286')-  ,("eshortdeva", '\x090E')-  ,("eshortvowelsigndeva", '\x0946')-  ,("eshreversedloop", '\x01AA')-  ,("eshsquatreversed", '\x0285')-  ,("esmallhiragana", '\x3047')-  ,("esmallkatakana", '\x30A7')-  ,("esmallkatakanahalfwidth", '\xFF6A')-  ,("estimated", '\x212E')-  ,("esuperior", '\xF6EC')-  ,("eta", '\x03B7')-  ,("etarmenian", '\x0568')-  ,("etatonos", '\x03AE')-  ,("eth", '\x00F0')-  ,("etilde", '\x1EBD')-  ,("etildebelow", '\x1E1B')-  ,("etnahtafoukhhebrew", '\x0591')-  ,("etnahtafoukhlefthebrew", '\x0591')-  ,("etnahtahebrew", '\x0591')-  ,("etnahtalefthebrew", '\x0591')-  ,("eturned", '\x01DD')-  ,("eukorean", '\x3161')-  ,("euro", '\x20AC')-  ,("evowelsignbengali", '\x09C7')-  ,("evowelsigndeva", '\x0947')-  ,("evowelsigngujarati", '\x0AC7')-  ,("exclam", '\x0021')-  ,("exclamarmenian", '\x055C')-  ,("exclamdbl", '\x203C')-  ,("exclamdown", '\x00A1')-  ,("exclamdownsmall", '\xF7A1')-  ,("exclammonospace", '\xFF01')-  ,("exclamsmall", '\xF721')-  ,("existential", '\x2203')-  ,("ezh", '\x0292')-  ,("ezhcaron", '\x01EF')-  ,("ezhcurl", '\x0293')-  ,("ezhreversed", '\x01B9')-  ,("ezhtail", '\x01BA')-  ,("f", '\x0066')-  ,("fadeva", '\x095E')-  ,("fagurmukhi", '\x0A5E')-  ,("fahrenheit", '\x2109')-  ,("fathaarabic", '\x064E')-  ,("fathalowarabic", '\x064E')-  ,("fathatanarabic", '\x064B')-  ,("fbopomofo", '\x3108')-  ,("fcircle", '\x24D5')-  ,("fdotaccent", '\x1E1F')-  ,("feharabic", '\x0641')-  ,("feharmenian", '\x0586')-  ,("fehfinalarabic", '\xFED2')-  ,("fehinitialarabic", '\xFED3')-  ,("fehmedialarabic", '\xFED4')-  ,("feicoptic", '\x03E5')-  ,("female", '\x2640')-  ,("ff", '\xFB00')-  ,("ffi", '\xFB03')-  ,("ffl", '\xFB04')-  ,("fi", '\xFB01')-  ,("fifteencircle", '\x246E')-  ,("fifteenparen", '\x2482')-  ,("fifteenperiod", '\x2496')-  ,("figuredash", '\x2012')-  ,("filledbox", '\x25A0')-  ,("filledrect", '\x25AC')-  ,("finalkaf", '\x05DA')-  ,("finalkafdagesh", '\xFB3A')-  ,("finalkafdageshhebrew", '\xFB3A')-  ,("finalkafhebrew", '\x05DA')-  ,("finalkafqamats", '\x05DA')-  ,("finalkafqamatshebrew", '\x05DA')-  ,("finalkafsheva", '\x05DA')-  ,("finalkafshevahebrew", '\x05DA')-  ,("finalmem", '\x05DD')-  ,("finalmemhebrew", '\x05DD')-  ,("finalnun", '\x05DF')-  ,("finalnunhebrew", '\x05DF')-  ,("finalpe", '\x05E3')-  ,("finalpehebrew", '\x05E3')-  ,("finaltsadi", '\x05E5')-  ,("finaltsadihebrew", '\x05E5')-  ,("firsttonechinese", '\x02C9')-  ,("fisheye", '\x25C9')-  ,("fitacyrillic", '\x0473')-  ,("five", '\x0035')-  ,("fivearabic", '\x0665')-  ,("fivebengali", '\x09EB')-  ,("fivecircle", '\x2464')-  ,("fivecircleinversesansserif", '\x278E')-  ,("fivedeva", '\x096B')-  ,("fiveeighths", '\x215D')-  ,("fivegujarati", '\x0AEB')-  ,("fivegurmukhi", '\x0A6B')-  ,("fivehackarabic", '\x0665')-  ,("fivehangzhou", '\x3025')-  ,("fiveideographicparen", '\x3224')-  ,("fiveinferior", '\x2085')-  ,("fivemonospace", '\xFF15')-  ,("fiveoldstyle", '\xF735')-  ,("fiveparen", '\x2478')-  ,("fiveperiod", '\x248C')-  ,("fivepersian", '\x06F5')-  ,("fiveroman", '\x2174')-  ,("fivesuperior", '\x2075')-  ,("fivethai", '\x0E55')-  ,("fl", '\xFB02')-  ,("florin", '\x0192')-  ,("fmonospace", '\xFF46')-  ,("fmsquare", '\x3399')-  ,("fofanthai", '\x0E1F')-  ,("fofathai", '\x0E1D')-  ,("fongmanthai", '\x0E4F')-  ,("forall", '\x2200')-  ,("four", '\x0034')-  ,("fourarabic", '\x0664')-  ,("fourbengali", '\x09EA')-  ,("fourcircle", '\x2463')-  ,("fourcircleinversesansserif", '\x278D')-  ,("fourdeva", '\x096A')-  ,("fourgujarati", '\x0AEA')-  ,("fourgurmukhi", '\x0A6A')-  ,("fourhackarabic", '\x0664')-  ,("fourhangzhou", '\x3024')-  ,("fourideographicparen", '\x3223')-  ,("fourinferior", '\x2084')-  ,("fourmonospace", '\xFF14')-  ,("fournumeratorbengali", '\x09F7')-  ,("fouroldstyle", '\xF734')-  ,("fourparen", '\x2477')-  ,("fourperiod", '\x248B')-  ,("fourpersian", '\x06F4')-  ,("fourroman", '\x2173')-  ,("foursuperior", '\x2074')-  ,("fourteencircle", '\x246D')-  ,("fourteenparen", '\x2481')-  ,("fourteenperiod", '\x2495')-  ,("fourthai", '\x0E54')-  ,("fourthtonechinese", '\x02CB')-  ,("fparen", '\x24A1')-  ,("fraction", '\x2044')-  ,("franc", '\x20A3')-  ,("g", '\x0067')-  ,("gabengali", '\x0997')-  ,("gacute", '\x01F5')-  ,("gadeva", '\x0917')-  ,("gafarabic", '\x06AF')-  ,("gaffinalarabic", '\xFB93')-  ,("gafinitialarabic", '\xFB94')-  ,("gafmedialarabic", '\xFB95')-  ,("gagujarati", '\x0A97')-  ,("gagurmukhi", '\x0A17')-  ,("gahiragana", '\x304C')-  ,("gakatakana", '\x30AC')-  ,("gamma", '\x03B3')-  ,("gammalatinsmall", '\x0263')-  ,("gammasuperior", '\x02E0')-  ,("gangiacoptic", '\x03EB')-  ,("gbopomofo", '\x310D')-  ,("gbreve", '\x011F')-  ,("gcaron", '\x01E7')-  ,("gcedilla", '\x0123')-  ,("gcircle", '\x24D6')-  ,("gcircumflex", '\x011D')-  ,("gcommaaccent", '\x0123')-  ,("gdot", '\x0121')-  ,("gdotaccent", '\x0121')-  ,("gecyrillic", '\x0433')-  ,("gehiragana", '\x3052')-  ,("gekatakana", '\x30B2')-  ,("geometricallyequal", '\x2251')-  ,("gereshaccenthebrew", '\x059C')-  ,("gereshhebrew", '\x05F3')-  ,("gereshmuqdamhebrew", '\x059D')-  ,("germandbls", '\x00DF')-  ,("gershayimaccenthebrew", '\x059E')-  ,("gershayimhebrew", '\x05F4')-  ,("getamark", '\x3013')-  ,("ghabengali", '\x0998')-  ,("ghadarmenian", '\x0572')-  ,("ghadeva", '\x0918')-  ,("ghagujarati", '\x0A98')-  ,("ghagurmukhi", '\x0A18')-  ,("ghainarabic", '\x063A')-  ,("ghainfinalarabic", '\xFECE')-  ,("ghaininitialarabic", '\xFECF')-  ,("ghainmedialarabic", '\xFED0')-  ,("ghemiddlehookcyrillic", '\x0495')-  ,("ghestrokecyrillic", '\x0493')-  ,("gheupturncyrillic", '\x0491')-  ,("ghhadeva", '\x095A')-  ,("ghhagurmukhi", '\x0A5A')-  ,("ghook", '\x0260')-  ,("ghzsquare", '\x3393')-  ,("gihiragana", '\x304E')-  ,("gikatakana", '\x30AE')-  ,("gimarmenian", '\x0563')-  ,("gimel", '\x05D2')-  ,("gimeldagesh", '\xFB32')-  ,("gimeldageshhebrew", '\xFB32')-  ,("gimelhebrew", '\x05D2')-  ,("gjecyrillic", '\x0453')-  ,("glottalinvertedstroke", '\x01BE')-  ,("glottalstop", '\x0294')-  ,("glottalstopinverted", '\x0296')-  ,("glottalstopmod", '\x02C0')-  ,("glottalstopreversed", '\x0295')-  ,("glottalstopreversedmod", '\x02C1')-  ,("glottalstopreversedsuperior", '\x02E4')-  ,("glottalstopstroke", '\x02A1')-  ,("glottalstopstrokereversed", '\x02A2')-  ,("gmacron", '\x1E21')-  ,("gmonospace", '\xFF47')-  ,("gohiragana", '\x3054')-  ,("gokatakana", '\x30B4')-  ,("gparen", '\x24A2')-  ,("gpasquare", '\x33AC')-  ,("gradient", '\x2207')-  ,("grave", '\x0060')-  ,("gravebelowcmb", '\x0316')-  ,("gravecmb", '\x0300')-  ,("gravecomb", '\x0300')-  ,("gravedeva", '\x0953')-  ,("gravelowmod", '\x02CE')-  ,("gravemonospace", '\xFF40')-  ,("gravetonecmb", '\x0340')-  ,("greater", '\x003E')-  ,("greaterequal", '\x2265')-  ,("greaterequalorless", '\x22DB')-  ,("greatermonospace", '\xFF1E')-  ,("greaterorequivalent", '\x2273')-  ,("greaterorless", '\x2277')-  ,("greateroverequal", '\x2267')-  ,("greatersmall", '\xFE65')-  ,("gscript", '\x0261')-  ,("gstroke", '\x01E5')-  ,("guhiragana", '\x3050')-  ,("guillemotleft", '\x00AB')-  ,("guillemotright", '\x00BB')-  ,("guilsinglleft", '\x2039')-  ,("guilsinglright", '\x203A')-  ,("gukatakana", '\x30B0')-  ,("guramusquare", '\x3318')-  ,("gysquare", '\x33C9')-  ,("h", '\x0068')-  ,("haabkhasiancyrillic", '\x04A9')-  ,("haaltonearabic", '\x06C1')-  ,("habengali", '\x09B9')-  ,("hadescendercyrillic", '\x04B3')-  ,("hadeva", '\x0939')-  ,("hagujarati", '\x0AB9')-  ,("hagurmukhi", '\x0A39')-  ,("haharabic", '\x062D')-  ,("hahfinalarabic", '\xFEA2')-  ,("hahinitialarabic", '\xFEA3')-  ,("hahiragana", '\x306F')-  ,("hahmedialarabic", '\xFEA4')-  ,("haitusquare", '\x332A')-  ,("hakatakana", '\x30CF')-  ,("hakatakanahalfwidth", '\xFF8A')-  ,("halantgurmukhi", '\x0A4D')-  ,("hamzaarabic", '\x0621')-  ,("hamzadammaarabic", '\x0621')-  ,("hamzadammatanarabic", '\x0621')-  ,("hamzafathaarabic", '\x0621')-  ,("hamzafathatanarabic", '\x0621')-  ,("hamzalowarabic", '\x0621')-  ,("hamzalowkasraarabic", '\x0621')-  ,("hamzalowkasratanarabic", '\x0621')-  ,("hamzasukunarabic", '\x0621')-  ,("hangulfiller", '\x3164')-  ,("hardsigncyrillic", '\x044A')-  ,("harpoonleftbarbup", '\x21BC')-  ,("harpoonrightbarbup", '\x21C0')-  ,("hasquare", '\x33CA')-  ,("hatafpatah", '\x05B2')-  ,("hatafpatah16", '\x05B2')-  ,("hatafpatah23", '\x05B2')-  ,("hatafpatah2f", '\x05B2')-  ,("hatafpatahhebrew", '\x05B2')-  ,("hatafpatahnarrowhebrew", '\x05B2')-  ,("hatafpatahquarterhebrew", '\x05B2')-  ,("hatafpatahwidehebrew", '\x05B2')-  ,("hatafqamats", '\x05B3')-  ,("hatafqamats1b", '\x05B3')-  ,("hatafqamats28", '\x05B3')-  ,("hatafqamats34", '\x05B3')-  ,("hatafqamatshebrew", '\x05B3')-  ,("hatafqamatsnarrowhebrew", '\x05B3')-  ,("hatafqamatsquarterhebrew", '\x05B3')-  ,("hatafqamatswidehebrew", '\x05B3')-  ,("hatafsegol", '\x05B1')-  ,("hatafsegol17", '\x05B1')-  ,("hatafsegol24", '\x05B1')-  ,("hatafsegol30", '\x05B1')-  ,("hatafsegolhebrew", '\x05B1')-  ,("hatafsegolnarrowhebrew", '\x05B1')-  ,("hatafsegolquarterhebrew", '\x05B1')-  ,("hatafsegolwidehebrew", '\x05B1')-  ,("hbar", '\x0127')-  ,("hbopomofo", '\x310F')-  ,("hbrevebelow", '\x1E2B')-  ,("hcedilla", '\x1E29')-  ,("hcircle", '\x24D7')-  ,("hcircumflex", '\x0125')-  ,("hdieresis", '\x1E27')-  ,("hdotaccent", '\x1E23')-  ,("hdotbelow", '\x1E25')-  ,("he", '\x05D4')-  ,("heart", '\x2665')-  ,("heartsuitblack", '\x2665')-  ,("heartsuitwhite", '\x2661')-  ,("hedagesh", '\xFB34')-  ,("hedageshhebrew", '\xFB34')-  ,("hehaltonearabic", '\x06C1')-  ,("heharabic", '\x0647')-  ,("hehebrew", '\x05D4')-  ,("hehfinalaltonearabic", '\xFBA7')-  ,("hehfinalalttwoarabic", '\xFEEA')-  ,("hehfinalarabic", '\xFEEA')-  ,("hehhamzaabovefinalarabic", '\xFBA5')-  ,("hehhamzaaboveisolatedarabic", '\xFBA4')-  ,("hehinitialaltonearabic", '\xFBA8')-  ,("hehinitialarabic", '\xFEEB')-  ,("hehiragana", '\x3078')-  ,("hehmedialaltonearabic", '\xFBA9')-  ,("hehmedialarabic", '\xFEEC')-  ,("heiseierasquare", '\x337B')-  ,("hekatakana", '\x30D8')-  ,("hekatakanahalfwidth", '\xFF8D')-  ,("hekutaarusquare", '\x3336')-  ,("henghook", '\x0267')-  ,("herutusquare", '\x3339')-  ,("het", '\x05D7')-  ,("hethebrew", '\x05D7')-  ,("hhook", '\x0266')-  ,("hhooksuperior", '\x02B1')-  ,("hieuhacirclekorean", '\x327B')-  ,("hieuhaparenkorean", '\x321B')-  ,("hieuhcirclekorean", '\x326D')-  ,("hieuhkorean", '\x314E')-  ,("hieuhparenkorean", '\x320D')-  ,("hihiragana", '\x3072')-  ,("hikatakana", '\x30D2')-  ,("hikatakanahalfwidth", '\xFF8B')-  ,("hiriq", '\x05B4')-  ,("hiriq14", '\x05B4')-  ,("hiriq21", '\x05B4')-  ,("hiriq2d", '\x05B4')-  ,("hiriqhebrew", '\x05B4')-  ,("hiriqnarrowhebrew", '\x05B4')-  ,("hiriqquarterhebrew", '\x05B4')-  ,("hiriqwidehebrew", '\x05B4')-  ,("hlinebelow", '\x1E96')-  ,("hmonospace", '\xFF48')-  ,("hoarmenian", '\x0570')-  ,("hohipthai", '\x0E2B')-  ,("hohiragana", '\x307B')-  ,("hokatakana", '\x30DB')-  ,("hokatakanahalfwidth", '\xFF8E')-  ,("holam", '\x05B9')-  ,("holam19", '\x05B9')-  ,("holam26", '\x05B9')-  ,("holam32", '\x05B9')-  ,("holamhebrew", '\x05B9')-  ,("holamnarrowhebrew", '\x05B9')-  ,("holamquarterhebrew", '\x05B9')-  ,("holamwidehebrew", '\x05B9')-  ,("honokhukthai", '\x0E2E')-  ,("hookabovecomb", '\x0309')-  ,("hookcmb", '\x0309')-  ,("hookpalatalizedbelowcmb", '\x0321')-  ,("hookretroflexbelowcmb", '\x0322')-  ,("hoonsquare", '\x3342')-  ,("horicoptic", '\x03E9')-  ,("horizontalbar", '\x2015')-  ,("horncmb", '\x031B')-  ,("hotsprings", '\x2668')-  ,("house", '\x2302')-  ,("hparen", '\x24A3')-  ,("hsuperior", '\x02B0')-  ,("hturned", '\x0265')-  ,("huhiragana", '\x3075')-  ,("huiitosquare", '\x3333')-  ,("hukatakana", '\x30D5')-  ,("hukatakanahalfwidth", '\xFF8C')-  ,("hungarumlaut", '\x02DD')-  ,("hungarumlautcmb", '\x030B')-  ,("hv", '\x0195')-  ,("hyphen", '\x002D')-  ,("hypheninferior", '\xF6E5')-  ,("hyphenmonospace", '\xFF0D')-  ,("hyphensmall", '\xFE63')-  ,("hyphensuperior", '\xF6E6')-  ,("hyphentwo", '\x2010')-  ,("i", '\x0069')-  ,("iacute", '\x00ED')-  ,("iacyrillic", '\x044F')-  ,("ibengali", '\x0987')-  ,("ibopomofo", '\x3127')-  ,("ibreve", '\x012D')-  ,("icaron", '\x01D0')-  ,("icircle", '\x24D8')-  ,("icircumflex", '\x00EE')-  ,("icyrillic", '\x0456')-  ,("idblgrave", '\x0209')-  ,("ideographearthcircle", '\x328F')-  ,("ideographfirecircle", '\x328B')-  ,("ideographicallianceparen", '\x323F')-  ,("ideographiccallparen", '\x323A')-  ,("ideographiccentrecircle", '\x32A5')-  ,("ideographicclose", '\x3006')-  ,("ideographiccomma", '\x3001')-  ,("ideographiccommaleft", '\xFF64')-  ,("ideographiccongratulationparen", '\x3237')-  ,("ideographiccorrectcircle", '\x32A3')-  ,("ideographicearthparen", '\x322F')-  ,("ideographicenterpriseparen", '\x323D')-  ,("ideographicexcellentcircle", '\x329D')-  ,("ideographicfestivalparen", '\x3240')-  ,("ideographicfinancialcircle", '\x3296')-  ,("ideographicfinancialparen", '\x3236')-  ,("ideographicfireparen", '\x322B')-  ,("ideographichaveparen", '\x3232')-  ,("ideographichighcircle", '\x32A4')-  ,("ideographiciterationmark", '\x3005')-  ,("ideographiclaborcircle", '\x3298')-  ,("ideographiclaborparen", '\x3238')-  ,("ideographicleftcircle", '\x32A7')-  ,("ideographiclowcircle", '\x32A6')-  ,("ideographicmedicinecircle", '\x32A9')-  ,("ideographicmetalparen", '\x322E')-  ,("ideographicmoonparen", '\x322A')-  ,("ideographicnameparen", '\x3234')-  ,("ideographicperiod", '\x3002')-  ,("ideographicprintcircle", '\x329E')-  ,("ideographicreachparen", '\x3243')-  ,("ideographicrepresentparen", '\x3239')-  ,("ideographicresourceparen", '\x323E')-  ,("ideographicrightcircle", '\x32A8')-  ,("ideographicsecretcircle", '\x3299')-  ,("ideographicselfparen", '\x3242')-  ,("ideographicsocietyparen", '\x3233')-  ,("ideographicspace", '\x3000')-  ,("ideographicspecialparen", '\x3235')-  ,("ideographicstockparen", '\x3231')-  ,("ideographicstudyparen", '\x323B')-  ,("ideographicsunparen", '\x3230')-  ,("ideographicsuperviseparen", '\x323C')-  ,("ideographicwaterparen", '\x322C')-  ,("ideographicwoodparen", '\x322D')-  ,("ideographiczero", '\x3007')-  ,("ideographmetalcircle", '\x328E')-  ,("ideographmooncircle", '\x328A')-  ,("ideographnamecircle", '\x3294')-  ,("ideographsuncircle", '\x3290')-  ,("ideographwatercircle", '\x328C')-  ,("ideographwoodcircle", '\x328D')-  ,("ideva", '\x0907')-  ,("idieresis", '\x00EF')-  ,("idieresisacute", '\x1E2F')-  ,("idieresiscyrillic", '\x04E5')-  ,("idotbelow", '\x1ECB')-  ,("iebrevecyrillic", '\x04D7')-  ,("iecyrillic", '\x0435')-  ,("ieungacirclekorean", '\x3275')-  ,("ieungaparenkorean", '\x3215')-  ,("ieungcirclekorean", '\x3267')-  ,("ieungkorean", '\x3147')-  ,("ieungparenkorean", '\x3207')-  ,("igrave", '\x00EC')-  ,("igujarati", '\x0A87')-  ,("igurmukhi", '\x0A07')-  ,("ihiragana", '\x3044')-  ,("ihookabove", '\x1EC9')-  ,("iibengali", '\x0988')-  ,("iicyrillic", '\x0438')-  ,("iideva", '\x0908')-  ,("iigujarati", '\x0A88')-  ,("iigurmukhi", '\x0A08')-  ,("iimatragurmukhi", '\x0A40')-  ,("iinvertedbreve", '\x020B')-  ,("iishortcyrillic", '\x0439')-  ,("iivowelsignbengali", '\x09C0')-  ,("iivowelsigndeva", '\x0940')-  ,("iivowelsigngujarati", '\x0AC0')-  ,("ij", '\x0133')-  ,("ikatakana", '\x30A4')-  ,("ikatakanahalfwidth", '\xFF72')-  ,("ikorean", '\x3163')-  ,("ilde", '\x02DC')-  ,("iluyhebrew", '\x05AC')-  ,("imacron", '\x012B')-  ,("imacroncyrillic", '\x04E3')-  ,("imageorapproximatelyequal", '\x2253')-  ,("imatragurmukhi", '\x0A3F')-  ,("imonospace", '\xFF49')-  ,("increment", '\x2206')-  ,("infinity", '\x221E')-  ,("iniarmenian", '\x056B')-  ,("integral", '\x222B')-  ,("integralbottom", '\x2321')-  ,("integralbt", '\x2321')-  ,("integralex", '\xF8F5')-  ,("integraltop", '\x2320')-  ,("integraltp", '\x2320')-  ,("intersection", '\x2229')-  ,("intisquare", '\x3305')-  ,("invbullet", '\x25D8')-  ,("invcircle", '\x25D9')-  ,("invsmileface", '\x263B')-  ,("iocyrillic", '\x0451')-  ,("iogonek", '\x012F')-  ,("iota", '\x03B9')-  ,("iotadieresis", '\x03CA')-  ,("iotadieresistonos", '\x0390')-  ,("iotalatin", '\x0269')-  ,("iotatonos", '\x03AF')-  ,("iparen", '\x24A4')-  ,("irigurmukhi", '\x0A72')-  ,("ismallhiragana", '\x3043')-  ,("ismallkatakana", '\x30A3')-  ,("ismallkatakanahalfwidth", '\xFF68')-  ,("issharbengali", '\x09FA')-  ,("istroke", '\x0268')-  ,("isuperior", '\xF6ED')-  ,("iterationhiragana", '\x309D')-  ,("iterationkatakana", '\x30FD')-  ,("itilde", '\x0129')-  ,("itildebelow", '\x1E2D')-  ,("iubopomofo", '\x3129')-  ,("iucyrillic", '\x044E')-  ,("ivowelsignbengali", '\x09BF')-  ,("ivowelsigndeva", '\x093F')-  ,("ivowelsigngujarati", '\x0ABF')-  ,("izhitsacyrillic", '\x0475')-  ,("izhitsadblgravecyrillic", '\x0477')-  ,("j", '\x006A')-  ,("jaarmenian", '\x0571')-  ,("jabengali", '\x099C')-  ,("jadeva", '\x091C')-  ,("jagujarati", '\x0A9C')-  ,("jagurmukhi", '\x0A1C')-  ,("jbopomofo", '\x3110')-  ,("jcaron", '\x01F0')-  ,("jcircle", '\x24D9')-  ,("jcircumflex", '\x0135')-  ,("jcrossedtail", '\x029D')-  ,("jdotlessstroke", '\x025F')-  ,("jecyrillic", '\x0458')-  ,("jeemarabic", '\x062C')-  ,("jeemfinalarabic", '\xFE9E')-  ,("jeeminitialarabic", '\xFE9F')-  ,("jeemmedialarabic", '\xFEA0')-  ,("jeharabic", '\x0698')-  ,("jehfinalarabic", '\xFB8B')-  ,("jhabengali", '\x099D')-  ,("jhadeva", '\x091D')-  ,("jhagujarati", '\x0A9D')-  ,("jhagurmukhi", '\x0A1D')-  ,("jheharmenian", '\x057B')-  ,("jis", '\x3004')-  ,("jmonospace", '\xFF4A')-  ,("jparen", '\x24A5')-  ,("jsuperior", '\x02B2')-  ,("k", '\x006B')-  ,("kabashkircyrillic", '\x04A1')-  ,("kabengali", '\x0995')-  ,("kacute", '\x1E31')-  ,("kacyrillic", '\x043A')-  ,("kadescendercyrillic", '\x049B')-  ,("kadeva", '\x0915')-  ,("kaf", '\x05DB')-  ,("kafarabic", '\x0643')-  ,("kafdagesh", '\xFB3B')-  ,("kafdageshhebrew", '\xFB3B')-  ,("kaffinalarabic", '\xFEDA')-  ,("kafhebrew", '\x05DB')-  ,("kafinitialarabic", '\xFEDB')-  ,("kafmedialarabic", '\xFEDC')-  ,("kafrafehebrew", '\xFB4D')-  ,("kagujarati", '\x0A95')-  ,("kagurmukhi", '\x0A15')-  ,("kahiragana", '\x304B')-  ,("kahookcyrillic", '\x04C4')-  ,("kakatakana", '\x30AB')-  ,("kakatakanahalfwidth", '\xFF76')-  ,("kappa", '\x03BA')-  ,("kappasymbolgreek", '\x03F0')-  ,("kapyeounmieumkorean", '\x3171')-  ,("kapyeounphieuphkorean", '\x3184')-  ,("kapyeounpieupkorean", '\x3178')-  ,("kapyeounssangpieupkorean", '\x3179')-  ,("karoriisquare", '\x330D')-  ,("kashidaautoarabic", '\x0640')-  ,("kashidaautonosidebearingarabic", '\x0640')-  ,("kasmallkatakana", '\x30F5')-  ,("kasquare", '\x3384')-  ,("kasraarabic", '\x0650')-  ,("kasratanarabic", '\x064D')-  ,("kastrokecyrillic", '\x049F')-  ,("katahiraprolongmarkhalfwidth", '\xFF70')-  ,("kaverticalstrokecyrillic", '\x049D')-  ,("kbopomofo", '\x310E')-  ,("kcalsquare", '\x3389')-  ,("kcaron", '\x01E9')-  ,("kcedilla", '\x0137')-  ,("kcircle", '\x24DA')-  ,("kcommaaccent", '\x0137')-  ,("kdotbelow", '\x1E33')-  ,("keharmenian", '\x0584')-  ,("kehiragana", '\x3051')-  ,("kekatakana", '\x30B1')-  ,("kekatakanahalfwidth", '\xFF79')-  ,("kenarmenian", '\x056F')-  ,("kesmallkatakana", '\x30F6')-  ,("kgreenlandic", '\x0138')-  ,("khabengali", '\x0996')-  ,("khacyrillic", '\x0445')-  ,("khadeva", '\x0916')-  ,("khagujarati", '\x0A96')-  ,("khagurmukhi", '\x0A16')-  ,("khaharabic", '\x062E')-  ,("khahfinalarabic", '\xFEA6')-  ,("khahinitialarabic", '\xFEA7')-  ,("khahmedialarabic", '\xFEA8')-  ,("kheicoptic", '\x03E7')-  ,("khhadeva", '\x0959')-  ,("khhagurmukhi", '\x0A59')-  ,("khieukhacirclekorean", '\x3278')-  ,("khieukhaparenkorean", '\x3218')-  ,("khieukhcirclekorean", '\x326A')-  ,("khieukhkorean", '\x314B')-  ,("khieukhparenkorean", '\x320A')-  ,("khokhaithai", '\x0E02')-  ,("khokhonthai", '\x0E05')-  ,("khokhuatthai", '\x0E03')-  ,("khokhwaithai", '\x0E04')-  ,("khomutthai", '\x0E5B')-  ,("khook", '\x0199')-  ,("khorakhangthai", '\x0E06')-  ,("khzsquare", '\x3391')-  ,("kihiragana", '\x304D')-  ,("kikatakana", '\x30AD')-  ,("kikatakanahalfwidth", '\xFF77')-  ,("kiroguramusquare", '\x3315')-  ,("kiromeetorusquare", '\x3316')-  ,("kirosquare", '\x3314')-  ,("kiyeokacirclekorean", '\x326E')-  ,("kiyeokaparenkorean", '\x320E')-  ,("kiyeokcirclekorean", '\x3260')-  ,("kiyeokkorean", '\x3131')-  ,("kiyeokparenkorean", '\x3200')-  ,("kiyeoksioskorean", '\x3133')-  ,("kjecyrillic", '\x045C')-  ,("klinebelow", '\x1E35')-  ,("klsquare", '\x3398')-  ,("kmcubedsquare", '\x33A6')-  ,("kmonospace", '\xFF4B')-  ,("kmsquaredsquare", '\x33A2')-  ,("kohiragana", '\x3053')-  ,("kohmsquare", '\x33C0')-  ,("kokaithai", '\x0E01')-  ,("kokatakana", '\x30B3')-  ,("kokatakanahalfwidth", '\xFF7A')-  ,("kooposquare", '\x331E')-  ,("koppacyrillic", '\x0481')-  ,("koreanstandardsymbol", '\x327F')-  ,("koroniscmb", '\x0343')-  ,("kparen", '\x24A6')-  ,("kpasquare", '\x33AA')-  ,("ksicyrillic", '\x046F')-  ,("ktsquare", '\x33CF')-  ,("kturned", '\x029E')-  ,("kuhiragana", '\x304F')-  ,("kukatakana", '\x30AF')-  ,("kukatakanahalfwidth", '\xFF78')-  ,("kvsquare", '\x33B8')-  ,("kwsquare", '\x33BE')-  ,("l", '\x006C')-  ,("labengali", '\x09B2')-  ,("lacute", '\x013A')-  ,("ladeva", '\x0932')-  ,("lagujarati", '\x0AB2')-  ,("lagurmukhi", '\x0A32')-  ,("lakkhangyaothai", '\x0E45')-  ,("lamaleffinalarabic", '\xFEFC')-  ,("lamalefhamzaabovefinalarabic", '\xFEF8')-  ,("lamalefhamzaaboveisolatedarabic", '\xFEF7')-  ,("lamalefhamzabelowfinalarabic", '\xFEFA')-  ,("lamalefhamzabelowisolatedarabic", '\xFEF9')-  ,("lamalefisolatedarabic", '\xFEFB')-  ,("lamalefmaddaabovefinalarabic", '\xFEF6')-  ,("lamalefmaddaaboveisolatedarabic", '\xFEF5')-  ,("lamarabic", '\x0644')-  ,("lambda", '\x03BB')-  ,("lambdastroke", '\x019B')-  ,("lamed", '\x05DC')-  ,("lameddagesh", '\xFB3C')-  ,("lameddageshhebrew", '\xFB3C')-  ,("lamedhebrew", '\x05DC')-  ,("lamedholam", '\x05DC')-  ,("lamedholamdagesh", '\x05DC')-  ,("lamedholamdageshhebrew", '\x05DC')-  ,("lamedholamhebrew", '\x05DC')-  ,("lamfinalarabic", '\xFEDE')-  ,("lamhahinitialarabic", '\xFCCA')-  ,("laminitialarabic", '\xFEDF')-  ,("lamjeeminitialarabic", '\xFCC9')-  ,("lamkhahinitialarabic", '\xFCCB')-  ,("lamlamhehisolatedarabic", '\xFDF2')-  ,("lammedialarabic", '\xFEE0')-  ,("lammeemhahinitialarabic", '\xFD88')-  ,("lammeeminitialarabic", '\xFCCC')-  ,("lammeemjeeminitialarabic", '\xFEDF')-  ,("lammeemkhahinitialarabic", '\xFEDF')-  ,("largecircle", '\x25EF')-  ,("lbar", '\x019A')-  ,("lbelt", '\x026C')-  ,("lbopomofo", '\x310C')-  ,("lcaron", '\x013E')-  ,("lcedilla", '\x013C')-  ,("lcircle", '\x24DB')-  ,("lcircumflexbelow", '\x1E3D')-  ,("lcommaaccent", '\x013C')-  ,("ldot", '\x0140')-  ,("ldotaccent", '\x0140')-  ,("ldotbelow", '\x1E37')-  ,("ldotbelowmacron", '\x1E39')-  ,("leftangleabovecmb", '\x031A')-  ,("lefttackbelowcmb", '\x0318')-  ,("less", '\x003C')-  ,("lessequal", '\x2264')-  ,("lessequalorgreater", '\x22DA')-  ,("lessmonospace", '\xFF1C')-  ,("lessorequivalent", '\x2272')-  ,("lessorgreater", '\x2276')-  ,("lessoverequal", '\x2266')-  ,("lesssmall", '\xFE64')-  ,("lezh", '\x026E')-  ,("lfblock", '\x258C')-  ,("lhookretroflex", '\x026D')-  ,("lira", '\x20A4')-  ,("liwnarmenian", '\x056C')-  ,("lj", '\x01C9')-  ,("ljecyrillic", '\x0459')-  ,("ll", '\xF6C0')-  ,("lladeva", '\x0933')-  ,("llagujarati", '\x0AB3')-  ,("llinebelow", '\x1E3B')-  ,("llladeva", '\x0934')-  ,("llvocalicbengali", '\x09E1')-  ,("llvocalicdeva", '\x0961')-  ,("llvocalicvowelsignbengali", '\x09E3')-  ,("llvocalicvowelsigndeva", '\x0963')-  ,("lmiddletilde", '\x026B')-  ,("lmonospace", '\xFF4C')-  ,("lmsquare", '\x33D0')-  ,("lochulathai", '\x0E2C')-  ,("logicaland", '\x2227')-  ,("logicalnot", '\x00AC')-  ,("logicalnotreversed", '\x2310')-  ,("logicalor", '\x2228')-  ,("lolingthai", '\x0E25')-  ,("longs", '\x017F')-  ,("lowlinecenterline", '\xFE4E')-  ,("lowlinecmb", '\x0332')-  ,("lowlinedashed", '\xFE4D')-  ,("lozenge", '\x25CA')-  ,("lparen", '\x24A7')-  ,("lslash", '\x0142')-  ,("lsquare", '\x2113')-  ,("lsuperior", '\xF6EE')-  ,("ltshade", '\x2591')-  ,("luthai", '\x0E26')-  ,("lvocalicbengali", '\x098C')-  ,("lvocalicdeva", '\x090C')-  ,("lvocalicvowelsignbengali", '\x09E2')-  ,("lvocalicvowelsigndeva", '\x0962')-  ,("lxsquare", '\x33D3')-  ,("m", '\x006D')-  ,("mabengali", '\x09AE')-  ,("macron", '\x00AF')-  ,("macronbelowcmb", '\x0331')-  ,("macroncmb", '\x0304')-  ,("macronlowmod", '\x02CD')-  ,("macronmonospace", '\xFFE3')-  ,("macute", '\x1E3F')-  ,("madeva", '\x092E')-  ,("magujarati", '\x0AAE')-  ,("magurmukhi", '\x0A2E')-  ,("mahapakhhebrew", '\x05A4')-  ,("mahapakhlefthebrew", '\x05A4')-  ,("mahiragana", '\x307E')-  ,("maichattawalowleftthai", '\xF895')-  ,("maichattawalowrightthai", '\xF894')-  ,("maichattawathai", '\x0E4B')-  ,("maichattawaupperleftthai", '\xF893')-  ,("maieklowleftthai", '\xF88C')-  ,("maieklowrightthai", '\xF88B')-  ,("maiekthai", '\x0E48')-  ,("maiekupperleftthai", '\xF88A')-  ,("maihanakatleftthai", '\xF884')-  ,("maihanakatthai", '\x0E31')-  ,("maitaikhuleftthai", '\xF889')-  ,("maitaikhuthai", '\x0E47')-  ,("maitholowleftthai", '\xF88F')-  ,("maitholowrightthai", '\xF88E')-  ,("maithothai", '\x0E49')-  ,("maithoupperleftthai", '\xF88D')-  ,("maitrilowleftthai", '\xF892')-  ,("maitrilowrightthai", '\xF891')-  ,("maitrithai", '\x0E4A')-  ,("maitriupperleftthai", '\xF890')-  ,("maiyamokthai", '\x0E46')-  ,("makatakana", '\x30DE')-  ,("makatakanahalfwidth", '\xFF8F')-  ,("male", '\x2642')-  ,("mansyonsquare", '\x3347')-  ,("maqafhebrew", '\x05BE')-  ,("mars", '\x2642')-  ,("masoracirclehebrew", '\x05AF')-  ,("masquare", '\x3383')-  ,("mbopomofo", '\x3107')-  ,("mbsquare", '\x33D4')-  ,("mcircle", '\x24DC')-  ,("mcubedsquare", '\x33A5')-  ,("mdotaccent", '\x1E41')-  ,("mdotbelow", '\x1E43')-  ,("meemarabic", '\x0645')-  ,("meemfinalarabic", '\xFEE2')-  ,("meeminitialarabic", '\xFEE3')-  ,("meemmedialarabic", '\xFEE4')-  ,("meemmeeminitialarabic", '\xFCD1')-  ,("meemmeemisolatedarabic", '\xFC48')-  ,("meetorusquare", '\x334D')-  ,("mehiragana", '\x3081')-  ,("meizierasquare", '\x337E')-  ,("mekatakana", '\x30E1')-  ,("mekatakanahalfwidth", '\xFF92')-  ,("mem", '\x05DE')-  ,("memdagesh", '\xFB3E')-  ,("memdageshhebrew", '\xFB3E')-  ,("memhebrew", '\x05DE')-  ,("menarmenian", '\x0574')-  ,("merkhahebrew", '\x05A5')-  ,("merkhakefulahebrew", '\x05A6')-  ,("merkhakefulalefthebrew", '\x05A6')-  ,("merkhalefthebrew", '\x05A5')-  ,("mhook", '\x0271')-  ,("mhzsquare", '\x3392')-  ,("middledotkatakanahalfwidth", '\xFF65')-  ,("middot", '\x00B7')-  ,("mieumacirclekorean", '\x3272')-  ,("mieumaparenkorean", '\x3212')-  ,("mieumcirclekorean", '\x3264')-  ,("mieumkorean", '\x3141')-  ,("mieumpansioskorean", '\x3170')-  ,("mieumparenkorean", '\x3204')-  ,("mieumpieupkorean", '\x316E')-  ,("mieumsioskorean", '\x316F')-  ,("mihiragana", '\x307F')-  ,("mikatakana", '\x30DF')-  ,("mikatakanahalfwidth", '\xFF90')-  ,("minus", '\x2212')-  ,("minusbelowcmb", '\x0320')-  ,("minuscircle", '\x2296')-  ,("minusmod", '\x02D7')-  ,("minusplus", '\x2213')-  ,("minute", '\x2032')-  ,("miribaarusquare", '\x334A')-  ,("mirisquare", '\x3349')-  ,("mlonglegturned", '\x0270')-  ,("mlsquare", '\x3396')-  ,("mmcubedsquare", '\x33A3')-  ,("mmonospace", '\xFF4D')-  ,("mmsquaredsquare", '\x339F')-  ,("mohiragana", '\x3082')-  ,("mohmsquare", '\x33C1')-  ,("mokatakana", '\x30E2')-  ,("mokatakanahalfwidth", '\xFF93')-  ,("molsquare", '\x33D6')-  ,("momathai", '\x0E21')-  ,("moverssquare", '\x33A7')-  ,("moverssquaredsquare", '\x33A8')-  ,("mparen", '\x24A8')-  ,("mpasquare", '\x33AB')-  ,("mssquare", '\x33B3')-  ,("msuperior", '\xF6EF')-  ,("mturned", '\x026F')-  ,("mu", '\x00B5')-  ,("mu1", '\x00B5')-  ,("muasquare", '\x3382')-  ,("muchgreater", '\x226B')-  ,("muchless", '\x226A')-  ,("mufsquare", '\x338C')-  ,("mugreek", '\x03BC')-  ,("mugsquare", '\x338D')-  ,("muhiragana", '\x3080')-  ,("mukatakana", '\x30E0')-  ,("mukatakanahalfwidth", '\xFF91')-  ,("mulsquare", '\x3395')-  ,("multiply", '\x00D7')-  ,("mumsquare", '\x339B')-  ,("munahhebrew", '\x05A3')-  ,("munahlefthebrew", '\x05A3')-  ,("musicalnote", '\x266A')-  ,("musicalnotedbl", '\x266B')-  ,("musicflatsign", '\x266D')-  ,("musicsharpsign", '\x266F')-  ,("mussquare", '\x33B2')-  ,("muvsquare", '\x33B6')-  ,("muwsquare", '\x33BC')-  ,("mvmegasquare", '\x33B9')-  ,("mvsquare", '\x33B7')-  ,("mwmegasquare", '\x33BF')-  ,("mwsquare", '\x33BD')-  ,("n", '\x006E')-  ,("nabengali", '\x09A8')-  ,("nabla", '\x2207')-  ,("nacute", '\x0144')-  ,("nadeva", '\x0928')-  ,("nagujarati", '\x0AA8')-  ,("nagurmukhi", '\x0A28')-  ,("nahiragana", '\x306A')-  ,("nakatakana", '\x30CA')-  ,("nakatakanahalfwidth", '\xFF85')-  ,("napostrophe", '\x0149')-  ,("nasquare", '\x3381')-  ,("nbopomofo", '\x310B')-  ,("nbspace", '\x00A0')-  ,("ncaron", '\x0148')-  ,("ncedilla", '\x0146')-  ,("ncircle", '\x24DD')-  ,("ncircumflexbelow", '\x1E4B')-  ,("ncommaaccent", '\x0146')-  ,("ndotaccent", '\x1E45')-  ,("ndotbelow", '\x1E47')-  ,("nehiragana", '\x306D')-  ,("nekatakana", '\x30CD')-  ,("nekatakanahalfwidth", '\xFF88')-  ,("newsheqelsign", '\x20AA')-  ,("nfsquare", '\x338B')-  ,("ngabengali", '\x0999')-  ,("ngadeva", '\x0919')-  ,("ngagujarati", '\x0A99')-  ,("ngagurmukhi", '\x0A19')-  ,("ngonguthai", '\x0E07')-  ,("nhiragana", '\x3093')-  ,("nhookleft", '\x0272')-  ,("nhookretroflex", '\x0273')-  ,("nieunacirclekorean", '\x326F')-  ,("nieunaparenkorean", '\x320F')-  ,("nieuncieuckorean", '\x3135')-  ,("nieuncirclekorean", '\x3261')-  ,("nieunhieuhkorean", '\x3136')-  ,("nieunkorean", '\x3134')-  ,("nieunpansioskorean", '\x3168')-  ,("nieunparenkorean", '\x3201')-  ,("nieunsioskorean", '\x3167')-  ,("nieuntikeutkorean", '\x3166')-  ,("nihiragana", '\x306B')-  ,("nikatakana", '\x30CB')-  ,("nikatakanahalfwidth", '\xFF86')-  ,("nikhahitleftthai", '\xF899')-  ,("nikhahitthai", '\x0E4D')-  ,("nine", '\x0039')-  ,("ninearabic", '\x0669')-  ,("ninebengali", '\x09EF')-  ,("ninecircle", '\x2468')-  ,("ninecircleinversesansserif", '\x2792')-  ,("ninedeva", '\x096F')-  ,("ninegujarati", '\x0AEF')-  ,("ninegurmukhi", '\x0A6F')-  ,("ninehackarabic", '\x0669')-  ,("ninehangzhou", '\x3029')-  ,("nineideographicparen", '\x3228')-  ,("nineinferior", '\x2089')-  ,("ninemonospace", '\xFF19')-  ,("nineoldstyle", '\xF739')-  ,("nineparen", '\x247C')-  ,("nineperiod", '\x2490')-  ,("ninepersian", '\x06F9')-  ,("nineroman", '\x2178')-  ,("ninesuperior", '\x2079')-  ,("nineteencircle", '\x2472')-  ,("nineteenparen", '\x2486')-  ,("nineteenperiod", '\x249A')-  ,("ninethai", '\x0E59')-  ,("nj", '\x01CC')-  ,("njecyrillic", '\x045A')-  ,("nkatakana", '\x30F3')-  ,("nkatakanahalfwidth", '\xFF9D')-  ,("nlegrightlong", '\x019E')-  ,("nlinebelow", '\x1E49')-  ,("nmonospace", '\xFF4E')-  ,("nmsquare", '\x339A')-  ,("nnabengali", '\x09A3')-  ,("nnadeva", '\x0923')-  ,("nnagujarati", '\x0AA3')-  ,("nnagurmukhi", '\x0A23')-  ,("nnnadeva", '\x0929')-  ,("nohiragana", '\x306E')-  ,("nokatakana", '\x30CE')-  ,("nokatakanahalfwidth", '\xFF89')-  ,("nonbreakingspace", '\x00A0')-  ,("nonenthai", '\x0E13')-  ,("nonuthai", '\x0E19')-  ,("noonarabic", '\x0646')-  ,("noonfinalarabic", '\xFEE6')-  ,("noonghunnaarabic", '\x06BA')-  ,("noonghunnafinalarabic", '\xFB9F')-  ,("noonhehinitialarabic", '\xFEE7')-  ,("nooninitialarabic", '\xFEE7')-  ,("noonjeeminitialarabic", '\xFCD2')-  ,("noonjeemisolatedarabic", '\xFC4B')-  ,("noonmedialarabic", '\xFEE8')-  ,("noonmeeminitialarabic", '\xFCD5')-  ,("noonmeemisolatedarabic", '\xFC4E')-  ,("noonnoonfinalarabic", '\xFC8D')-  ,("notcontains", '\x220C')-  ,("notelement", '\x2209')-  ,("notelementof", '\x2209')-  ,("notequal", '\x2260')-  ,("notgreater", '\x226F')-  ,("notgreaternorequal", '\x2271')-  ,("notgreaternorless", '\x2279')-  ,("notidentical", '\x2262')-  ,("notless", '\x226E')-  ,("notlessnorequal", '\x2270')-  ,("notparallel", '\x2226')-  ,("notprecedes", '\x2280')-  ,("notsubset", '\x2284')-  ,("notsucceeds", '\x2281')-  ,("notsuperset", '\x2285')-  ,("nowarmenian", '\x0576')-  ,("nparen", '\x24A9')-  ,("nssquare", '\x33B1')-  ,("nsuperior", '\x207F')-  ,("ntilde", '\x00F1')-  ,("nu", '\x03BD')-  ,("nuhiragana", '\x306C')-  ,("nukatakana", '\x30CC')-  ,("nukatakanahalfwidth", '\xFF87')-  ,("nuktabengali", '\x09BC')-  ,("nuktadeva", '\x093C')-  ,("nuktagujarati", '\x0ABC')-  ,("nuktagurmukhi", '\x0A3C')-  ,("numbersign", '\x0023')-  ,("numbersignmonospace", '\xFF03')-  ,("numbersignsmall", '\xFE5F')-  ,("numeralsigngreek", '\x0374')-  ,("numeralsignlowergreek", '\x0375')-  ,("numero", '\x2116')-  ,("nun", '\x05E0')-  ,("nundagesh", '\xFB40')-  ,("nundageshhebrew", '\xFB40')-  ,("nunhebrew", '\x05E0')-  ,("nvsquare", '\x33B5')-  ,("nwsquare", '\x33BB')-  ,("nyabengali", '\x099E')-  ,("nyadeva", '\x091E')-  ,("nyagujarati", '\x0A9E')-  ,("nyagurmukhi", '\x0A1E')-  ,("o", '\x006F')-  ,("oacute", '\x00F3')-  ,("oangthai", '\x0E2D')-  ,("obarred", '\x0275')-  ,("obarredcyrillic", '\x04E9')-  ,("obarreddieresiscyrillic", '\x04EB')-  ,("obengali", '\x0993')-  ,("obopomofo", '\x311B')-  ,("obreve", '\x014F')-  ,("ocandradeva", '\x0911')-  ,("ocandragujarati", '\x0A91')-  ,("ocandravowelsigndeva", '\x0949')-  ,("ocandravowelsigngujarati", '\x0AC9')-  ,("ocaron", '\x01D2')-  ,("ocircle", '\x24DE')-  ,("ocircumflex", '\x00F4')-  ,("ocircumflexacute", '\x1ED1')-  ,("ocircumflexdotbelow", '\x1ED9')-  ,("ocircumflexgrave", '\x1ED3')-  ,("ocircumflexhookabove", '\x1ED5')-  ,("ocircumflextilde", '\x1ED7')-  ,("ocyrillic", '\x043E')-  ,("odblacute", '\x0151')-  ,("odblgrave", '\x020D')-  ,("odeva", '\x0913')-  ,("odieresis", '\x00F6')-  ,("odieresiscyrillic", '\x04E7')-  ,("odotbelow", '\x1ECD')-  ,("oe", '\x0153')-  ,("oekorean", '\x315A')-  ,("ogonek", '\x02DB')-  ,("ogonekcmb", '\x0328')-  ,("ograve", '\x00F2')-  ,("ogujarati", '\x0A93')-  ,("oharmenian", '\x0585')-  ,("ohiragana", '\x304A')-  ,("ohookabove", '\x1ECF')-  ,("ohorn", '\x01A1')-  ,("ohornacute", '\x1EDB')-  ,("ohorndotbelow", '\x1EE3')-  ,("ohorngrave", '\x1EDD')-  ,("ohornhookabove", '\x1EDF')-  ,("ohorntilde", '\x1EE1')-  ,("ohungarumlaut", '\x0151')-  ,("oi", '\x01A3')-  ,("oinvertedbreve", '\x020F')-  ,("okatakana", '\x30AA')-  ,("okatakanahalfwidth", '\xFF75')-  ,("okorean", '\x3157')-  ,("olehebrew", '\x05AB')-  ,("omacron", '\x014D')-  ,("omacronacute", '\x1E53')-  ,("omacrongrave", '\x1E51')-  ,("omdeva", '\x0950')-  ,("omega", '\x03C9')-  ,("omega1", '\x03D6')-  ,("omegacyrillic", '\x0461')-  ,("omegalatinclosed", '\x0277')-  ,("omegaroundcyrillic", '\x047B')-  ,("omegatitlocyrillic", '\x047D')-  ,("omegatonos", '\x03CE')-  ,("omgujarati", '\x0AD0')-  ,("omicron", '\x03BF')-  ,("omicrontonos", '\x03CC')-  ,("omonospace", '\xFF4F')-  ,("one", '\x0031')-  ,("onearabic", '\x0661')-  ,("onebengali", '\x09E7')-  ,("onecircle", '\x2460')-  ,("onecircleinversesansserif", '\x278A')-  ,("onedeva", '\x0967')-  ,("onedotenleader", '\x2024')-  ,("oneeighth", '\x215B')-  ,("onefitted", '\xF6DC')-  ,("onegujarati", '\x0AE7')-  ,("onegurmukhi", '\x0A67')-  ,("onehackarabic", '\x0661')-  ,("onehalf", '\x00BD')-  ,("onehangzhou", '\x3021')-  ,("oneideographicparen", '\x3220')-  ,("oneinferior", '\x2081')-  ,("onemonospace", '\xFF11')-  ,("onenumeratorbengali", '\x09F4')-  ,("oneoldstyle", '\xF731')-  ,("oneparen", '\x2474')-  ,("oneperiod", '\x2488')-  ,("onepersian", '\x06F1')-  ,("onequarter", '\x00BC')-  ,("oneroman", '\x2170')-  ,("onesuperior", '\x00B9')-  ,("onethai", '\x0E51')-  ,("onethird", '\x2153')-  ,("oogonek", '\x01EB')-  ,("oogonekmacron", '\x01ED')-  ,("oogurmukhi", '\x0A13')-  ,("oomatragurmukhi", '\x0A4B')-  ,("oopen", '\x0254')-  ,("oparen", '\x24AA')-  ,("openbullet", '\x25E6')-  ,("option", '\x2325')-  ,("ordfeminine", '\x00AA')-  ,("ordmasculine", '\x00BA')-  ,("orthogonal", '\x221F')-  ,("oshortdeva", '\x0912')-  ,("oshortvowelsigndeva", '\x094A')-  ,("oslash", '\x00F8')-  ,("oslashacute", '\x01FF')-  ,("osmallhiragana", '\x3049')-  ,("osmallkatakana", '\x30A9')-  ,("osmallkatakanahalfwidth", '\xFF6B')-  ,("ostrokeacute", '\x01FF')-  ,("osuperior", '\xF6F0')-  ,("otcyrillic", '\x047F')-  ,("otilde", '\x00F5')-  ,("otildeacute", '\x1E4D')-  ,("otildedieresis", '\x1E4F')-  ,("oubopomofo", '\x3121')-  ,("overline", '\x203E')-  ,("overlinecenterline", '\xFE4A')-  ,("overlinecmb", '\x0305')-  ,("overlinedashed", '\xFE49')-  ,("overlinedblwavy", '\xFE4C')-  ,("overlinewavy", '\xFE4B')-  ,("overscore", '\x00AF')-  ,("ovowelsignbengali", '\x09CB')-  ,("ovowelsigndeva", '\x094B')-  ,("ovowelsigngujarati", '\x0ACB')-  ,("p", '\x0070')-  ,("paampssquare", '\x3380')-  ,("paasentosquare", '\x332B')-  ,("pabengali", '\x09AA')-  ,("pacute", '\x1E55')-  ,("padeva", '\x092A')-  ,("pagedown", '\x21DF')-  ,("pageup", '\x21DE')-  ,("pagujarati", '\x0AAA')-  ,("pagurmukhi", '\x0A2A')-  ,("pahiragana", '\x3071')-  ,("paiyannoithai", '\x0E2F')-  ,("pakatakana", '\x30D1')-  ,("palatalizationcyrilliccmb", '\x0484')-  ,("palochkacyrillic", '\x04C0')-  ,("pansioskorean", '\x317F')-  ,("paragraph", '\x00B6')-  ,("parallel", '\x2225')-  ,("parenleft", '\x0028')-  ,("parenleftaltonearabic", '\xFD3E')-  ,("parenleftbt", '\xF8ED')-  ,("parenleftex", '\xF8EC')-  ,("parenleftinferior", '\x208D')-  ,("parenleftmonospace", '\xFF08')-  ,("parenleftsmall", '\xFE59')-  ,("parenleftsuperior", '\x207D')-  ,("parenlefttp", '\xF8EB')-  ,("parenleftvertical", '\xFE35')-  ,("parenright", '\x0029')-  ,("parenrightaltonearabic", '\xFD3F')-  ,("parenrightbt", '\xF8F8')-  ,("parenrightex", '\xF8F7')-  ,("parenrightinferior", '\x208E')-  ,("parenrightmonospace", '\xFF09')-  ,("parenrightsmall", '\xFE5A')-  ,("parenrightsuperior", '\x207E')-  ,("parenrighttp", '\xF8F6')-  ,("parenrightvertical", '\xFE36')-  ,("partialdiff", '\x2202')-  ,("paseqhebrew", '\x05C0')-  ,("pashtahebrew", '\x0599')-  ,("pasquare", '\x33A9')-  ,("patah", '\x05B7')-  ,("patah11", '\x05B7')-  ,("patah1d", '\x05B7')-  ,("patah2a", '\x05B7')-  ,("patahhebrew", '\x05B7')-  ,("patahnarrowhebrew", '\x05B7')-  ,("patahquarterhebrew", '\x05B7')-  ,("patahwidehebrew", '\x05B7')-  ,("pazerhebrew", '\x05A1')-  ,("pbopomofo", '\x3106')-  ,("pcircle", '\x24DF')-  ,("pdotaccent", '\x1E57')-  ,("pe", '\x05E4')-  ,("pecyrillic", '\x043F')-  ,("pedagesh", '\xFB44')-  ,("pedageshhebrew", '\xFB44')-  ,("peezisquare", '\x333B')-  ,("pefinaldageshhebrew", '\xFB43')-  ,("peharabic", '\x067E')-  ,("peharmenian", '\x057A')-  ,("pehebrew", '\x05E4')-  ,("pehfinalarabic", '\xFB57')-  ,("pehinitialarabic", '\xFB58')-  ,("pehiragana", '\x307A')-  ,("pehmedialarabic", '\xFB59')-  ,("pekatakana", '\x30DA')-  ,("pemiddlehookcyrillic", '\x04A7')-  ,("perafehebrew", '\xFB4E')-  ,("percent", '\x0025')-  ,("percentarabic", '\x066A')-  ,("percentmonospace", '\xFF05')-  ,("percentsmall", '\xFE6A')-  ,("period", '\x002E')-  ,("periodarmenian", '\x0589')-  ,("periodcentered", '\x00B7')-  ,("periodhalfwidth", '\xFF61')-  ,("periodinferior", '\xF6E7')-  ,("periodmonospace", '\xFF0E')-  ,("periodsmall", '\xFE52')-  ,("periodsuperior", '\xF6E8')-  ,("perispomenigreekcmb", '\x0342')-  ,("perpendicular", '\x22A5')-  ,("perthousand", '\x2030')-  ,("peseta", '\x20A7')-  ,("pfsquare", '\x338A')-  ,("phabengali", '\x09AB')-  ,("phadeva", '\x092B')-  ,("phagujarati", '\x0AAB')-  ,("phagurmukhi", '\x0A2B')-  ,("phi", '\x03C6')-  ,("phi1", '\x03D5')-  ,("phieuphacirclekorean", '\x327A')-  ,("phieuphaparenkorean", '\x321A')-  ,("phieuphcirclekorean", '\x326C')-  ,("phieuphkorean", '\x314D')-  ,("phieuphparenkorean", '\x320C')-  ,("philatin", '\x0278')-  ,("phinthuthai", '\x0E3A')-  ,("phisymbolgreek", '\x03D5')-  ,("phook", '\x01A5')-  ,("phophanthai", '\x0E1E')-  ,("phophungthai", '\x0E1C')-  ,("phosamphaothai", '\x0E20')-  ,("pi", '\x03C0')-  ,("pieupacirclekorean", '\x3273')-  ,("pieupaparenkorean", '\x3213')-  ,("pieupcieuckorean", '\x3176')-  ,("pieupcirclekorean", '\x3265')-  ,("pieupkiyeokkorean", '\x3172')-  ,("pieupkorean", '\x3142')-  ,("pieupparenkorean", '\x3205')-  ,("pieupsioskiyeokkorean", '\x3174')-  ,("pieupsioskorean", '\x3144')-  ,("pieupsiostikeutkorean", '\x3175')-  ,("pieupthieuthkorean", '\x3177')-  ,("pieuptikeutkorean", '\x3173')-  ,("pihiragana", '\x3074')-  ,("pikatakana", '\x30D4')-  ,("pisymbolgreek", '\x03D6')-  ,("piwrarmenian", '\x0583')-  ,("plus", '\x002B')-  ,("plusbelowcmb", '\x031F')-  ,("pluscircle", '\x2295')-  ,("plusminus", '\x00B1')-  ,("plusmod", '\x02D6')-  ,("plusmonospace", '\xFF0B')-  ,("plussmall", '\xFE62')-  ,("plussuperior", '\x207A')-  ,("pmonospace", '\xFF50')-  ,("pmsquare", '\x33D8')-  ,("pohiragana", '\x307D')-  ,("pointingindexdownwhite", '\x261F')-  ,("pointingindexleftwhite", '\x261C')-  ,("pointingindexrightwhite", '\x261E')-  ,("pointingindexupwhite", '\x261D')-  ,("pokatakana", '\x30DD')-  ,("poplathai", '\x0E1B')-  ,("postalmark", '\x3012')-  ,("postalmarkface", '\x3020')-  ,("pparen", '\x24AB')-  ,("precedes", '\x227A')-  ,("prescription", '\x211E')-  ,("primemod", '\x02B9')-  ,("primereversed", '\x2035')-  ,("product", '\x220F')-  ,("projective", '\x2305')-  ,("prolongedkana", '\x30FC')-  ,("propellor", '\x2318')-  ,("propersubset", '\x2282')-  ,("propersuperset", '\x2283')-  ,("proportion", '\x2237')-  ,("proportional", '\x221D')-  ,("psi", '\x03C8')-  ,("psicyrillic", '\x0471')-  ,("psilipneumatacyrilliccmb", '\x0486')-  ,("pssquare", '\x33B0')-  ,("puhiragana", '\x3077')-  ,("pukatakana", '\x30D7')-  ,("pvsquare", '\x33B4')-  ,("pwsquare", '\x33BA')-  ,("q", '\x0071')-  ,("qadeva", '\x0958')-  ,("qadmahebrew", '\x05A8')-  ,("qafarabic", '\x0642')-  ,("qaffinalarabic", '\xFED6')-  ,("qafinitialarabic", '\xFED7')-  ,("qafmedialarabic", '\xFED8')-  ,("qamats", '\x05B8')-  ,("qamats10", '\x05B8')-  ,("qamats1a", '\x05B8')-  ,("qamats1c", '\x05B8')-  ,("qamats27", '\x05B8')-  ,("qamats29", '\x05B8')-  ,("qamats33", '\x05B8')-  ,("qamatsde", '\x05B8')-  ,("qamatshebrew", '\x05B8')-  ,("qamatsnarrowhebrew", '\x05B8')-  ,("qamatsqatanhebrew", '\x05B8')-  ,("qamatsqatannarrowhebrew", '\x05B8')-  ,("qamatsqatanquarterhebrew", '\x05B8')-  ,("qamatsqatanwidehebrew", '\x05B8')-  ,("qamatsquarterhebrew", '\x05B8')-  ,("qamatswidehebrew", '\x05B8')-  ,("qarneyparahebrew", '\x059F')-  ,("qbopomofo", '\x3111')-  ,("qcircle", '\x24E0')-  ,("qhook", '\x02A0')-  ,("qmonospace", '\xFF51')-  ,("qof", '\x05E7')-  ,("qofdagesh", '\xFB47')-  ,("qofdageshhebrew", '\xFB47')-  ,("qofhatafpatah", '\x05E7')-  ,("qofhatafpatahhebrew", '\x05E7')-  ,("qofhatafsegol", '\x05E7')-  ,("qofhatafsegolhebrew", '\x05E7')-  ,("qofhebrew", '\x05E7')-  ,("qofhiriq", '\x05E7')-  ,("qofhiriqhebrew", '\x05E7')-  ,("qofholam", '\x05E7')-  ,("qofholamhebrew", '\x05E7')-  ,("qofpatah", '\x05E7')-  ,("qofpatahhebrew", '\x05E7')-  ,("qofqamats", '\x05E7')-  ,("qofqamatshebrew", '\x05E7')-  ,("qofqubuts", '\x05E7')-  ,("qofqubutshebrew", '\x05E7')-  ,("qofsegol", '\x05E7')-  ,("qofsegolhebrew", '\x05E7')-  ,("qofsheva", '\x05E7')-  ,("qofshevahebrew", '\x05E7')-  ,("qoftsere", '\x05E7')-  ,("qoftserehebrew", '\x05E7')-  ,("qparen", '\x24AC')-  ,("quarternote", '\x2669')-  ,("qubuts", '\x05BB')-  ,("qubuts18", '\x05BB')-  ,("qubuts25", '\x05BB')-  ,("qubuts31", '\x05BB')-  ,("qubutshebrew", '\x05BB')-  ,("qubutsnarrowhebrew", '\x05BB')-  ,("qubutsquarterhebrew", '\x05BB')-  ,("qubutswidehebrew", '\x05BB')-  ,("question", '\x003F')-  ,("questionarabic", '\x061F')-  ,("questionarmenian", '\x055E')-  ,("questiondown", '\x00BF')-  ,("questiondownsmall", '\xF7BF')-  ,("questiongreek", '\x037E')-  ,("questionmonospace", '\xFF1F')-  ,("questionsmall", '\xF73F')-  ,("quotedbl", '\x0022')-  ,("quotedblbase", '\x201E')-  ,("quotedblleft", '\x201C')-  ,("quotedblmonospace", '\xFF02')-  ,("quotedblprime", '\x301E')-  ,("quotedblprimereversed", '\x301D')-  ,("quotedblright", '\x201D')-  ,("quoteleft", '\x2018')-  ,("quoteleftreversed", '\x201B')-  ,("quotereversed", '\x201B')-  ,("quoteright", '\x2019')-  ,("quoterightn", '\x0149')-  ,("quotesinglbase", '\x201A')-  ,("quotesingle", '\x0027')-  ,("quotesinglemonospace", '\xFF07')-  ,("r", '\x0072')-  ,("raarmenian", '\x057C')-  ,("rabengali", '\x09B0')-  ,("racute", '\x0155')-  ,("radeva", '\x0930')-  ,("radical", '\x221A')-  ,("radicalex", '\xF8E5')-  ,("radoverssquare", '\x33AE')-  ,("radoverssquaredsquare", '\x33AF')-  ,("radsquare", '\x33AD')-  ,("rafe", '\x05BF')-  ,("rafehebrew", '\x05BF')-  ,("ragujarati", '\x0AB0')-  ,("ragurmukhi", '\x0A30')-  ,("rahiragana", '\x3089')-  ,("rakatakana", '\x30E9')-  ,("rakatakanahalfwidth", '\xFF97')-  ,("ralowerdiagonalbengali", '\x09F1')-  ,("ramiddlediagonalbengali", '\x09F0')-  ,("ramshorn", '\x0264')-  ,("ratio", '\x2236')-  ,("rbopomofo", '\x3116')-  ,("rcaron", '\x0159')-  ,("rcedilla", '\x0157')-  ,("rcircle", '\x24E1')-  ,("rcommaaccent", '\x0157')-  ,("rdblgrave", '\x0211')-  ,("rdotaccent", '\x1E59')-  ,("rdotbelow", '\x1E5B')-  ,("rdotbelowmacron", '\x1E5D')-  ,("referencemark", '\x203B')-  ,("reflexsubset", '\x2286')-  ,("reflexsuperset", '\x2287')-  ,("registered", '\x00AE')-  ,("registersans", '\xF8E8')-  ,("registerserif", '\xF6DA')-  ,("reharabic", '\x0631')-  ,("reharmenian", '\x0580')-  ,("rehfinalarabic", '\xFEAE')-  ,("rehiragana", '\x308C')-  ,("rehyehaleflamarabic", '\x0631')-  ,("rekatakana", '\x30EC')-  ,("rekatakanahalfwidth", '\xFF9A')-  ,("resh", '\x05E8')-  ,("reshdageshhebrew", '\xFB48')-  ,("reshhatafpatah", '\x05E8')-  ,("reshhatafpatahhebrew", '\x05E8')-  ,("reshhatafsegol", '\x05E8')-  ,("reshhatafsegolhebrew", '\x05E8')-  ,("reshhebrew", '\x05E8')-  ,("reshhiriq", '\x05E8')-  ,("reshhiriqhebrew", '\x05E8')-  ,("reshholam", '\x05E8')-  ,("reshholamhebrew", '\x05E8')-  ,("reshpatah", '\x05E8')-  ,("reshpatahhebrew", '\x05E8')-  ,("reshqamats", '\x05E8')-  ,("reshqamatshebrew", '\x05E8')-  ,("reshqubuts", '\x05E8')-  ,("reshqubutshebrew", '\x05E8')-  ,("reshsegol", '\x05E8')-  ,("reshsegolhebrew", '\x05E8')-  ,("reshsheva", '\x05E8')-  ,("reshshevahebrew", '\x05E8')-  ,("reshtsere", '\x05E8')-  ,("reshtserehebrew", '\x05E8')-  ,("reversedtilde", '\x223D')-  ,("reviahebrew", '\x0597')-  ,("reviamugrashhebrew", '\x0597')-  ,("revlogicalnot", '\x2310')-  ,("rfishhook", '\x027E')-  ,("rfishhookreversed", '\x027F')-  ,("rhabengali", '\x09DD')-  ,("rhadeva", '\x095D')-  ,("rho", '\x03C1')-  ,("rhook", '\x027D')-  ,("rhookturned", '\x027B')-  ,("rhookturnedsuperior", '\x02B5')-  ,("rhosymbolgreek", '\x03F1')-  ,("rhotichookmod", '\x02DE')-  ,("rieulacirclekorean", '\x3271')-  ,("rieulaparenkorean", '\x3211')-  ,("rieulcirclekorean", '\x3263')-  ,("rieulhieuhkorean", '\x3140')-  ,("rieulkiyeokkorean", '\x313A')-  ,("rieulkiyeoksioskorean", '\x3169')-  ,("rieulkorean", '\x3139')-  ,("rieulmieumkorean", '\x313B')-  ,("rieulpansioskorean", '\x316C')-  ,("rieulparenkorean", '\x3203')-  ,("rieulphieuphkorean", '\x313F')-  ,("rieulpieupkorean", '\x313C')-  ,("rieulpieupsioskorean", '\x316B')-  ,("rieulsioskorean", '\x313D')-  ,("rieulthieuthkorean", '\x313E')-  ,("rieultikeutkorean", '\x316A')-  ,("rieulyeorinhieuhkorean", '\x316D')-  ,("rightangle", '\x221F')-  ,("righttackbelowcmb", '\x0319')-  ,("righttriangle", '\x22BF')-  ,("rihiragana", '\x308A')-  ,("rikatakana", '\x30EA')-  ,("rikatakanahalfwidth", '\xFF98')-  ,("ring", '\x02DA')-  ,("ringbelowcmb", '\x0325')-  ,("ringcmb", '\x030A')-  ,("ringhalfleft", '\x02BF')-  ,("ringhalfleftarmenian", '\x0559')-  ,("ringhalfleftbelowcmb", '\x031C')-  ,("ringhalfleftcentered", '\x02D3')-  ,("ringhalfright", '\x02BE')-  ,("ringhalfrightbelowcmb", '\x0339')-  ,("ringhalfrightcentered", '\x02D2')-  ,("rinvertedbreve", '\x0213')-  ,("rittorusquare", '\x3351')-  ,("rlinebelow", '\x1E5F')-  ,("rlongleg", '\x027C')-  ,("rlonglegturned", '\x027A')-  ,("rmonospace", '\xFF52')-  ,("rohiragana", '\x308D')-  ,("rokatakana", '\x30ED')-  ,("rokatakanahalfwidth", '\xFF9B')-  ,("roruathai", '\x0E23')-  ,("rparen", '\x24AD')-  ,("rrabengali", '\x09DC')-  ,("rradeva", '\x0931')-  ,("rragurmukhi", '\x0A5C')-  ,("rreharabic", '\x0691')-  ,("rrehfinalarabic", '\xFB8D')-  ,("rrvocalicbengali", '\x09E0')-  ,("rrvocalicdeva", '\x0960')-  ,("rrvocalicgujarati", '\x0AE0')-  ,("rrvocalicvowelsignbengali", '\x09C4')-  ,("rrvocalicvowelsigndeva", '\x0944')-  ,("rrvocalicvowelsigngujarati", '\x0AC4')-  ,("rsuperior", '\xF6F1')-  ,("rtblock", '\x2590')-  ,("rturned", '\x0279')-  ,("rturnedsuperior", '\x02B4')-  ,("ruhiragana", '\x308B')-  ,("rukatakana", '\x30EB')-  ,("rukatakanahalfwidth", '\xFF99')-  ,("rupeemarkbengali", '\x09F2')-  ,("rupeesignbengali", '\x09F3')-  ,("rupiah", '\xF6DD')-  ,("ruthai", '\x0E24')-  ,("rvocalicbengali", '\x098B')-  ,("rvocalicdeva", '\x090B')-  ,("rvocalicgujarati", '\x0A8B')-  ,("rvocalicvowelsignbengali", '\x09C3')-  ,("rvocalicvowelsigndeva", '\x0943')-  ,("rvocalicvowelsigngujarati", '\x0AC3')-  ,("s", '\x0073')-  ,("sabengali", '\x09B8')-  ,("sacute", '\x015B')-  ,("sacutedotaccent", '\x1E65')-  ,("sadarabic", '\x0635')-  ,("sadeva", '\x0938')-  ,("sadfinalarabic", '\xFEBA')-  ,("sadinitialarabic", '\xFEBB')-  ,("sadmedialarabic", '\xFEBC')-  ,("sagujarati", '\x0AB8')-  ,("sagurmukhi", '\x0A38')-  ,("sahiragana", '\x3055')-  ,("sakatakana", '\x30B5')-  ,("sakatakanahalfwidth", '\xFF7B')-  ,("sallallahoualayhewasallamarabic", '\xFDFA')-  ,("samekh", '\x05E1')-  ,("samekhdagesh", '\xFB41')-  ,("samekhdageshhebrew", '\xFB41')-  ,("samekhhebrew", '\x05E1')-  ,("saraaathai", '\x0E32')-  ,("saraaethai", '\x0E41')-  ,("saraaimaimalaithai", '\x0E44')-  ,("saraaimaimuanthai", '\x0E43')-  ,("saraamthai", '\x0E33')-  ,("saraathai", '\x0E30')-  ,("saraethai", '\x0E40')-  ,("saraiileftthai", '\xF886')-  ,("saraiithai", '\x0E35')-  ,("saraileftthai", '\xF885')-  ,("saraithai", '\x0E34')-  ,("saraothai", '\x0E42')-  ,("saraueeleftthai", '\xF888')-  ,("saraueethai", '\x0E37')-  ,("saraueleftthai", '\xF887')-  ,("sarauethai", '\x0E36')-  ,("sarauthai", '\x0E38')-  ,("sarauuthai", '\x0E39')-  ,("sbopomofo", '\x3119')-  ,("scaron", '\x0161')-  ,("scarondotaccent", '\x1E67')-  ,("scedilla", '\x015F')-  ,("schwa", '\x0259')-  ,("schwacyrillic", '\x04D9')-  ,("schwadieresiscyrillic", '\x04DB')-  ,("schwahook", '\x025A')-  ,("scircle", '\x24E2')-  ,("scircumflex", '\x015D')-  ,("scommaaccent", '\x0219')-  ,("sdotaccent", '\x1E61')-  ,("sdotbelow", '\x1E63')-  ,("sdotbelowdotaccent", '\x1E69')-  ,("seagullbelowcmb", '\x033C')-  ,("second", '\x2033')-  ,("secondtonechinese", '\x02CA')-  ,("section", '\x00A7')-  ,("seenarabic", '\x0633')-  ,("seenfinalarabic", '\xFEB2')-  ,("seeninitialarabic", '\xFEB3')-  ,("seenmedialarabic", '\xFEB4')-  ,("segol", '\x05B6')-  ,("segol13", '\x05B6')-  ,("segol1f", '\x05B6')-  ,("segol2c", '\x05B6')-  ,("segolhebrew", '\x05B6')-  ,("segolnarrowhebrew", '\x05B6')-  ,("segolquarterhebrew", '\x05B6')-  ,("segoltahebrew", '\x0592')-  ,("segolwidehebrew", '\x05B6')-  ,("seharmenian", '\x057D')-  ,("sehiragana", '\x305B')-  ,("sekatakana", '\x30BB')-  ,("sekatakanahalfwidth", '\xFF7E')-  ,("semicolon", '\x003B')-  ,("semicolonarabic", '\x061B')-  ,("semicolonmonospace", '\xFF1B')-  ,("semicolonsmall", '\xFE54')-  ,("semivoicedmarkkana", '\x309C')-  ,("semivoicedmarkkanahalfwidth", '\xFF9F')-  ,("sentisquare", '\x3322')-  ,("sentosquare", '\x3323')-  ,("seven", '\x0037')-  ,("sevenarabic", '\x0667')-  ,("sevenbengali", '\x09ED')-  ,("sevencircle", '\x2466')-  ,("sevencircleinversesansserif", '\x2790')-  ,("sevendeva", '\x096D')-  ,("seveneighths", '\x215E')-  ,("sevengujarati", '\x0AED')-  ,("sevengurmukhi", '\x0A6D')-  ,("sevenhackarabic", '\x0667')-  ,("sevenhangzhou", '\x3027')-  ,("sevenideographicparen", '\x3226')-  ,("seveninferior", '\x2087')-  ,("sevenmonospace", '\xFF17')-  ,("sevenoldstyle", '\xF737')-  ,("sevenparen", '\x247A')-  ,("sevenperiod", '\x248E')-  ,("sevenpersian", '\x06F7')-  ,("sevenroman", '\x2176')-  ,("sevensuperior", '\x2077')-  ,("seventeencircle", '\x2470')-  ,("seventeenparen", '\x2484')-  ,("seventeenperiod", '\x2498')-  ,("seventhai", '\x0E57')-  ,("sfthyphen", '\x00AD')-  ,("shaarmenian", '\x0577')-  ,("shabengali", '\x09B6')-  ,("shacyrillic", '\x0448')-  ,("shaddaarabic", '\x0651')-  ,("shaddadammaarabic", '\xFC61')-  ,("shaddadammatanarabic", '\xFC5E')-  ,("shaddafathaarabic", '\xFC60')-  ,("shaddafathatanarabic", '\x0651')-  ,("shaddakasraarabic", '\xFC62')-  ,("shaddakasratanarabic", '\xFC5F')-  ,("shade", '\x2592')-  ,("shadedark", '\x2593')-  ,("shadelight", '\x2591')-  ,("shademedium", '\x2592')-  ,("shadeva", '\x0936')-  ,("shagujarati", '\x0AB6')-  ,("shagurmukhi", '\x0A36')-  ,("shalshelethebrew", '\x0593')-  ,("shbopomofo", '\x3115')-  ,("shchacyrillic", '\x0449')-  ,("sheenarabic", '\x0634')-  ,("sheenfinalarabic", '\xFEB6')-  ,("sheeninitialarabic", '\xFEB7')-  ,("sheenmedialarabic", '\xFEB8')-  ,("sheicoptic", '\x03E3')-  ,("sheqel", '\x20AA')-  ,("sheqelhebrew", '\x20AA')-  ,("sheva", '\x05B0')-  ,("sheva115", '\x05B0')-  ,("sheva15", '\x05B0')-  ,("sheva22", '\x05B0')-  ,("sheva2e", '\x05B0')-  ,("shevahebrew", '\x05B0')-  ,("shevanarrowhebrew", '\x05B0')-  ,("shevaquarterhebrew", '\x05B0')-  ,("shevawidehebrew", '\x05B0')-  ,("shhacyrillic", '\x04BB')-  ,("shimacoptic", '\x03ED')-  ,("shin", '\x05E9')-  ,("shindagesh", '\xFB49')-  ,("shindageshhebrew", '\xFB49')-  ,("shindageshshindot", '\xFB2C')-  ,("shindageshshindothebrew", '\xFB2C')-  ,("shindageshsindot", '\xFB2D')-  ,("shindageshsindothebrew", '\xFB2D')-  ,("shindothebrew", '\x05C1')-  ,("shinhebrew", '\x05E9')-  ,("shinshindot", '\xFB2A')-  ,("shinshindothebrew", '\xFB2A')-  ,("shinsindot", '\xFB2B')-  ,("shinsindothebrew", '\xFB2B')-  ,("shook", '\x0282')-  ,("sigma", '\x03C3')-  ,("sigma1", '\x03C2')-  ,("sigmafinal", '\x03C2')-  ,("sigmalunatesymbolgreek", '\x03F2')-  ,("sihiragana", '\x3057')-  ,("sikatakana", '\x30B7')-  ,("sikatakanahalfwidth", '\xFF7C')-  ,("siluqhebrew", '\x05BD')-  ,("siluqlefthebrew", '\x05BD')-  ,("similar", '\x223C')-  ,("sindothebrew", '\x05C2')-  ,("siosacirclekorean", '\x3274')-  ,("siosaparenkorean", '\x3214')-  ,("sioscieuckorean", '\x317E')-  ,("sioscirclekorean", '\x3266')-  ,("sioskiyeokkorean", '\x317A')-  ,("sioskorean", '\x3145')-  ,("siosnieunkorean", '\x317B')-  ,("siosparenkorean", '\x3206')-  ,("siospieupkorean", '\x317D')-  ,("siostikeutkorean", '\x317C')-  ,("six", '\x0036')-  ,("sixarabic", '\x0666')-  ,("sixbengali", '\x09EC')-  ,("sixcircle", '\x2465')-  ,("sixcircleinversesansserif", '\x278F')-  ,("sixdeva", '\x096C')-  ,("sixgujarati", '\x0AEC')-  ,("sixgurmukhi", '\x0A6C')-  ,("sixhackarabic", '\x0666')-  ,("sixhangzhou", '\x3026')-  ,("sixideographicparen", '\x3225')-  ,("sixinferior", '\x2086')-  ,("sixmonospace", '\xFF16')-  ,("sixoldstyle", '\xF736')-  ,("sixparen", '\x2479')-  ,("sixperiod", '\x248D')-  ,("sixpersian", '\x06F6')-  ,("sixroman", '\x2175')-  ,("sixsuperior", '\x2076')-  ,("sixteencircle", '\x246F')-  ,("sixteencurrencydenominatorbengali", '\x09F9')-  ,("sixteenparen", '\x2483')-  ,("sixteenperiod", '\x2497')-  ,("sixthai", '\x0E56')-  ,("slash", '\x002F')-  ,("slashmonospace", '\xFF0F')-  ,("slong", '\x017F')-  ,("slongdotaccent", '\x1E9B')-  ,("smileface", '\x263A')-  ,("smonospace", '\xFF53')-  ,("sofpasuqhebrew", '\x05C3')-  ,("softhyphen", '\x00AD')-  ,("softsigncyrillic", '\x044C')-  ,("sohiragana", '\x305D')-  ,("sokatakana", '\x30BD')-  ,("sokatakanahalfwidth", '\xFF7F')-  ,("soliduslongoverlaycmb", '\x0338')-  ,("solidusshortoverlaycmb", '\x0337')-  ,("sorusithai", '\x0E29')-  ,("sosalathai", '\x0E28')-  ,("sosothai", '\x0E0B')-  ,("sosuathai", '\x0E2A')-  ,("space", '\x0020')-  ,("spacehackarabic", '\x0020')-  ,("spade", '\x2660')-  ,("spadesuitblack", '\x2660')-  ,("spadesuitwhite", '\x2664')-  ,("sparen", '\x24AE')-  ,("squarebelowcmb", '\x033B')-  ,("squarecc", '\x33C4')-  ,("squarecm", '\x339D')-  ,("squarediagonalcrosshatchfill", '\x25A9')-  ,("squarehorizontalfill", '\x25A4')-  ,("squarekg", '\x338F')-  ,("squarekm", '\x339E')-  ,("squarekmcapital", '\x33CE')-  ,("squareln", '\x33D1')-  ,("squarelog", '\x33D2')-  ,("squaremg", '\x338E')-  ,("squaremil", '\x33D5')-  ,("squaremm", '\x339C')-  ,("squaremsquared", '\x33A1')-  ,("squareorthogonalcrosshatchfill", '\x25A6')-  ,("squareupperlefttolowerrightfill", '\x25A7')-  ,("squareupperrighttolowerleftfill", '\x25A8')-  ,("squareverticalfill", '\x25A5')-  ,("squarewhitewithsmallblack", '\x25A3')-  ,("srsquare", '\x33DB')-  ,("ssabengali", '\x09B7')-  ,("ssadeva", '\x0937')-  ,("ssagujarati", '\x0AB7')-  ,("ssangcieuckorean", '\x3149')-  ,("ssanghieuhkorean", '\x3185')-  ,("ssangieungkorean", '\x3180')-  ,("ssangkiyeokkorean", '\x3132')-  ,("ssangnieunkorean", '\x3165')-  ,("ssangpieupkorean", '\x3143')-  ,("ssangsioskorean", '\x3146')-  ,("ssangtikeutkorean", '\x3138')-  ,("ssuperior", '\xF6F2')-  ,("sterling", '\x00A3')-  ,("sterlingmonospace", '\xFFE1')-  ,("strokelongoverlaycmb", '\x0336')-  ,("strokeshortoverlaycmb", '\x0335')-  ,("subset", '\x2282')-  ,("subsetnotequal", '\x228A')-  ,("subsetorequal", '\x2286')-  ,("succeeds", '\x227B')-  ,("suchthat", '\x220B')-  ,("suhiragana", '\x3059')-  ,("sukatakana", '\x30B9')-  ,("sukatakanahalfwidth", '\xFF7D')-  ,("sukunarabic", '\x0652')-  ,("summation", '\x2211')-  ,("sun", '\x263C')-  ,("superset", '\x2283')-  ,("supersetnotequal", '\x228B')-  ,("supersetorequal", '\x2287')-  ,("svsquare", '\x33DC')-  ,("syouwaerasquare", '\x337C')-  ,("t", '\x0074')-  ,("tabengali", '\x09A4')-  ,("tackdown", '\x22A4')-  ,("tackleft", '\x22A3')-  ,("tadeva", '\x0924')-  ,("tagujarati", '\x0AA4')-  ,("tagurmukhi", '\x0A24')-  ,("taharabic", '\x0637')-  ,("tahfinalarabic", '\xFEC2')-  ,("tahinitialarabic", '\xFEC3')-  ,("tahiragana", '\x305F')-  ,("tahmedialarabic", '\xFEC4')-  ,("taisyouerasquare", '\x337D')-  ,("takatakana", '\x30BF')-  ,("takatakanahalfwidth", '\xFF80')-  ,("tatweelarabic", '\x0640')-  ,("tau", '\x03C4')-  ,("tav", '\x05EA')-  ,("tavdages", '\xFB4A')-  ,("tavdagesh", '\xFB4A')-  ,("tavdageshhebrew", '\xFB4A')-  ,("tavhebrew", '\x05EA')-  ,("tbar", '\x0167')-  ,("tbopomofo", '\x310A')-  ,("tcaron", '\x0165')-  ,("tccurl", '\x02A8')-  ,("tcedilla", '\x0163')-  ,("tcheharabic", '\x0686')-  ,("tchehfinalarabic", '\xFB7B')-  ,("tchehinitialarabic", '\xFB7C')-  ,("tchehmedialarabic", '\xFB7D')-  ,("tchehmeeminitialarabic", '\xFB7C')-  ,("tcircle", '\x24E3')-  ,("tcircumflexbelow", '\x1E71')-  ,("tcommaaccent", '\x0163')-  ,("tdieresis", '\x1E97')-  ,("tdotaccent", '\x1E6B')-  ,("tdotbelow", '\x1E6D')-  ,("tecyrillic", '\x0442')-  ,("tedescendercyrillic", '\x04AD')-  ,("teharabic", '\x062A')-  ,("tehfinalarabic", '\xFE96')-  ,("tehhahinitialarabic", '\xFCA2')-  ,("tehhahisolatedarabic", '\xFC0C')-  ,("tehinitialarabic", '\xFE97')-  ,("tehiragana", '\x3066')-  ,("tehjeeminitialarabic", '\xFCA1')-  ,("tehjeemisolatedarabic", '\xFC0B')-  ,("tehmarbutaarabic", '\x0629')-  ,("tehmarbutafinalarabic", '\xFE94')-  ,("tehmedialarabic", '\xFE98')-  ,("tehmeeminitialarabic", '\xFCA4')-  ,("tehmeemisolatedarabic", '\xFC0E')-  ,("tehnoonfinalarabic", '\xFC73')-  ,("tekatakana", '\x30C6')-  ,("tekatakanahalfwidth", '\xFF83')-  ,("telephone", '\x2121')-  ,("telephoneblack", '\x260E')-  ,("telishagedolahebrew", '\x05A0')-  ,("telishaqetanahebrew", '\x05A9')-  ,("tencircle", '\x2469')-  ,("tenideographicparen", '\x3229')-  ,("tenparen", '\x247D')-  ,("tenperiod", '\x2491')-  ,("tenroman", '\x2179')-  ,("tesh", '\x02A7')-  ,("tet", '\x05D8')-  ,("tetdagesh", '\xFB38')-  ,("tetdageshhebrew", '\xFB38')-  ,("tethebrew", '\x05D8')-  ,("tetsecyrillic", '\x04B5')-  ,("tevirhebrew", '\x059B')-  ,("tevirlefthebrew", '\x059B')-  ,("thabengali", '\x09A5')-  ,("thadeva", '\x0925')-  ,("thagujarati", '\x0AA5')-  ,("thagurmukhi", '\x0A25')-  ,("thalarabic", '\x0630')-  ,("thalfinalarabic", '\xFEAC')-  ,("thanthakhatlowleftthai", '\xF898')-  ,("thanthakhatlowrightthai", '\xF897')-  ,("thanthakhatthai", '\x0E4C')-  ,("thanthakhatupperleftthai", '\xF896')-  ,("theharabic", '\x062B')-  ,("thehfinalarabic", '\xFE9A')-  ,("thehinitialarabic", '\xFE9B')-  ,("thehmedialarabic", '\xFE9C')-  ,("thereexists", '\x2203')-  ,("therefore", '\x2234')-  ,("theta", '\x03B8')-  ,("theta1", '\x03D1')-  ,("thetasymbolgreek", '\x03D1')-  ,("thieuthacirclekorean", '\x3279')-  ,("thieuthaparenkorean", '\x3219')-  ,("thieuthcirclekorean", '\x326B')-  ,("thieuthkorean", '\x314C')-  ,("thieuthparenkorean", '\x320B')-  ,("thirteencircle", '\x246C')-  ,("thirteenparen", '\x2480')-  ,("thirteenperiod", '\x2494')-  ,("thonangmonthothai", '\x0E11')-  ,("thook", '\x01AD')-  ,("thophuthaothai", '\x0E12')-  ,("thorn", '\x00FE')-  ,("thothahanthai", '\x0E17')-  ,("thothanthai", '\x0E10')-  ,("thothongthai", '\x0E18')-  ,("thothungthai", '\x0E16')-  ,("thousandcyrillic", '\x0482')-  ,("thousandsseparatorarabic", '\x066C')-  ,("thousandsseparatorpersian", '\x066C')-  ,("three", '\x0033')-  ,("threearabic", '\x0663')-  ,("threebengali", '\x09E9')-  ,("threecircle", '\x2462')-  ,("threecircleinversesansserif", '\x278C')-  ,("threedeva", '\x0969')-  ,("threeeighths", '\x215C')-  ,("threegujarati", '\x0AE9')-  ,("threegurmukhi", '\x0A69')-  ,("threehackarabic", '\x0663')-  ,("threehangzhou", '\x3023')-  ,("threeideographicparen", '\x3222')-  ,("threeinferior", '\x2083')-  ,("threemonospace", '\xFF13')-  ,("threenumeratorbengali", '\x09F6')-  ,("threeoldstyle", '\xF733')-  ,("threeparen", '\x2476')-  ,("threeperiod", '\x248A')-  ,("threepersian", '\x06F3')-  ,("threequarters", '\x00BE')-  ,("threequartersemdash", '\xF6DE')-  ,("threeroman", '\x2172')-  ,("threesuperior", '\x00B3')-  ,("threethai", '\x0E53')-  ,("thzsquare", '\x3394')-  ,("tihiragana", '\x3061')-  ,("tikatakana", '\x30C1')-  ,("tikatakanahalfwidth", '\xFF81')-  ,("tikeutacirclekorean", '\x3270')-  ,("tikeutaparenkorean", '\x3210')-  ,("tikeutcirclekorean", '\x3262')-  ,("tikeutkorean", '\x3137')-  ,("tikeutparenkorean", '\x3202')-  ,("tilde", '\x02DC')-  ,("tildebelowcmb", '\x0330')-  ,("tildecmb", '\x0303')-  ,("tildecomb", '\x0303')-  ,("tildedoublecmb", '\x0360')-  ,("tildeoperator", '\x223C')-  ,("tildeoverlaycmb", '\x0334')-  ,("tildeverticalcmb", '\x033E')-  ,("timescircle", '\x2297')-  ,("tipehahebrew", '\x0596')-  ,("tipehalefthebrew", '\x0596')-  ,("tippigurmukhi", '\x0A70')-  ,("titlocyrilliccmb", '\x0483')-  ,("tiwnarmenian", '\x057F')-  ,("tlinebelow", '\x1E6F')-  ,("tmonospace", '\xFF54')-  ,("toarmenian", '\x0569')-  ,("tohiragana", '\x3068')-  ,("tokatakana", '\x30C8')-  ,("tokatakanahalfwidth", '\xFF84')-  ,("tonebarextrahighmod", '\x02E5')-  ,("tonebarextralowmod", '\x02E9')-  ,("tonebarhighmod", '\x02E6')-  ,("tonebarlowmod", '\x02E8')-  ,("tonebarmidmod", '\x02E7')-  ,("tonefive", '\x01BD')-  ,("tonesix", '\x0185')-  ,("tonetwo", '\x01A8')-  ,("tonos", '\x0384')-  ,("tonsquare", '\x3327')-  ,("topatakthai", '\x0E0F')-  ,("tortoiseshellbracketleft", '\x3014')-  ,("tortoiseshellbracketleftsmall", '\xFE5D')-  ,("tortoiseshellbracketleftvertical", '\xFE39')-  ,("tortoiseshellbracketright", '\x3015')-  ,("tortoiseshellbracketrightsmall", '\xFE5E')-  ,("tortoiseshellbracketrightvertical", '\xFE3A')-  ,("totaothai", '\x0E15')-  ,("tpalatalhook", '\x01AB')-  ,("tparen", '\x24AF')-  ,("trademark", '\x2122')-  ,("trademarksans", '\xF8EA')-  ,("trademarkserif", '\xF6DB')-  ,("tretroflexhook", '\x0288')-  ,("triagdn", '\x25BC')-  ,("triaglf", '\x25C4')-  ,("triagrt", '\x25BA')-  ,("triagup", '\x25B2')-  ,("ts", '\x02A6')-  ,("tsadi", '\x05E6')-  ,("tsadidagesh", '\xFB46')-  ,("tsadidageshhebrew", '\xFB46')-  ,("tsadihebrew", '\x05E6')-  ,("tsecyrillic", '\x0446')-  ,("tsere", '\x05B5')-  ,("tsere12", '\x05B5')-  ,("tsere1e", '\x05B5')-  ,("tsere2b", '\x05B5')-  ,("tserehebrew", '\x05B5')-  ,("tserenarrowhebrew", '\x05B5')-  ,("tserequarterhebrew", '\x05B5')-  ,("tserewidehebrew", '\x05B5')-  ,("tshecyrillic", '\x045B')-  ,("tsuperior", '\xF6F3')-  ,("ttabengali", '\x099F')-  ,("ttadeva", '\x091F')-  ,("ttagujarati", '\x0A9F')-  ,("ttagurmukhi", '\x0A1F')-  ,("tteharabic", '\x0679')-  ,("ttehfinalarabic", '\xFB67')-  ,("ttehinitialarabic", '\xFB68')-  ,("ttehmedialarabic", '\xFB69')-  ,("tthabengali", '\x09A0')-  ,("tthadeva", '\x0920')-  ,("tthagujarati", '\x0AA0')-  ,("tthagurmukhi", '\x0A20')-  ,("tturned", '\x0287')-  ,("tuhiragana", '\x3064')-  ,("tukatakana", '\x30C4')-  ,("tukatakanahalfwidth", '\xFF82')-  ,("tusmallhiragana", '\x3063')-  ,("tusmallkatakana", '\x30C3')-  ,("tusmallkatakanahalfwidth", '\xFF6F')-  ,("twelvecircle", '\x246B')-  ,("twelveparen", '\x247F')-  ,("twelveperiod", '\x2493')-  ,("twelveroman", '\x217B')-  ,("twentycircle", '\x2473')-  ,("twentyhangzhou", '\x5344')-  ,("twentyparen", '\x2487')-  ,("twentyperiod", '\x249B')-  ,("two", '\x0032')-  ,("twoarabic", '\x0662')-  ,("twobengali", '\x09E8')-  ,("twocircle", '\x2461')-  ,("twocircleinversesansserif", '\x278B')-  ,("twodeva", '\x0968')-  ,("twodotenleader", '\x2025')-  ,("twodotleader", '\x2025')-  ,("twodotleadervertical", '\xFE30')-  ,("twogujarati", '\x0AE8')-  ,("twogurmukhi", '\x0A68')-  ,("twohackarabic", '\x0662')-  ,("twohangzhou", '\x3022')-  ,("twoideographicparen", '\x3221')-  ,("twoinferior", '\x2082')-  ,("twomonospace", '\xFF12')-  ,("twonumeratorbengali", '\x09F5')-  ,("twooldstyle", '\xF732')-  ,("twoparen", '\x2475')-  ,("twoperiod", '\x2489')-  ,("twopersian", '\x06F2')-  ,("tworoman", '\x2171')-  ,("twostroke", '\x01BB')-  ,("twosuperior", '\x00B2')-  ,("twothai", '\x0E52')-  ,("twothirds", '\x2154')-  ,("u", '\x0075')-  ,("uacute", '\x00FA')-  ,("ubar", '\x0289')-  ,("ubengali", '\x0989')-  ,("ubopomofo", '\x3128')-  ,("ubreve", '\x016D')-  ,("ucaron", '\x01D4')-  ,("ucircle", '\x24E4')-  ,("ucircumflex", '\x00FB')-  ,("ucircumflexbelow", '\x1E77')-  ,("ucyrillic", '\x0443')-  ,("udattadeva", '\x0951')-  ,("udblacute", '\x0171')-  ,("udblgrave", '\x0215')-  ,("udeva", '\x0909')-  ,("udieresis", '\x00FC')-  ,("udieresisacute", '\x01D8')-  ,("udieresisbelow", '\x1E73')-  ,("udieresiscaron", '\x01DA')-  ,("udieresiscyrillic", '\x04F1')-  ,("udieresisgrave", '\x01DC')-  ,("udieresismacron", '\x01D6')-  ,("udotbelow", '\x1EE5')-  ,("ugrave", '\x00F9')-  ,("ugujarati", '\x0A89')-  ,("ugurmukhi", '\x0A09')-  ,("uhiragana", '\x3046')-  ,("uhookabove", '\x1EE7')-  ,("uhorn", '\x01B0')-  ,("uhornacute", '\x1EE9')-  ,("uhorndotbelow", '\x1EF1')-  ,("uhorngrave", '\x1EEB')-  ,("uhornhookabove", '\x1EED')-  ,("uhorntilde", '\x1EEF')-  ,("uhungarumlaut", '\x0171')-  ,("uhungarumlautcyrillic", '\x04F3')-  ,("uinvertedbreve", '\x0217')-  ,("ukatakana", '\x30A6')-  ,("ukatakanahalfwidth", '\xFF73')-  ,("ukcyrillic", '\x0479')-  ,("ukorean", '\x315C')-  ,("umacron", '\x016B')-  ,("umacroncyrillic", '\x04EF')-  ,("umacrondieresis", '\x1E7B')-  ,("umatragurmukhi", '\x0A41')-  ,("umonospace", '\xFF55')-  ,("underscore", '\x005F')-  ,("underscoredbl", '\x2017')-  ,("underscoremonospace", '\xFF3F')-  ,("underscorevertical", '\xFE33')-  ,("underscorewavy", '\xFE4F')-  ,("union", '\x222A')-  ,("universal", '\x2200')-  ,("uogonek", '\x0173')-  ,("uparen", '\x24B0')-  ,("upblock", '\x2580')-  ,("upperdothebrew", '\x05C4')-  ,("upsilon", '\x03C5')-  ,("upsilondieresis", '\x03CB')-  ,("upsilondieresistonos", '\x03B0')-  ,("upsilonlatin", '\x028A')-  ,("upsilontonos", '\x03CD')-  ,("uptackbelowcmb", '\x031D')-  ,("uptackmod", '\x02D4')-  ,("uragurmukhi", '\x0A73')-  ,("uring", '\x016F')-  ,("ushortcyrillic", '\x045E')-  ,("usmallhiragana", '\x3045')-  ,("usmallkatakana", '\x30A5')-  ,("usmallkatakanahalfwidth", '\xFF69')-  ,("ustraightcyrillic", '\x04AF')-  ,("ustraightstrokecyrillic", '\x04B1')-  ,("utilde", '\x0169')-  ,("utildeacute", '\x1E79')-  ,("utildebelow", '\x1E75')-  ,("uubengali", '\x098A')-  ,("uudeva", '\x090A')-  ,("uugujarati", '\x0A8A')-  ,("uugurmukhi", '\x0A0A')-  ,("uumatragurmukhi", '\x0A42')-  ,("uuvowelsignbengali", '\x09C2')-  ,("uuvowelsigndeva", '\x0942')-  ,("uuvowelsigngujarati", '\x0AC2')-  ,("uvowelsignbengali", '\x09C1')-  ,("uvowelsigndeva", '\x0941')-  ,("uvowelsigngujarati", '\x0AC1')-  ,("v", '\x0076')-  ,("vadeva", '\x0935')-  ,("vagujarati", '\x0AB5')-  ,("vagurmukhi", '\x0A35')-  ,("vakatakana", '\x30F7')-  ,("vav", '\x05D5')-  ,("vavdagesh", '\xFB35')-  ,("vavdagesh65", '\xFB35')-  ,("vavdageshhebrew", '\xFB35')-  ,("vavhebrew", '\x05D5')-  ,("vavholam", '\xFB4B')-  ,("vavholamhebrew", '\xFB4B')-  ,("vavvavhebrew", '\x05F0')-  ,("vavyodhebrew", '\x05F1')-  ,("vcircle", '\x24E5')-  ,("vdotbelow", '\x1E7F')-  ,("vecyrillic", '\x0432')-  ,("veharabic", '\x06A4')-  ,("vehfinalarabic", '\xFB6B')-  ,("vehinitialarabic", '\xFB6C')-  ,("vehmedialarabic", '\xFB6D')-  ,("vekatakana", '\x30F9')-  ,("venus", '\x2640')-  ,("verticalbar", '\x007C')-  ,("verticallineabovecmb", '\x030D')-  ,("verticallinebelowcmb", '\x0329')-  ,("verticallinelowmod", '\x02CC')-  ,("verticallinemod", '\x02C8')-  ,("vewarmenian", '\x057E')-  ,("vhook", '\x028B')-  ,("vikatakana", '\x30F8')-  ,("viramabengali", '\x09CD')-  ,("viramadeva", '\x094D')-  ,("viramagujarati", '\x0ACD')-  ,("visargabengali", '\x0983')-  ,("visargadeva", '\x0903')-  ,("visargagujarati", '\x0A83')-  ,("vmonospace", '\xFF56')-  ,("voarmenian", '\x0578')-  ,("voicediterationhiragana", '\x309E')-  ,("voicediterationkatakana", '\x30FE')-  ,("voicedmarkkana", '\x309B')-  ,("voicedmarkkanahalfwidth", '\xFF9E')-  ,("vokatakana", '\x30FA')-  ,("vparen", '\x24B1')-  ,("vtilde", '\x1E7D')-  ,("vturned", '\x028C')-  ,("vuhiragana", '\x3094')-  ,("vukatakana", '\x30F4')-  ,("w", '\x0077')-  ,("wacute", '\x1E83')-  ,("waekorean", '\x3159')-  ,("wahiragana", '\x308F')-  ,("wakatakana", '\x30EF')-  ,("wakatakanahalfwidth", '\xFF9C')-  ,("wakorean", '\x3158')-  ,("wasmallhiragana", '\x308E')-  ,("wasmallkatakana", '\x30EE')-  ,("wattosquare", '\x3357')-  ,("wavedash", '\x301C')-  ,("wavyunderscorevertical", '\xFE34')-  ,("wawarabic", '\x0648')-  ,("wawfinalarabic", '\xFEEE')-  ,("wawhamzaabovearabic", '\x0624')-  ,("wawhamzaabovefinalarabic", '\xFE86')-  ,("wbsquare", '\x33DD')-  ,("wcircle", '\x24E6')-  ,("wcircumflex", '\x0175')-  ,("wdieresis", '\x1E85')-  ,("wdotaccent", '\x1E87')-  ,("wdotbelow", '\x1E89')-  ,("wehiragana", '\x3091')-  ,("weierstrass", '\x2118')-  ,("wekatakana", '\x30F1')-  ,("wekorean", '\x315E')-  ,("weokorean", '\x315D')-  ,("wgrave", '\x1E81')-  ,("whitebullet", '\x25E6')-  ,("whitecircle", '\x25CB')-  ,("whitecircleinverse", '\x25D9')-  ,("whitecornerbracketleft", '\x300E')-  ,("whitecornerbracketleftvertical", '\xFE43')-  ,("whitecornerbracketright", '\x300F')-  ,("whitecornerbracketrightvertical", '\xFE44')-  ,("whitediamond", '\x25C7')-  ,("whitediamondcontainingblacksmalldiamond", '\x25C8')-  ,("whitedownpointingsmalltriangle", '\x25BF')-  ,("whitedownpointingtriangle", '\x25BD')-  ,("whiteleftpointingsmalltriangle", '\x25C3')-  ,("whiteleftpointingtriangle", '\x25C1')-  ,("whitelenticularbracketleft", '\x3016')-  ,("whitelenticularbracketright", '\x3017')-  ,("whiterightpointingsmalltriangle", '\x25B9')-  ,("whiterightpointingtriangle", '\x25B7')-  ,("whitesmallsquare", '\x25AB')-  ,("whitesmilingface", '\x263A')-  ,("whitesquare", '\x25A1')-  ,("whitestar", '\x2606')-  ,("whitetelephone", '\x260F')-  ,("whitetortoiseshellbracketleft", '\x3018')-  ,("whitetortoiseshellbracketright", '\x3019')-  ,("whiteuppointingsmalltriangle", '\x25B5')-  ,("whiteuppointingtriangle", '\x25B3')-  ,("wihiragana", '\x3090')-  ,("wikatakana", '\x30F0')-  ,("wikorean", '\x315F')-  ,("wmonospace", '\xFF57')-  ,("wohiragana", '\x3092')-  ,("wokatakana", '\x30F2')-  ,("wokatakanahalfwidth", '\xFF66')-  ,("won", '\x20A9')-  ,("wonmonospace", '\xFFE6')-  ,("wowaenthai", '\x0E27')-  ,("wparen", '\x24B2')-  ,("wring", '\x1E98')-  ,("wsuperior", '\x02B7')-  ,("wturned", '\x028D')-  ,("wynn", '\x01BF')-  ,("x", '\x0078')-  ,("xabovecmb", '\x033D')-  ,("xbopomofo", '\x3112')-  ,("xcircle", '\x24E7')-  ,("xdieresis", '\x1E8D')-  ,("xdotaccent", '\x1E8B')-  ,("xeharmenian", '\x056D')-  ,("xi", '\x03BE')-  ,("xmonospace", '\xFF58')-  ,("xparen", '\x24B3')-  ,("xsuperior", '\x02E3')-  ,("y", '\x0079')-  ,("yaadosquare", '\x334E')-  ,("yabengali", '\x09AF')-  ,("yacute", '\x00FD')-  ,("yadeva", '\x092F')-  ,("yaekorean", '\x3152')-  ,("yagujarati", '\x0AAF')-  ,("yagurmukhi", '\x0A2F')-  ,("yahiragana", '\x3084')-  ,("yakatakana", '\x30E4')-  ,("yakatakanahalfwidth", '\xFF94')-  ,("yakorean", '\x3151')-  ,("yamakkanthai", '\x0E4E')-  ,("yasmallhiragana", '\x3083')-  ,("yasmallkatakana", '\x30E3')-  ,("yasmallkatakanahalfwidth", '\xFF6C')-  ,("yatcyrillic", '\x0463')-  ,("ycircle", '\x24E8')-  ,("ycircumflex", '\x0177')-  ,("ydieresis", '\x00FF')-  ,("ydotaccent", '\x1E8F')-  ,("ydotbelow", '\x1EF5')-  ,("yeharabic", '\x064A')-  ,("yehbarreearabic", '\x06D2')-  ,("yehbarreefinalarabic", '\xFBAF')-  ,("yehfinalarabic", '\xFEF2')-  ,("yehhamzaabovearabic", '\x0626')-  ,("yehhamzaabovefinalarabic", '\xFE8A')-  ,("yehhamzaaboveinitialarabic", '\xFE8B')-  ,("yehhamzaabovemedialarabic", '\xFE8C')-  ,("yehinitialarabic", '\xFEF3')-  ,("yehmedialarabic", '\xFEF4')-  ,("yehmeeminitialarabic", '\xFCDD')-  ,("yehmeemisolatedarabic", '\xFC58')-  ,("yehnoonfinalarabic", '\xFC94')-  ,("yehthreedotsbelowarabic", '\x06D1')-  ,("yekorean", '\x3156')-  ,("yen", '\x00A5')-  ,("yenmonospace", '\xFFE5')-  ,("yeokorean", '\x3155')-  ,("yeorinhieuhkorean", '\x3186')-  ,("yerahbenyomohebrew", '\x05AA')-  ,("yerahbenyomolefthebrew", '\x05AA')-  ,("yericyrillic", '\x044B')-  ,("yerudieresiscyrillic", '\x04F9')-  ,("yesieungkorean", '\x3181')-  ,("yesieungpansioskorean", '\x3183')-  ,("yesieungsioskorean", '\x3182')-  ,("yetivhebrew", '\x059A')-  ,("ygrave", '\x1EF3')-  ,("yhook", '\x01B4')-  ,("yhookabove", '\x1EF7')-  ,("yiarmenian", '\x0575')-  ,("yicyrillic", '\x0457')-  ,("yikorean", '\x3162')-  ,("yinyang", '\x262F')-  ,("yiwnarmenian", '\x0582')-  ,("ymonospace", '\xFF59')-  ,("yod", '\x05D9')-  ,("yoddagesh", '\xFB39')-  ,("yoddageshhebrew", '\xFB39')-  ,("yodhebrew", '\x05D9')-  ,("yodyodhebrew", '\x05F2')-  ,("yodyodpatahhebrew", '\xFB1F')-  ,("yohiragana", '\x3088')-  ,("yoikorean", '\x3189')-  ,("yokatakana", '\x30E8')-  ,("yokatakanahalfwidth", '\xFF96')-  ,("yokorean", '\x315B')-  ,("yosmallhiragana", '\x3087')-  ,("yosmallkatakana", '\x30E7')-  ,("yosmallkatakanahalfwidth", '\xFF6E')-  ,("yotgreek", '\x03F3')-  ,("yoyaekorean", '\x3188')-  ,("yoyakorean", '\x3187')-  ,("yoyakthai", '\x0E22')-  ,("yoyingthai", '\x0E0D')-  ,("yparen", '\x24B4')-  ,("ypogegrammeni", '\x037A')-  ,("ypogegrammenigreekcmb", '\x0345')-  ,("yr", '\x01A6')-  ,("yring", '\x1E99')-  ,("ysuperior", '\x02B8')-  ,("ytilde", '\x1EF9')-  ,("yturned", '\x028E')-  ,("yuhiragana", '\x3086')-  ,("yuikorean", '\x318C')-  ,("yukatakana", '\x30E6')-  ,("yukatakanahalfwidth", '\xFF95')-  ,("yukorean", '\x3160')-  ,("yusbigcyrillic", '\x046B')-  ,("yusbigiotifiedcyrillic", '\x046D')-  ,("yuslittlecyrillic", '\x0467')-  ,("yuslittleiotifiedcyrillic", '\x0469')-  ,("yusmallhiragana", '\x3085')-  ,("yusmallkatakana", '\x30E5')-  ,("yusmallkatakanahalfwidth", '\xFF6D')-  ,("yuyekorean", '\x318B')-  ,("yuyeokorean", '\x318A')-  ,("yyabengali", '\x09DF')-  ,("yyadeva", '\x095F')-  ,("z", '\x007A')-  ,("zaarmenian", '\x0566')-  ,("zacute", '\x017A')-  ,("zadeva", '\x095B')-  ,("zagurmukhi", '\x0A5B')-  ,("zaharabic", '\x0638')-  ,("zahfinalarabic", '\xFEC6')-  ,("zahinitialarabic", '\xFEC7')-  ,("zahiragana", '\x3056')-  ,("zahmedialarabic", '\xFEC8')-  ,("zainarabic", '\x0632')-  ,("zainfinalarabic", '\xFEB0')-  ,("zakatakana", '\x30B6')-  ,("zaqefgadolhebrew", '\x0595')-  ,("zaqefqatanhebrew", '\x0594')-  ,("zarqahebrew", '\x0598')-  ,("zayin", '\x05D6')-  ,("zayindagesh", '\xFB36')-  ,("zayindageshhebrew", '\xFB36')-  ,("zayinhebrew", '\x05D6')-  ,("zbopomofo", '\x3117')-  ,("zcaron", '\x017E')-  ,("zcircle", '\x24E9')-  ,("zcircumflex", '\x1E91')-  ,("zcurl", '\x0291')-  ,("zdot", '\x017C')-  ,("zdotaccent", '\x017C')-  ,("zdotbelow", '\x1E93')-  ,("zecyrillic", '\x0437')-  ,("zedescendercyrillic", '\x0499')-  ,("zedieresiscyrillic", '\x04DF')-  ,("zehiragana", '\x305C')-  ,("zekatakana", '\x30BC')-  ,("zero", '\x0030')-  ,("zeroarabic", '\x0660')-  ,("zerobengali", '\x09E6')-  ,("zerodeva", '\x0966')-  ,("zerogujarati", '\x0AE6')-  ,("zerogurmukhi", '\x0A66')-  ,("zerohackarabic", '\x0660')-  ,("zeroinferior", '\x2080')-  ,("zeromonospace", '\xFF10')-  ,("zerooldstyle", '\xF730')-  ,("zeropersian", '\x06F0')-  ,("zerosuperior", '\x2070')-  ,("zerothai", '\x0E50')-  ,("zerowidthjoiner", '\xFEFF')-  ,("zerowidthnonjoiner", '\x200C')-  ,("zerowidthspace", '\x200B')-  ,("zeta", '\x03B6')-  ,("zhbopomofo", '\x3113')-  ,("zhearmenian", '\x056A')-  ,("zhebrevecyrillic", '\x04C2')-  ,("zhecyrillic", '\x0436')-  ,("zhedescendercyrillic", '\x0497')-  ,("zhedieresiscyrillic", '\x04DD')-  ,("zihiragana", '\x3058')-  ,("zikatakana", '\x30B8')-  ,("zinorhebrew", '\x05AE')-  ,("zlinebelow", '\x1E95')-  ,("zmonospace", '\xFF5A')-  ,("zohiragana", '\x305E')-  ,("zokatakana", '\x30BE')-  ,("zparen", '\x24B5')-  ,("zretroflexhook", '\x0290')-  ,("zstroke", '\x01B6')-  ,("zuhiragana", '\x305A')-  ,("zukatakana", '\x30BA')-  ]
− lib/Pdf/Toolbox/Content/Ops.hs
@@ -1,196 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}---- | Content stream operators--module Pdf.Toolbox.Content.Ops-(-  Op(..),-  Expr(..),-  Operator,-  toOp-)-where--import Data.ByteString (ByteString)--import Pdf.Toolbox.Core---- | Operator with arguments-type Operator = (Op, [Object ()])---- | Content stream operators-data Op-  -- | Graphics State Operators-  = Op_q-  | Op_Q-  | Op_cm-  | Op_w-  | Op_J-  | Op_j-  | Op_M-  | Op_d-  | Op_ri-  | Op_i-  | Op_gs-  -- | Path Construction Operators-  | Op_m-  | Op_l-  | Op_c-  | Op_v-  | Op_y-  | Op_h-  | Op_re-  -- | Path Painting Operators-  | Op_S-  | Op_s-  | Op_f-  | Op_F-  | Op_f_star-  | Op_B-  | Op_B_star-  | Op_b-  | Op_b_star-  | Op_n-  -- | Clipping Path Operators-  | Op_W-  | Op_W_star-  -- | Text Object Operators-  | Op_BT-  | Op_ET-  -- | Text State Operators-  | Op_Tc-  | Op_Tw-  | Op_Tz-  | Op_TL-  | Op_Tf-  | Op_Tr-  | Op_Ts-  -- | Text Positioning Operators-  | Op_Td-  | Op_TD-  | Op_Tm-  | Op_T_star-  -- | Text Showing Operators-  | Op_Tj-  | Op_apostrophe-  | Op_quote-  | Op_TJ-  -- | Type 3 Font Operators-  | Op_d0-  | Op_d1-  -- | Color Operators-  | Op_CS-  | Op_cs-  | Op_SC-  | Op_SCN-  | Op_sc-  | Op_scn-  | Op_G-  | Op_g-  | Op_RG-  | Op_rg-  | Op_K-  | Op_k-  -- | Shading Operator-  | Op_sh-  -- | Inline Image Operators-  | Op_BI-  | Op_ID-  | Op_EI-  -- | XObject Operator-  | Op_Do-  -- | Marked Content Operators-  | Op_MP-  | Op_DP-  | Op_BMC-  | Op_BDC-  | Op_EMC-  -- | Compatibility Operators-  | Op_BX-  | Op_EX-  -- | Unknown-  | UnknownOp ByteString-  deriving (Show, Eq)---- | Expression is a regular objects or an operators-data Expr-  = Obj (Object ())-  | Op Op-  deriving (Show, Eq)---- | Conversion to operator-toOp :: ByteString -> Op-toOp "q" = Op_q-toOp "Q" = Op_Q-toOp "cm" = Op_cm-toOp "w" = Op_w-toOp "J" = Op_J-toOp "j" = Op_j-toOp "M" = Op_M-toOp "d" = Op_d-toOp "ri" = Op_ri-toOp "i" = Op_i-toOp "gs" = Op_gs-toOp "m" = Op_m-toOp "l" = Op_l-toOp "c" = Op_c-toOp "v" = Op_v-toOp "y" = Op_y-toOp "h" = Op_h-toOp "re" = Op_re-toOp "S" = Op_S-toOp "s" = Op_s-toOp "f" = Op_f-toOp "F" = Op_F-toOp "f*" = Op_f_star-toOp "B" = Op_B-toOp "B*" = Op_B_star-toOp "b" = Op_b-toOp "b*" = Op_b_star-toOp "n" = Op_n-toOp "W" = Op_W-toOp "W*" = Op_W_star-toOp "BT" = Op_BT-toOp "ET" = Op_ET-toOp "Tc" = Op_Tc-toOp "Tw" = Op_Tw-toOp "Tz" = Op_Tz-toOp "TL" = Op_TL-toOp "Tf" = Op_Tf-toOp "Tr" = Op_Tr-toOp "Ts" = Op_Ts-toOp "Td" = Op_Td-toOp "TD" = Op_TD-toOp "Tm" = Op_Tm-toOp "T*" = Op_T_star-toOp "Tj" = Op_Tj-toOp "'" = Op_apostrophe-toOp "\"" = Op_quote-toOp "TJ" = Op_TJ-toOp "d0" = Op_d0-toOp "d1" = Op_d1-toOp "CS" = Op_CS-toOp "cs" = Op_cs-toOp "SC" = Op_SC-toOp "SCN" = Op_SCN-toOp "sc" = Op_sc-toOp "scn" = Op_scn-toOp "G" = Op_G-toOp "g" = Op_g-toOp "RG" = Op_RG-toOp "rg" = Op_rg-toOp "K" = Op_K-toOp "k" = Op_k-toOp "sh" = Op_sh-toOp "BI" = Op_BI-toOp "ID" = Op_ID-toOp "EI" = Op_EI-toOp "Do" = Op_Do-toOp "MP" = Op_MP-toOp "DP" = Op_DP-toOp "BMC" = Op_BMC-toOp "BDC" = Op_BDC-toOp "EMC" = Op_EMC-toOp "BX" = Op_BX-toOp "EX" = Op_EX-toOp str = UnknownOp str
− lib/Pdf/Toolbox/Content/Parser.hs
@@ -1,119 +0,0 @@---- | Parse content stream--module Pdf.Toolbox.Content.Parser-(-  parseContentStream,-  readNextOperator,-  parseContent-)-where--import Data.Int-import qualified Data.ByteString.Char8 as ByteString8-import Data.Attoparsec.ByteString.Char8 (Parser)-import qualified Data.Attoparsec.ByteString.Char8 as Parser-import Data.IORef-import Control.Applicative-import Control.Exception-import System.IO.Streams (InputStream)-import qualified System.IO.Streams as Streams-import qualified System.IO.Streams.Attoparsec as Streams--import Pdf.Toolbox.Core-import Pdf.Toolbox.Core.Parsers.Object--import Pdf.Toolbox.Content.Ops---- | Parse content streams for a page------ Note: we need content stream ref to be able to decrypt stream content.--- We need stream length because it can be an indirect object in--- stream dictionary-parseContentStream :: MonadIO m-                   => RIS                         -- ^ random input stream to read data from-                   -> [StreamFilter]              -- ^ how to unpack data-                   -> (Ref -> IS -> IO IS)        -- ^ how to decrypt data-                   -> [(Stream Int64, Ref, Int)]  -- ^ content streams (with offset), their refs and length-                   -> PdfE m (InputStream Expr)-parseContentStream ris filters decryptor streams = do-  is <- combineStreams ris filters decryptor streams-  liftIO $ Streams.parserToInputStream parseContent is---- | Read the next operator if any-readNextOperator :: MonadIO m => InputStream Expr -> PdfE m (Maybe Operator)-readNextOperator is = annotateError "reading the next operator from content stream" $ go []-  where-  go args = do-    expr <- do-      e <- tryPdfIO $ (Right <$> Streams.read is)-        `catch` (\e -> return $ Left $ UnexpectedError $ show (e :: Streams.ParseException))-      case e of-        Right expr -> return expr-        Left er -> throwE er-    case expr of-      Nothing -> case args of-                   [] -> return Nothing-                   _ -> throwE $ UnexpectedError $ "Args without op: " ++ show args-      Just (Obj o) -> go (o : args)-      Just (Op o) -> return $ Just (o, reverse args)--combineStreams :: MonadIO m => RIS -> [StreamFilter] -> (Ref -> IS -> IO IS) -> [(Stream Int64, Ref, Int)] -> PdfE m IS-combineStreams _ _ _ [] = liftIO Streams.nullInput-combineStreams ris filters decryptor (x:xs) = do-  reader <- mkReader x xs-  ref <- liftIO $ newIORef reader-  liftIO $ Streams.makeInputStream (doRead ref)-  where-  mkReader (s, ref, len) ss = do-    Stream _ is <- decodedStreamContent ris filters (decryptor ref) len s-    return (is, ss)-  doRead ref = do-    (is, ss) <- liftIO $ readIORef ref-    chunk <- liftIO $ Streams.read is-    case chunk of-      Nothing ->-        case ss of-          [] -> return Nothing-          (h:t) -> do-            reader <- runExceptT $ mkReader h t-            case reader of-              Left e -> liftIO $ ioError $ userError $ show e-              Right r -> do-                liftIO $ writeIORef ref r-                doRead ref-      Just c -> return (Just c)--parseContent :: Parser (Maybe Expr)-parseContent-  = (skipSpace >> Parser.endOfInput >> return Nothing)-  <|> do-    skipSpace-    fmap Just $ fmap Obj parseObject-      <|> fmap (Op . toOp) (Parser.takeWhile1 isRegularChar)-      -- See Note Inline image-      <|> fmap (Op . UnknownOp . ByteString8.pack . return) Parser.anyChar--{- Note Inline image--There is at least one case that doesn't fit the way we represent content-stream operators: inline images, see Pdf1.7:8.9.7--Inline image looks like "BI" operator, a number of key/value pairs, "ID"-operator, image data and "EI" operator. I have no idea how to handle that case.-There is no data length, so the "EI" string is the only indicator for end-of image data. What if the data contains "EI"?--For now lets skip all unknown bytes as unknown operator. That seems to work,-but it is not reliable.--}---- Treat comments as spaces-skipSpace :: Parser ()-skipSpace = do-  Parser.skipSpace-  _ <- many $ do-    _ <- Parser.char '%'-    Parser.skipWhile $ \c -> c /= '\n' && c /= '\r'-    Parser.skipSpace-  return ()
− lib/Pdf/Toolbox/Content/Processor.hs
@@ -1,298 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}---- | Process content stream operators maintaining graphics state------ It is pretty experimental--module Pdf.Toolbox.Content.Processor-(-  Processor(..),-  GraphicsState(..),-  GlyphDecoder,-  Glyph(..),-  initialGraphicsState,-  mkProcessor,-  processOp-)-where--import Data.Text (Text)-import Control.Monad--import Pdf.Toolbox.Core--import Pdf.Toolbox.Content.Ops-import Pdf.Toolbox.Content.Transform---- | Given font name and string, it should return list of glyphs--- and their widths.------ Note: it should not try to position or scale glyphs to user space,--- bounding boxes should be defined in glyph space.------ Note: glyph width is a distance between the glyph's origin and--- the next glyph's origin, so it generally can't be calculated--- from bounding box------ Note: the 'Processor' actually doesn't cares about glyph's--- bounding box, so you can return anything you want-type GlyphDecoder = Name -> Str -> [(Glyph, Double)]---- | Glyph-data Glyph = Glyph {-  -- | The code as read from content stream-  glyphCode :: Int,-  -- | Top-left corner of glyph's bounding box-  glyphTopLeft :: Vector Double,-  -- | Bottom-right corner of glyph's bounding box-  glyphBottomRight :: Vector Double,-  -- | Text ectracted from the glyph-  glyphText :: Maybe Text-  }-  deriving Show---- | Graphics state-data GraphicsState = GraphicsState {-  gsInText :: Bool,    -- ^ Indicates that we are inside text object-  gsCurrentTransformMatrix :: Transform Double,-  gsFont :: Maybe Name,-  gsFontSize :: Maybe Double,-  gsTextMatrix :: Transform Double,      -- ^ Defined only inside text object-  gsTextLineMatrix :: Transform Double,  -- ^ Defined only inside text object-  gsTextLeading :: Double,-  gsTextCharSpacing :: Double,-  gsTextWordSpacing :: Double-  }-  deriving Show---- | Empty graphics state-initialGraphicsState :: GraphicsState-initialGraphicsState = GraphicsState {-  gsInText = False,-  gsCurrentTransformMatrix = identity,-  gsFont = Nothing,-  gsFontSize = Nothing,-  gsTextMatrix = identity,-  gsTextLineMatrix = identity,-  gsTextLeading = 0,-  gsTextCharSpacing = 0,-  gsTextWordSpacing = 0-  }---- | Processor maintains graphics state-data Processor = Processor {-  prState :: GraphicsState,-  prStateStack :: [GraphicsState],-  prGlyphDecoder :: GlyphDecoder,-  prGlyphs :: [[Glyph]]         -- ^ Each element is a list of glyphs, drawn in one shot-  }---- | Create processor in initial state-mkProcessor :: Processor-mkProcessor = Processor {-  prState = initialGraphicsState,-  prStateStack = [],-  prGlyphDecoder = \_ _ -> [],-  prGlyphs = mempty-  }---- | Process one operation-processOp :: Monad m => Operator -> Processor -> PdfE m Processor--processOp (Op_q, []) p = return p {prStateStack = prState p : prStateStack p}-processOp (Op_q, args) _ = throwE $ UnexpectedError $ "Op_q: wrong number of arguments: " ++ show args--processOp (Op_Q, []) p =-  case prStateStack p of-    [] -> throwE $ UnexpectedError "Op_Q: state is empty"-    (x:xs) -> return p {prState = x, prStateStack = xs}-processOp (Op_Q, args) _ = throwE $ UnexpectedError $ "Op_Q: wrong number of arguments: " ++ show args--processOp (Op_BT, []) p = do-  ensureInTextObject False p-  let gstate = prState p-  return p {prState = gstate {-    gsInText = True,-    gsTextMatrix = identity,-    gsTextLineMatrix = identity-    }}-processOp (Op_BT, args) _ = throwE $ UnexpectedError $ "Op_BT: wrong number of arguments: " ++ show args--processOp (Op_ET, []) p = do-  ensureInTextObject True p-  let gstate = prState p-  return p {prState = gstate {-    gsInText = False-    }}-processOp (Op_ET, args) _ = throwE $ UnexpectedError $ "Op_ET: wrong number of arguments: " ++ show args--processOp (Op_Td, [txo, tyo]) p = do-  ensureInTextObject True p-  tx <- fromObject txo >>= realValue-  ty <- fromObject tyo >>= realValue-  let gstate = prState p-      tm = translate tx ty $ gsTextLineMatrix gstate-  return p {prState = gstate {-    gsTextMatrix = tm,-    gsTextLineMatrix = tm-    }}-processOp (Op_Td, args) _ = throwE $ UnexpectedError $ "Op_Td: wrong number of arguments: " ++ show args--processOp (Op_TD, [txo, tyo]) p = do-  l <- fromObject tyo >>= realValue-  p' <- processOp (Op_TL, [ONumber $ NumReal $ negate l]) p-  processOp (Op_Td, [txo, tyo]) p'-processOp (Op_TD, args) _ = throwE $ UnexpectedError $ "Op_TD: wrong number of arguments: " ++ show args--processOp (Op_Tm, [a', b', c', d', e', f']) p = do-  ensureInTextObject True p-  a <- fromObject a' >>= realValue-  b <- fromObject b' >>= realValue-  c <- fromObject c' >>= realValue-  d <- fromObject d' >>= realValue-  e <- fromObject e' >>= realValue-  f <- fromObject f' >>= realValue-  let gstate = prState p-      tm = Transform a b c d e f-  return p {prState = gstate {-    gsTextMatrix = tm,-    gsTextLineMatrix = tm-    }}-processOp (Op_Tm, args) _ = throwE $ UnexpectedError $ "Op_Tm: wrong number of arguments: " ++ show args--processOp (Op_T_star, []) p = do-  ensureInTextObject True p-  let gstate = prState p-      l = gsTextLeading gstate-  processOp (Op_TD, map (ONumber . NumReal) [0, negate l]) p-processOp (Op_T_star, args) _ = throwE $ UnexpectedError $ "Op_T_star: wrong number of arguments: " ++ show args--processOp (Op_TL, [lo]) p = do-  l <- fromObject lo >>= realValue-  let gstate = prState p-  return p {prState = gstate {-    gsTextLeading = l-    }}-processOp (Op_TL, args) _ = throwE $ UnexpectedError $ "Op_TL: wrong number of arguments: " ++ show args--processOp (Op_cm, [a', b', c', d', e', f']) p = do-  a <- fromObject a' >>= realValue-  b <- fromObject b' >>= realValue-  c <- fromObject c' >>= realValue-  d <- fromObject d' >>= realValue-  e <- fromObject e' >>= realValue-  f <- fromObject f' >>= realValue-  let gstate = prState p-      ctm = Transform a b c d e f `multiply` gsCurrentTransformMatrix gstate-  return p {prState = gstate {-    gsCurrentTransformMatrix = ctm-    }}-processOp (Op_cm, args) _ = throwE $ UnexpectedError $ "Op_cm: wrong number of arguments: " ++ show args--processOp (Op_Tf, [fontO, szO]) p = do-  font <- fromObject fontO-  sz <- fromObject szO >>= realValue-  let gstate = prState p-  return p {prState = gstate {-    gsFont = Just font,-    gsFontSize = Just sz-    }}-processOp (Op_Tf, args) _ = throwE $ UnexpectedError $ "Op_Tf: wrong number of agruments: " ++ show args--processOp (Op_Tj, [OStr str]) p = do-  let gstate = prState p-  fontName <--    case gsFont gstate of-      Nothing -> throwE $ UnexpectedError "Op_Tj: font not set"-      Just fn -> return fn-  fontSize <--    case gsFontSize gstate of-      Nothing -> throwE $ UnexpectedError "Op_Tj: font size not set"-      Just fs -> return fs-  let (tm, glyphs) = positionGlyghs fontSize (gsCurrentTransformMatrix gstate)-                       (gsTextMatrix gstate) (gsTextCharSpacing gstate) (gsTextWordSpacing gstate) $-                       prGlyphDecoder p fontName str-  return p {-    prGlyphs = prGlyphs p ++ [glyphs],-    prState = gstate {-      gsTextMatrix = tm-      }-    }-processOp (Op_Tj, args) _ = throwE $ UnexpectedError $ "Op_Tj: wrong number of agruments:" ++ show args--processOp (Op_TJ, [OArray (Array array)]) p = do-  let gstate = prState p-  fontName <--    case gsFont gstate of-      Nothing -> throwE $ UnexpectedError "Op_Tj: font not set"-      Just fn -> return fn-  fontSize <--    case gsFontSize gstate of-      Nothing -> throwE $ UnexpectedError "Op_Tj: font size not set"-      Just fs -> return fs-  let (textMatrix, glyphs) = loop (gsTextMatrix gstate) [] array-        where-        loop tm res [] = (tm, reverse res)-        loop tm res (OStr str : rest) = let (tm', gs) = positionGlyghs fontSize (gsCurrentTransformMatrix gstate)-                                                          tm (gsTextCharSpacing gstate) (gsTextWordSpacing gstate)-                                                          (prGlyphDecoder p fontName str)-                                        in loop tm' (gs : res) rest-        loop tm res (ONumber (NumInt i): rest) = loop (translate (fromIntegral (-i) * fontSize / 1000) 0 tm) res rest-        loop tm res (ONumber (NumReal d): rest) = loop (translate (-d * fontSize / 1000) 0 tm) res rest-        loop tm res (_:rest) = loop tm res rest-  return p {-    prGlyphs = prGlyphs p ++ glyphs,-    prState = gstate {-      gsTextMatrix = textMatrix-      }-    }-processOp (Op_TJ, args) _ = throwE $ UnexpectedError $ "Op_TJ: wrong number of agruments:" ++ show args--processOp (Op_Tc, [o]) p = do-  spacing <- fromObject o >>= realValue-  let gstate = prState p-  return p {-    prState = gstate {-      gsTextCharSpacing = spacing-      }-    }-processOp (Op_Tc, args) _ = throwE $ UnexpectedError $ "Op_Tc: wrong number of agruments:" ++ show args--processOp (Op_Tw, [o]) p = do-  spacing <- fromObject o >>= realValue-  let gstate = prState p-  return p {-    prState = gstate {-      gsTextWordSpacing = spacing-      }-    }-processOp (Op_Tw, args) _ = throwE $ UnexpectedError $ "Op_Tw: wrong number of agruments:" ++ show args--processOp (Op_apostrophe, [o]) p = do-  p' <- processOp (Op_T_star, []) p-  processOp (Op_Tj, [o]) p'-processOp (Op_apostrophe, args) _ = throwE $ UnexpectedError $ "Op_apostrophe: wrong number of agruments:" ++ show args--processOp _ p = return p--ensureInTextObject :: Monad m => Bool -> Processor -> PdfE m ()-ensureInTextObject inText p =-  unless (inText == gsInText (prState p)) $ throwE $-    UnexpectedError $ "ensureInTextObject: expected: " ++ show inText ++ ", found: " ++ show (gsInText $ prState p)--positionGlyghs :: Double -> Transform Double -> Transform Double -> Double -> Double -> [(Glyph, Double)] -> (Transform Double, [Glyph])-positionGlyghs fontSize ctm textMatrix charSpacing wordSpacing = go textMatrix []-  where-  go tm res [] = (tm, reverse res)-  go tm res ((g, width):gs) =-    let g' = g {-          glyphTopLeft = transform (multiply tm ctm) topLeft,-          glyphBottomRight = transform (multiply tm ctm) bottomRight-          }-        topLeft = transform (scale fontSize fontSize) $ glyphTopLeft g-        bottomRight = transform (scale fontSize fontSize) $ glyphBottomRight g-        spacing = charSpacing + case glyphText g of-                                  Just " " -> wordSpacing-                                  _ -> 0-        tm' = translate (width * fontSize + spacing) 0 tm-    in go tm' (g':res) gs
− lib/Pdf/Toolbox/Content/TexGlyphList.hs
@@ -1,304 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}---- | Mapping from glyph names to unicode characters--- for TeX fonts--module Pdf.Toolbox.Content.TexGlyphList-(-  texGlyphList-)-where--import Data.ByteString (ByteString)-import Data.Map (Map)-import qualified Data.Map as Map---- | Glyph list-texGlyphList :: Map ByteString Char-texGlyphList = Map.fromList-  [("Delta", '\x2206')-  ,("Ifractur", '\x2111')-  ,("FFsmall", '\xF766')-  ,("FFIsmall", '\xF766')-  ,("FFLsmall", '\xF766')-  ,("FIsmall", '\xF766')-  ,("FLsmall", '\xF766')-  ,("Germandbls", '\x0053')-  ,("Germandblssmall", '\xF773')-  ,("Ng", '\x014A')-  ,("Omega", '\x2126')-  ,("Rfractur", '\x211C')-  ,("SS", '\x0053')-  ,("SSsmall", '\xF773')-  ,("altselector", '\xD802')-  ,("angbracketleft", '\x27E8')-  ,("angbracketright", '\x27E9')-  ,("arrowbothv", '\x2195')-  ,("arrowdblbothv", '\x21D5')-  ,("arrowleftbothalf", '\x21BD')-  ,("arrowlefttophalf", '\x21BC')-  ,("arrownortheast", '\x2197')-  ,("arrownorthwest", '\x2196')-  ,("arrowrightbothalf", '\x21C1')-  ,("arrowrighttophalf", '\x21C0')-  ,("arrowsoutheast", '\x2198')-  ,("arrowsouthwest", '\x2199')-  ,("ascendercompwordmark", '\xD80A')-  ,("asteriskcentered", '\x2217')-  ,("bardbl", '\x2225')-  ,("capitalcompwordmark", '\xD809')-  ,("ceilingleft", '\x2308')-  ,("ceilingright", '\x2309')-  ,("circlecopyrt", '\x20DD')-  ,("circledivide", '\x2298')-  ,("circledot", '\x2299')-  ,("circleminus", '\x2296')-  ,("coproduct", '\x2A3F')-  ,("ct", '\x0063')-  ,("cwm", '\x200C')-  ,("dblbracketleft", '\x27E6')-  ,("dblbracketright", '\x27E7')-  ,("diamond", '\x2662')-  ,("diamondmath", '\x22C4')-  ,("dotlessj", '\x0237')-  ,("emptyset", '\x2205')-  ,("emptyslot", '\xD801')-  ,("epsilon1", '\x03F5')-  ,("epsiloninv", '\x03F6')-  ,("equivasymptotic", '\x224D')-  ,("flat", '\x266D')-  ,("floorleft", '\x230A')-  ,("floorright", '\x230B')-  ,("follows", '\x227B')-  ,("followsequal", '\x2AB0')-  ,("followsorcurly", '\x227D')-  ,("greatermuch", '\x226B')-  ,("heart", '\x2661')-  ,("interrobang", '\x203D')-  ,("interrobangdown", '\x2E18')-  ,("intersectionsq", '\x2293')-  ,("latticetop", '\x22A4')-  ,("lessmuch", '\x226A')-  ,("longdbls", '\x017F')-  ,("longsh", '\x017F')-  ,("longsi", '\x017F')-  ,("longsl", '\x017F')-  ,("longst", '\xFB05')-  ,("lscript", '\x2113')-  ,("natural", '\x266E')-  ,("negationslash", '\x0338')-  ,("ng", '\x014B')-  ,("owner", '\x220B')-  ,("pertenthousand", '\x2031')-  ,("phi", '\x03D5')-  ,("phi1", '\x03C6')-  ,("pi1", '\x03D6')-  ,("precedesequal", '\x2AAF')-  ,("precedesorcurly", '\x227C')-  ,("prime", '\x2032')-  ,("rho1", '\x03F1')-  ,("ringfitted", '\xD80D')-  ,("sharp", '\x266F')-  ,("similarequal", '\x2243')-  ,("slurabove", '\x2322')-  ,("slurbelow", '\x2323')-  ,("st", '\xFB06')-  ,("star", '\x22C6')-  ,("subsetsqequal", '\x2291')-  ,("supersetsqequal", '\x2292')-  ,("triangle", '\x25B3')-  ,("triangleinv", '\x25BD')-  ,("triangleleft", '\x25C1')-  ,("triangleright", '\x25B7')-  ,("turnstileleft", '\x22A2')-  ,("turnstileright", '\x22A3')-  ,("twelveudash", '\xD80C')-  ,("unionmulti", '\x228E')-  ,("unionsq", '\x2294')-  ,("vector", '\x20D7')-  ,("visualspace", '\x2423')-  ,("wreathproduct", '\x2240')-  ,("Dbar", '\x0110')-  ,("compwordmark", '\x200C')-  ,("dbar", '\x0111')-  ,("rangedash", '\x2013')-  ,("hyphenchar", '\x002D')-  ,("punctdash", '\x2014')-  ,("visiblespace", '\x2423')-  ,("Yen", '\x00A5')-  ,("anticlockwise", '\x27F2')-  ,("arrowparrleftright", '\x21C6')-  ,("arrowparrrightleft", '\x21C4')-  ,("arrowtailleft", '\x21A2')-  ,("arrowtailright", '\x21A3')-  ,("arrowtripleleft", '\x21DA')-  ,("arrowtripleright", '\x21DB')-  ,("between", '\x226C')-  ,("check", '\x2713')-  ,("circleR", '\x00AE')-  ,("circleS", '\x24C8')-  ,("circleasterisk", '\x229B')-  ,("circleequal", '\x229C')-  ,("circlering", '\x229A')-  ,("clockwise", '\x27F3')-  ,("complement", '\x2201')-  ,("curlyleft", '\x21AB')-  ,("curlyright", '\x21AC')-  ,("dblarrowdwn", '\x21CA')-  ,("dblarrowheadleft", '\x219E')-  ,("dblarrowheadright", '\x21A0')-  ,("dblarrowup", '\x21C8')-  ,("defines", '\x225C')-  ,("diamondsolid", '\x2666')-  ,("difference", '\x224F')-  ,("dotplus", '\x2214')-  ,("downfall", '\x22CE')-  ,("equaldotleftright", '\x2252')-  ,("equaldotrightleft", '\x2253')-  ,("equalorfollows", '\x22DF')-  ,("equalorgreater", '\x2A96')-  ,("equalorless", '\x2A95')-  ,("equalorprecedes", '\x22DE')-  ,("equalsdots", '\x2251')-  ,("followsorequal", '\x227F')-  ,("forces", '\x22A9')-  ,("forcesbar", '\x22AA')-  ,("fork", '\x22D4')-  ,("frown", '\x2322')-  ,("geomequivalent", '\x224E')-  ,("greaterdbleqlless", '\x2A8C')-  ,("greaterdblequal", '\x2267')-  ,("greaterlessequal", '\x22DB')-  ,("greaterorapproxeql", '\x2A86')-  ,("greaterorequalslant", '\x2A7E')-  ,("greaterorsimilar", '\x2273')-  ,("harpoondownleft", '\x21C3')-  ,("harpoondownright", '\x21C2')-  ,("harpoonleftright", '\x21CC')-  ,("harpoonrightleft", '\x21CB')-  ,("harpoonupleft", '\x21BF')-  ,("harpoonupright", '\x21BE')-  ,("intercal", '\x22BA')-  ,("intersectiondbl", '\x22D2')-  ,("lessdbleqlgreater", '\x2A8B')-  ,("lessdblequal", '\x2266')-  ,("lessequalgreater", '\x22DA')-  ,("lessorapproxeql", '\x2A85')-  ,("lessorequalslant", '\x2A7D')-  ,("lessorsimilar", '\x2272')-  ,("maltesecross", '\x2720')-  ,("measuredangle", '\x2221')-  ,("multimap", '\x22B8')-  ,("multiopenleft", '\x22CB')-  ,("multiopenright", '\x22CC')-  ,("nand", '\x22BC')-  ,("orunderscore", '\x22BB')-  ,("perpcorrespond", '\x2A5E')-  ,("precedesorequal", '\x227E')-  ,("primereverse", '\x2035')-  ,("revasymptequal", '\x22CD')-  ,("revsimilar", '\x223D')-  ,("rightanglene", '\x231D')-  ,("rightanglenw", '\x231C')-  ,("rightanglese", '\x231F')-  ,("rightanglesw", '\x231E')-  ,("ringinequal", '\x2256')-  ,("satisfies", '\x22A8')-  ,("shiftleft", '\x21B0')-  ,("shiftright", '\x21B1')-  ,("smile", '\x2323')-  ,("sphericalangle", '\x2222')-  ,("square", '\x25A1')-  ,("squaredot", '\x22A1')-  ,("squareimage", '\x228F')-  ,("squareminus", '\x229F')-  ,("squaremultiply", '\x22A0')-  ,("squareoriginal", '\x2290')-  ,("squareplus", '\x229E')-  ,("squaresolid", '\x25A0')-  ,("squiggleleftright", '\x21AD')-  ,("squiggleright", '\x21DD')-  ,("subsetdbl", '\x22D0')-  ,("subsetdblequal", '\x2AC5')-  ,("supersetdbl", '\x22D1')-  ,("supersetdblequal", '\x2AC6')-  ,("triangledownsld", '\x25BC')-  ,("triangleleftequal", '\x22B4')-  ,("triangleleftsld", '\x25C0')-  ,("trianglerightequal", '\x22B5')-  ,("trianglerightsld", '\x25B6')-  ,("trianglesolid", '\x25B2')-  ,("uniondbl", '\x22D3')-  ,("uprise", '\x22CF')-  ,("Digamma", '\x1D7CB')-  ,("Finv", '\x2132')-  ,("Gmir", '\x2141')-  ,("Omegainv", '\x2127')-  ,("approxorequal", '\x224A')-  ,("archleftdown", '\x21B6')-  ,("archrightdown", '\x21B7')-  ,("beth", '\x2136')-  ,("daleth", '\x2138')-  ,("dividemultiply", '\x22C7')-  ,("downslope", '\x29F9')-  ,("equalorsimilar", '\x2242')-  ,("follownotdbleqv", '\x2ABA')-  ,("follownotslnteql", '\x2AB6')-  ,("followornoteqvlnt", '\x22E9')-  ,("greaterdot", '\x22D7')-  ,("greaternotdblequal", '\x2A8A')-  ,("greaternotequal", '\x2A88')-  ,("greaterornotdbleql", '\x2269')-  ,("greaterornotequal", '\x2269')-  ,("integerdivide", '\x2216')-  ,("lessdot", '\x22D6')-  ,("lessnotdblequal", '\x2A89')-  ,("lessnotequal", '\x2A87')-  ,("lessornotdbleql", '\x2268')-  ,("lessornotequal", '\x2268')-  ,("multicloseleft", '\x22C9')-  ,("multicloseright", '\x22CA')-  ,("notapproxequal", '\x2247')-  ,("notarrowboth", '\x21AE')-  ,("notarrowleft", '\x219A')-  ,("notarrowright", '\x219B')-  ,("notbar", '\x2224')-  ,("notdblarrowboth", '\x21CE')-  ,("notdblarrowleft", '\x21CD')-  ,("notdblarrowright", '\x21CF')-  ,("notexistential", '\x2204')-  ,("notfollows", '\x2281')-  ,("notfollowsoreql", '\x2AB0')-  ,("notforces", '\x22AE')-  ,("notforcesextra", '\x22AF')-  ,("notgreaterdblequal", '\x2267')-  ,("notgreaterequal", '\x2271')-  ,("notgreaterorslnteql", '\x2A7E')-  ,("notlessdblequal", '\x2266')-  ,("notlessequal", '\x2270')-  ,("notlessorslnteql", '\x2A7D')-  ,("notprecedesoreql", '\x2AAF')-  ,("notsatisfies", '\x22AD')-  ,("notsimilar", '\x2241')-  ,("notsubseteql", '\x2288')-  ,("notsubsetordbleql", '\x2AC5')-  ,("notsubsetoreql", '\x228A')-  ,("notsuperseteql", '\x2289')-  ,("notsupersetordbleql", '\x2AC6')-  ,("notsupersetoreql", '\x228B')-  ,("nottriangeqlleft", '\x22EC')-  ,("nottriangeqlright", '\x22ED')-  ,("nottriangleleft", '\x22EA')-  ,("nottriangleright", '\x22EB')-  ,("notturnstile", '\x22AC')-  ,("planckover2pi", '\x210F')-  ,("planckover2pi1", '\x210F')-  ,("precedenotdbleqv", '\x2AB9')-  ,("precedenotslnteql", '\x2AB5')-  ,("precedeornoteqvlnt", '\x22E8')-  ,("subsetnoteql", '\x228A')-  ,("subsetornotdbleql", '\x2ACB')-  ,("supersetnoteql", '\x228B')-  ,("supersetornotdbleql", '\x2ACC')-  ,("upslope", '\x29F8')-  ]
− lib/Pdf/Toolbox/Content/Transform.hs
@@ -1,54 +0,0 @@---- | 2d affine transform--module Pdf.Toolbox.Content.Transform-(-  Transform(..),-  Vector(..),-  identity,-  translation,-  scale,-  transform,-  translate,-  multiply-)-where---- | Affine transform-data Transform a = Transform a a a a a a-  deriving Show---- | 2d vector/point-data Vector a = Vector a a-  deriving Show---- | Identity transform-identity :: Num a => Transform a-identity = Transform 1 0 0 1 0 0---- | Translation-translation :: Num a => a -> a -> Transform a-translation tx ty = Transform 1 0 0 1 tx ty---- | Scale-scale :: Num a => a -> a -> Transform a-scale sx sy = Transform sx 0 0 sy 0 0---- | Apply transformation to vector-transform :: Num a => Transform a -> Vector a -> Vector a-transform (Transform a b c d e f) (Vector x y) = Vector (a * x + c * y + e) (b * x + d * y + f)---- | Translate-translate :: Num a => a -> a -> Transform a -> Transform a-translate tx ty t = translation tx ty `multiply` t---- | Combine two transformations-multiply :: Num a => Transform a -> Transform a -> Transform a-multiply (Transform a1 b1 c1 d1 e1 f1) (Transform a2 b2 c2 d2 e2 f2) = Transform a b c d e f-  where-  a = a1 * a2 + b1 * c2-  b = a1 * b2 + b1 * d2-  c = c1 * a2 + d1 * c2-  d = c1 * b2 + d1 * d2-  e = e1 * a2 + f1 * c2 + e2-  f = e1 * b2 + f1 * d2 + f2
− lib/Pdf/Toolbox/Content/UnicodeCMap.hs
@@ -1,203 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}---- | Unicode CMap defines mapping from glyphs to text--module Pdf.Toolbox.Content.UnicodeCMap-(-  UnicodeCMap(..),-  parseUnicodeCMap,-  unicodeCMapNextGlyph,-  unicodeCMapDecodeGlyph-)-where--import Data.Monoid-import Data.Char-import qualified Data.List as List-import Data.Map (Map)-import qualified Data.Map as Map-import Data.ByteString (ByteString)-import qualified Data.ByteString as BS-import qualified Data.ByteString.Base16 as Base16-import Data.Text (Text)-import qualified Data.Text as Text-import qualified Data.Text.Encoding as Text-import Data.Attoparsec.ByteString.Char8 (Parser, parseOnly)-import qualified Data.Attoparsec.ByteString.Char8 as P-import Control.Monad---- | Unicode character map------ Font dictionary can contain \"ToUnicode\" key -- reference--- to a stream with unicode CMap-data UnicodeCMap = UnicodeCMap {-  unicodeCMapCodeRanges :: [(ByteString, ByteString)],-  unicodeCMapChars :: Map Int Text,-  unicodeCMapRanges :: [(Int, Int, Char)]-  }-  deriving (Show)---- | Parse content of unicode CMap-parseUnicodeCMap :: ByteString -> Either String UnicodeCMap-parseUnicodeCMap cmap =-  case (codeRanges, chars, ranges) of-    (Right cr, Right cs, Right (rs, crs)) -> Right $ UnicodeCMap {-      unicodeCMapCodeRanges = cr,-      unicodeCMapChars = cs <> crs,-      unicodeCMapRanges = rs-      }-    (Left err, _, _) -> Left $ "CMap code ranges: " ++ err-    (_, Left err, _) -> Left $ "CMap chars: " ++ err-    (_, _, Left err) -> Left $ "CMap ranges: " ++ err-  where-  codeRanges = parseOnly codeRangesParser cmap-  chars = parseOnly charsParser cmap-  ranges = parseOnly rangesParser cmap---- | Take the next glyph code from string, also returns the rest of the string-unicodeCMapNextGlyph :: UnicodeCMap -> ByteString -> Maybe (Int, ByteString)-unicodeCMapNextGlyph cmap = go 1-  where-  go 5 _ = Nothing-  go n str =-    let glyph = BS.take n str in-    if BS.length glyph /= n-      then Nothing-      else if any (inRange glyph) (unicodeCMapCodeRanges cmap)-             then Just (toCode glyph, BS.drop n str)-             else go (n + 1) str-  inRange glyph (start, end) = glyph >= start && glyph <= end--toCode :: ByteString -> Int-toCode bs = fst $ BS.foldr (\b (sm, i) ->-                    (sm + fromIntegral b * i, i * 255)) (0, 1) bs---- | Convert glyph to text------ Note: one glyph can represent more then one char, e.g. for ligatures-unicodeCMapDecodeGlyph :: UnicodeCMap -> Int -> Maybe Text-unicodeCMapDecodeGlyph cmap glyph =-  case Map.lookup glyph (unicodeCMapChars cmap) of-    Just txt -> Just txt-    Nothing ->-      case filter inRange (unicodeCMapRanges cmap) of-        [(start, _, char)] -> Just (Text.singleton $ toEnum-                                    $ (fromEnum char) + (glyph - start))-        _ -> Nothing-  where-  inRange (start, end, _) = glyph >= start && glyph <= end--charsParser :: Parser (Map Int Text)-charsParser = do-  combineChars <$> P.many' charsParser'-  where-  combineChars = List.foldl' Map.union Map.empty--charsParser' :: Parser (Map Int Text)-charsParser' = do-  n <- skipTillParser $ do-    n <- P.decimal-    P.skipSpace-    _ <- P.string "beginbfchar"-    return n--  chars <- replicateM n $ do-    P.skipSpace-    i <- parseHex-    P.skipSpace-    j <- parseHex-    return (toCode i, Text.decodeUtf16BE j)--  return $ Map.fromList chars---- | It returns regular ranges and char map------ Array ranges are converted to char map-rangesParser :: Parser ([(Int, Int, Char)], Map Int Text)-rangesParser =-  combineRanges <$> P.many' rangesParser'-  where-  combineRanges = List.foldl' combineRange ([], Map.empty)-  combineRange (ranges, rmap) (ranges', rmap') =-    (ranges ++ ranges', Map.union rmap rmap')--rangesParser' :: Parser ([(Int, Int, Char)], Map Int Text)-rangesParser' = do-  n <- skipTillParser $ do-    n <- P.decimal-    P.skipSpace-    void $ P.string "beginbfrange"-    return (n :: Int)--  let go 0 rs cs = return (rs, cs)-      go count rs cs = do-        P.skipSpace-        i <- toCode <$> parseHex-        P.skipSpace-        j <- toCode <$> parseHex-        P.skipSpace-        k <- P.eitherP parseHex parseHexArray-        case k of-          Left h -> do-            c <- case Text.uncons $ Text.decodeUtf16BE h of-                   Nothing -> fail "Can't decode range"-                   Just (v, _) -> return v-            go (pred count) ((i, j, c) : rs) cs-          Right hs -> do-            let cs' = zip [i..j] . map Text.decodeUtf16BE $ hs-            go (pred count) rs (cs <> Map.fromList cs')--  go n mempty mempty--codeRangesParser :: Parser [(ByteString, ByteString)]-codeRangesParser = do-  n <- skipTillParser $ do-    n <- P.decimal-    P.skipSpace-    void $ P.string "begincodespacerange"-    return n--  replicateM n $ do-    P.skipSpace-    i <- parseHex-    P.skipSpace-    j <- parseHex-    return (i, j)--parseHex :: Parser ByteString-parseHex = do-  void $ P.char '<'-  -- hex can contain spaces, lets filter them out-  res <- P.takeTill (== '>') >>= fromHex . BS.filter (/= 32)-  void $ P.char '>'-  return res--parseHexArray :: Parser [ByteString]-parseHexArray = do-  void $ P.char '['-  res <- P.many' $ do-    P.skipSpace-    parseHex-  P.skipSpace-  void $ P.char ']'-  return res---- XXX: wtf?!-fromHex :: Monad m => ByteString -> m ByteString-fromHex hex = do-  let (str, rest) = Base16.decode $ bsToLower hex-  unless (BS.null rest) $-    fail $ "Can't decode hex" ++ show rest-  return str-  where-  bsToLower = BS.map $ fromIntegral-                     . fromEnum-                     . toLower-                     . toEnum-                     . fromIntegral--skipTillParser :: Parser a -> Parser a-skipTillParser p = P.choice [-  p,-  P.anyChar >> skipTillParser p-  ]
pdf-toolbox-content.cabal view
@@ -1,5 +1,5 @@ name:                pdf-toolbox-content-version:             0.0.5.1+version:             0.1.1 synopsis:            A collection of tools for processing PDF files license:             BSD3 license-file:        LICENSE@@ -8,7 +8,7 @@ copyright:           Copyright (c) Yuras Shumovich 2013-2016 category:            PDF build-type:          Simple-cabal-version:       >=1.8+cabal-version:       >=1.10 homepage:            https://github.com/Yuras/pdf-toolbox extra-source-files:  changelog.md description:@@ -22,23 +22,51 @@   hs-source-dirs:      lib                        compat   exposed-modules:-                       Pdf.Toolbox.Content-                       Pdf.Toolbox.Content.Parser-                       Pdf.Toolbox.Content.Ops-                       Pdf.Toolbox.Content.Processor-                       Pdf.Toolbox.Content.Transform-                       Pdf.Toolbox.Content.UnicodeCMap-                       Pdf.Toolbox.Content.FontInfo-                       Pdf.Toolbox.Content.GlyphList-                       Pdf.Toolbox.Content.TexGlyphList-                       Pdf.Toolbox.Content.Encoding.WinAnsi-                       Pdf.Toolbox.Content.Encoding.MacRoman+                       Pdf.Content+                       Pdf.Content.Parser+                       Pdf.Content.Ops+                       Pdf.Content.Processor+                       Pdf.Content.Transform+                       Pdf.Content.UnicodeCMap+                       Pdf.Content.FontDescriptor+                       Pdf.Content.FontInfo+                       Pdf.Content.GlyphList+                       Pdf.Content.TexGlyphList+                       Pdf.Content.Encoding.WinAnsi+                       Pdf.Content.Encoding.MacRoman+                       Pdf.Content.Encoding.PdfDoc   other-modules:       Prelude   build-depends:       base >= 4.5 && < 5,                        containers,                        attoparsec >= 0.10,                        bytestring,-                       base16-bytestring,+                       base16-bytestring >= 1,                        text,+                       scientific,+                       vector,                        io-streams,-                       pdf-toolbox-core ==0.0.4.*+                       pdf-toolbox-core ==0.1.*+  if impl(ghc >= 8.10)+    ghc-options:       -Wunused-packages+  default-language:    Haskell2010++test-suite test+  type:                exitcode-stdio-1.0+  hs-source-dirs:      test+                       compat+  main-is:             test.hs+  other-modules:       Test.UnicodeCMap+                       Test.Parser+                       Test.FontDescriptor+                       Prelude+  build-depends:       base,+                       containers,+                       bytestring,+                       attoparsec,+                       io-streams,+                       pdf-toolbox-content,+                       pdf-toolbox-core,+                       hspec+  if impl(ghc >= 8.10)+    ghc-options:       -Wunused-packages+  default-language:    Haskell2010
+ test/Test/FontDescriptor.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE OverloadedStrings #-}++module Test.FontDescriptor+(+  spec,+)+where++import Pdf.Content.FontDescriptor++import Data.Int+import Test.Hspec++spec :: Spec+spec = describe "FontDescriptor" $ do+  testFlagSet++defFD :: FontDescriptor+defFD = FontDescriptor+  { fdFontName = "test"+  , fdFontFamily = Nothing+  , fdFontStretch = Nothing+  , fdFontWeight = Nothing+  , fdFlags = 5+  , fdFontBBox = Nothing+  , fdItalicAngle = -12.5+  , fdDescent = Nothing+  , fdAscent = Nothing+  , fdLeading = Nothing+  , fdCapHeight = Nothing+  , fdXHeight = Nothing+  , fdStemV = Nothing+  , fdStemH = Nothing+  , fdAvgWidth = Nothing+  , fdMaxWidth = Nothing+  , fdMissingWidth = Nothing+  , fdCharSet = Nothing+  }++testFlagSet :: Spec+testFlagSet = describe "flagSet" $ do+  it "should return True when testing FixedPitch on 5" $ do+    let res = flagSet defFD FixedPitch+    res `shouldSatisfy` (==True)++  it "should return False when testing Serif on 5" $ do+    let res = flagSet defFD Serif+    res `shouldSatisfy` (==False)++  it "should return True when testing Symbolic on 5" $ do+    let res = flagSet defFD Symbolic+    res `shouldSatisfy` (==True)++  it "should return False when testing Script on 5" $ do+    let res = flagSet defFD Script+    res `shouldSatisfy` (==False)++  it "should return False when testing ForceBold on 5" $ do+    let res = flagSet defFD ForceBold+    res `shouldSatisfy` (==False)++  it "should return True when testing ForceBold on (2^32)-1" $ do+    let res = flagSet (defFD {fdFlags = (power64 2 32)-1})  ForceBold+    res `shouldSatisfy` (==True)++  it "should return False when testing ForceBold on 0" $ do+    let res = flagSet (defFD {fdFlags = 0}) ForceBold+    res `shouldSatisfy` (==False)++  where+    power64 :: Int64 -> Int64 -> Int64+    power64 _ 0 = 1+    power64 b e = b * power64 b (e-1)
+ test/Test/Parser.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE OverloadedStrings #-}++module Test.Parser+(+  spec,+)+where++import Pdf.Core+import Pdf.Core.Exception+import Pdf.Content.Parser+import Pdf.Content.Ops++import qualified Data.Attoparsec.ByteString as Parser+import qualified System.IO.Streams as Streams+import Test.Hspec++spec :: Spec+spec = describe "Parser" $ do+  parseContentSpec+  readNextOperatorSpec++parseContentSpec :: Spec+parseContentSpec = describe "parseContent" $ do+  it "should parse an object" $ do+    let input = "(hello)"+        res = Parser.parseOnly parseContent input+    res `shouldBe` Right (Just $ Obj $ String "hello")++  it "should parse an operator" $ do+    let input = "T*"+        res = Parser.parseOnly parseContent input+    res `shouldBe` Right (Just $ Op Op_T_star)++  it "should return Nothing when input is empty" $ do+    let input = ""+        res = Parser.parseOnly parseContent input+    res `shouldBe` Right Nothing++  it "should ignore comments at the beginning" $ do+    let input = "% comments\nTj"+        res = Parser.parseOnly parseContent input+    res `shouldBe` Right (Just $ Op Op_Tj)++  it "should ignore multiple lines of comments at the beginning" $ do+    let input = "% comments\nTj"+        res = Parser.parseOnly parseContent input+    res `shouldBe` Right (Just $ Op Op_Tj)++readNextOperatorSpec :: Spec+readNextOperatorSpec = describe "readNextOperator" $ do+  it "should return Nothing when there is no input" $ do+    let input = []+    is <- Streams.fromList input+    next <- readNextOperator is+    next `shouldBe` Nothing++  it "should collect all objects until an operator" $ do+    let input = [Obj o1, Obj o2, Op op]+        o1 = String "o1"+        o2 = String "o2"+        op = Op_Tj+    is <- Streams.fromList input+    next <- readNextOperator is+    next `shouldBe` Just (op, [o1, o2])++  it "should throw when there is no operator after arguments" $ do+    let input = [Obj o1, Obj o2]+        o1 = String "o1"+        o2 = String "o2"+    is <- Streams.fromList input+    readNextOperator is+      `shouldThrow` \Corrupted{} -> True
+ test/Test/UnicodeCMap.hs view
@@ -0,0 +1,164 @@+{-# LANGUAGE OverloadedStrings #-}++module Test.UnicodeCMap+(+  spec,+)+where++import Pdf.Content.UnicodeCMap++import Data.Either+import qualified Data.List as List+import qualified Data.Map as Map+import qualified Data.ByteString as ByteString+import Test.Hspec++spec :: Spec+spec = describe "UnicodeCMap" $ do+  parseUnicodeCMapSpec+  unicodeCMapDecodeGlyphSpec+  unicodeCMapNextGlyphSpec++parseUnicodeCMapSpec :: Spec+parseUnicodeCMapSpec = describe "parseUnicodeCMap" $ do+  it "should parse trivial cmap" $ do+    let input = ByteString.concat+          [ "0 begincodespacerange\n"+          , "0 beginbfchar\n"+          , "0 beginbfrange\n"+          ]+        res = parseUnicodeCMap input+    res `shouldSatisfy` isRight++  it "should parse codespace ranges" $ do+    let input = ByteString.concat+          [ "1 begincodespacerange\n"+          , "<0000> <FFFF>\n"+          , "0 beginbfchar\n"+          , "0 beginbfrange\n"+          ]+        res = parseUnicodeCMap input+    fmap unicodeCMapCodeRanges res `shouldBe`+      Right [ (ByteString.pack [0, 0], ByteString.pack [255, 255])]++  it "should parse chars" $ do+    let input = ByteString.concat+          [ "0 begincodespacerange\n"+          , "1 beginbfchar\n"+          , "<3A51> <D840DC3E>\n"+          , "0 beginbfrange\n"+          ]+        res = parseUnicodeCMap input+    fmap unicodeCMapChars res `shouldBe`+      Right (Map.fromList [(14929,"\131134")])++  it "should parse multiple chars" $ do+    let input = ByteString.concat+          [ "0 begincodespacerange\n"+          , "1 beginbfchar\n"+          , "<25> <00660066>\n"+          , "endbfchar\n"+          , "1 beginbfchar\n"+          , "<26> <0066006c>\n"+          , "endbfchar\n"+          , "0 beginbfrange\n"+          ]+        res = parseUnicodeCMap input+    fmap unicodeCMapChars res `shouldBe`+      Right (Map.fromList [(37,"ff"), (38, "fl")])++  it "should parse ranges" $ do+    let input = ByteString.concat+          [ "0 begincodespacerange\n"+          , "0 beginbfchar\n"+          , "1 beginbfrange\n"+          , "<0000> <005E> <0020>\n"+          ]+        res = parseUnicodeCMap input+    fmap unicodeCMapRanges res `shouldBe`+      Right [(0,94,' ')]++  it "should parse multiple ranges" $ do+    let input = ByteString.concat+          [ "0 begincodespacerange\n"+          , "0 beginbfchar\n"+          , "1 beginbfrange\n"+          , "<21> <21> <0045>\n"+          , "endbfrange\n"+          , "1 beginbfrange\n"+          , "<22> <22> <0073>\n"+          , "endbfrange\n"+          ]+        res = parseUnicodeCMap input+    fmap (List.sort . unicodeCMapRanges) res `shouldBe`+      Right (List.sort [(33,33,'E'), (34, 34, 's')])++  it "should parse array ranges into char map" $ do+    let input = ByteString.concat+          [ "0 begincodespacerange\n"+          , "0 beginbfchar\n"+          , "1 beginbfrange\n"+          , "<005F> <0061> [<00660066> <00660069> <00660066006C>]\n"+          ]+        res = parseUnicodeCMap input+    fmap unicodeCMapChars res `shouldBe`+      Right (Map.fromList [(95,"ff"),(96,"fi"),(97,"ffl")])++  it "should allow spaces in hex numbers" $ do+    let input = ByteString.concat+          [ "1 begincodespacerange\n"+          , "<0000> <FF FF>\n"+          , "0 beginbfchar\n"+          , "0 beginbfrange\n"+          ]+        res = parseUnicodeCMap input+    fmap unicodeCMapCodeRanges res `shouldBe`+      Right [ (ByteString.pack [0, 0], ByteString.pack [255, 255])]++unicodeCMapDecodeGlyphSpec :: Spec+unicodeCMapDecodeGlyphSpec = describe "unicodeCMapDecodeGlyph" $ do+  it "should take glyph from char map if possible" $ do+    let cmap = UnicodeCMap [] charMap []+        charMap = Map.fromList [(42, "hello")]++    let res = unicodeCMapDecodeGlyph cmap 42+    res `shouldBe` Just "hello"++  it "should be able to decode the first glyph from a range" $ do+    let cmap = UnicodeCMap [] mempty [(10, 15, '1')]++    let res = unicodeCMapDecodeGlyph cmap 10+    res `shouldBe` Just "1"++  it "should be able to decode the last glyph from a range" $ do+    let cmap = UnicodeCMap [] mempty [(10, 15, '1')]++    let res = unicodeCMapDecodeGlyph cmap 15+    res `shouldBe` Just "6"++  it "should be able to decode a glyph from a middle of a range" $ do+    let cmap = UnicodeCMap [] mempty [(10, 15, '1')]++    let res = unicodeCMapDecodeGlyph cmap 11+    res `shouldBe` Just "2"++  it "should not decode a glyph before a range" $ do+    let cmap = UnicodeCMap [] mempty [(10, 15, '1')]++    let res = unicodeCMapDecodeGlyph cmap 9+    res `shouldBe` Nothing++  it "should not decode a glyph after a range" $ do+    let cmap = UnicodeCMap [] mempty [(10, 15, '1')]++    let res = unicodeCMapDecodeGlyph cmap 16+    res `shouldBe` Nothing++unicodeCMapNextGlyphSpec :: Spec+unicodeCMapNextGlyphSpec = describe "unicodeCMapNextGlyph" $ do+  it "correctly handles multibyte ranges" $ do+    let cmap = UnicodeCMap [("\0\0", "\1\1")] mempty []+    let Just (code, rest) = unicodeCMapNextGlyph cmap "\1\0rest"+    rest `shouldBe` rest+    code `shouldBe` 256
+ test/test.hs view
@@ -0,0 +1,18 @@++module Main+(+  main+)+where++import qualified Test.UnicodeCMap+import qualified Test.Parser+import qualified Test.FontDescriptor++import Test.Hspec++main :: IO ()+main = hspec $ do+  Test.UnicodeCMap.spec+  Test.Parser.spec+  Test.FontDescriptor.spec